// himdformat command using libusal (included in cdrkit package)
//
// use devicename on linux (/dev/sgX) or driveletter on windows (without ":")

#include <stdio.h>
#include <string.h>

#include <schily.h>             // link librols and libusal
#include <usal/usalcmd.h>       // (librols is statically linked in libusal.dll on windows)
#include <usal/scsitransp.h>

#define SONY_SPECIFIC_COMMAND 0xC2
#define HIMD_FORMAT 3

#define MAX_DEVICE_LEN 256
#define SCSI_TIMEOUT 20

int main(int argc, char ** argv)
{
	SCSI * usalp = NULL;
	char command[12];
	int err = 0;
	int ret;
	char dev[MAX_DEVICE_LEN];
	char errstr[80];
	char cmdname[] = "himd_format";
	struct usal_cmd * scmd;

	if(argc < 2)
	{
	    fputs("Please specify the path to the scsi device\n",stderr);
	    return -1;
    }

	memset(dev, 0, MAX_DEVICE_LEN);
    memcpy(dev, argv[1], sizeof(argv[1]));

	// open scsi driver
	usalp = usal_open(dev, errstr, sizeof(errstr), 0, NULL);
	if(!usalp)
	{
		fputs("Cannot open scsi driver", stderr);
		return -2;
	}

	if(usalp->addr.scsibus == -2 && usalp->addr.target == -2) // scsi device not found, search by devicename
	{                                                         // this is nessessary on windows when driveletter is used
		ret = usal__open(usalp, dev);
		if(!ret)
		{
			fprintf(stderr, "Cannot open SCSI device for %d\n", dev);
			err = -3;
			goto clean;
		}
	}

	usal_settimeout(usalp, SCSI_TIMEOUT);
	usalp->cmdname = cmdname;

// preparing scsi command
	scmd = usalp->scmd;
	memset(scmd, 0, sizeof(struct usal_cmd));
	scmd->addr = (caddr_t)0;
	scmd->size = 0;
    scmd->cdb_len = sizeof(command);
    scmd->sense_len = CCS_SENSE_LEN;
	scmd->flags = SCG_DISRE_ENA;

	memset(command, 0, 12);
	command[0] = SONY_SPECIFIC_COMMAND;
	command[4] = HIMD_FORMAT;
	memcpy(scmd->cdb.cmd_cdb, command, 12);

// sending command
	if(usal_cmd(usalp) < 0)
	{
		fputs("cannot send scsi command", stderr);
		err = -4;
		goto clean;
	}
	else
		fprintf(stderr, "scsi command successfully sent");

clean:
	usal__close(usalp);

	return err;
}
