X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=changer-src%2Fchg-scsi.c;h=221f47669ccc7b18f2a0bdc60f2a2aca6954530e;hb=14de11ecc99c33706c74b950d2d00e278abe9375;hp=43bf315bf04e40b2687e364e2ebf73e15f4dbf38;hpb=3ab887b9bc819a846c75dd7f2ee5d41fac22b19f;p=debian%2Famanda diff --git a/changer-src/chg-scsi.c b/changer-src/chg-scsi.c index 43bf315..221f476 100644 --- a/changer-src/chg-scsi.c +++ b/changer-src/chg-scsi.c @@ -1,6 +1,4 @@ -#ifndef lint -static char rcsid[] = "$Id: chg-scsi.c,v 1.6.2.22.2.7.2.9 2003/07/05 16:59:01 ant Exp $"; -#endif +static char rcsid[] = "$Id: chg-scsi.c,v 1.52 2006/07/25 18:18:46 martinea Exp $"; /* * * @@ -12,7 +10,7 @@ static char rcsid[] = "$Id: chg-scsi.c,v 1.6.2.22.2.7.2.9 2003/07/05 16:59:01 an * The device dependent part is handled by scsi-changer-driver.c * The SCSI OS interface is handled by scsi-ostype.c * - * Original copyrigths: + * Original copyrights: * * This program provides a driver to control generic * SCSI changers, no matter what platform. The host/OS @@ -67,19 +65,10 @@ static char rcsid[] = "$Id: chg-scsi.c,v 1.6.2.22.2.7.2.9 2003/07/05 16:59:01 an #include "config.h" - - #include "amanda.h" - -#ifdef HAVE_DMALLOC_H -#include -#endif - - #include "conffile.h" #include "libscsi.h" #include "scsi-defs.h" -#include "tapeio.h" char *tapestatfile = NULL; FILE *debug_file = NULL; @@ -98,12 +87,10 @@ extern ElementInfo_T *pMTE; /*Medium Transport Element */ extern ElementInfo_T *pSTE; /*Storage Element */ extern ElementInfo_T *pIEE; /*Import Export Element */ extern ElementInfo_T *pDTE; /*Data Transfer Element */ -extern int MTE; /*Counter for the above element types */ -extern int STE; -extern int IEE; -extern int DTE; - -changer_t chg; +extern size_t MTE; /*Counter for the above element types */ +extern size_t STE; +extern size_t IEE; +extern size_t DTE; int do_inventory = 0; /* Set if load/unload functions thinks an inventory should be done */ int clean_slot = -1; @@ -116,167 +103,190 @@ typedef enum{ typedef struct { char *word; - int token; + token_t token; } tokentable_t; -tokentable_t t_table[]={ - { "number_configs",NUMDRIVE}, - { "autoinv", AUTOINV}, - { "eject",EJECT}, - { "sleep",SLEEP}, - { "cleanmax",CLEANMAX}, - { "config",DRIVE}, - { "startuse",START}, - { "enduse",END}, - { "cleancart",CLEAN}, - { "dev",DEVICE}, - { "statfile",STATFILE}, - { "cleanfile",CLEANFILE}, - { "drivenum",DRIVENUM}, - { "changerdev",CHANGERDEV}, - { "usagecount",USAGECOUNT}, - { "scsitapedev", SCSITAPEDEV}, - { "tapestatus", TAPESTATFILE}, - { "labelfile", LABELFILE}, - { "changerident" , CHANGERIDENT}, - { "tapeident", TAPEIDENT}, - { "emubarcode", EMUBARCODE}, - { "havebarcode", HAVEBARCODE}, - { "debuglevel", DEBUGLEVEL}, - { NULL,-1 } +tokentable_t t_table[] = { + { "number_configs", NUMDRIVE}, + { "autoinv", AUTOINV}, + { "eject", EJECT}, + { "sleep", SLEEP}, + { "cleanmax", CLEANMAX}, + { "config", DRIVE}, + { "startuse", START}, + { "enduse", END}, + { "cleancart", CLEAN}, + { "dev", DEVICE}, + { "statfile", STATFILE}, + { "cleanfile", CLEANFILE}, + { "drivenum", DRIVENUM}, + { "changerdev", CHANGERDEV}, + { "usagecount", USAGECOUNT}, + { "scsitapedev", SCSITAPEDEV}, + { "tapestatus", TAPESTATFILE}, + { "labelfile", LABELFILE}, + { "changerident", CHANGERIDENT}, + { "tapeident", TAPEIDENT}, + { "emubarcode", EMUBARCODE}, + { "havebarcode", HAVEBARCODE}, + { "debuglevel", DEBUGLEVEL}, + { NULL, -1 } }; - -void init_changer_struct(changer_t *chg,int number_of_config) - /* Initialize datasructures with default values */ +changer_t *changer; +int ask_clean(char *tapedev); +int get_current_slot(char *count_file); +int get_relative_target(int fd, int nslots, char *parameter, + int param_index, int loaded, char *slot_file, + int slot_offset, int maxslot); +int is_positive_number(char *tmp); +int MapBarCode(char *labelfile, MBC_T *result); +int read_config(char *configfile, changer_t *chg); +void clean_tape(int fd, char *tapedev, char *cnt_file, int drivenum, + int cleancart, int maxclean, char *usagetime); +void dump_changer_struct(changer_t *chg); +void free_changer_struct(changer_t **chg); +void init_changer_struct(changer_t *chg, int number_of_config); +void parse_line(char *linebuffer, int *token,char **value); +void put_current_slot(char *count_file, int slot); +void usage(char *argv[]); + +int main(int argc, char *argv[]); + + +/* Initialize data structures with default values */ +void +init_changer_struct( + changer_t *chg, + int number_of_config) { int i; + memset(chg, 0, SIZEOF(*chg)); chg->number_of_configs = number_of_config; chg->eject = 1; - chg->sleep = 0; - chg->autoinv = 0; - chg->cleanmax = 0; - chg->havebarcode = 0; - chg->emubarcode = 0; - chg->device = NULL; - chg->labelfile = NULL; - chg->debuglevel = NULL; - chg->conf = malloc(sizeof(config_t)*number_of_config); - if (chg->conf != NULL){ - for (i=0; i < number_of_config; i++){ - chg->conf[i].drivenum = 0; - chg->conf[i].start = -1; - chg->conf[i].end = -1; - chg->conf[i].cleanslot = -1; - chg->conf[i].device = NULL; - chg->conf[i].slotfile = NULL; - chg->conf[i].cleanfile = NULL; - chg->conf[i].timefile = NULL; - chg->conf[i].scsitapedev = NULL; - chg->conf[i].tapestatfile = NULL; - chg->conf[i].changerident = NULL; - chg->conf[i].tapeident = NULL; - } - } else { - fprintf(stderr,"init_changer_struct malloc failed\n"); + chg->conf = alloc(SIZEOF(config_t) * (size_t)number_of_config); + for (i=0; i < number_of_config; i++){ + chg->conf[i].drivenum = 0; + chg->conf[i].start = -1; + chg->conf[i].end = -1; + chg->conf[i].cleanslot = -1; + chg->conf[i].device = NULL; + chg->conf[i].slotfile = NULL; + chg->conf[i].cleanfile = NULL; + chg->conf[i].timefile = NULL; + chg->conf[i].scsitapedev = NULL; + chg->conf[i].tapestatfile = NULL; + chg->conf[i].changerident = NULL; + chg->conf[i].tapeident = NULL; } } -void dump_changer_struct(changer_t chg) - /* Dump of information for debug */ +/* Dump of information for debug */ +void +dump_changer_struct( + changer_t *chg) { int i; - dbprintf(("Number of configurations: %d\n",chg.number_of_configs)); - dbprintf(("Tapes need eject: %s\n",(chg.eject>0?"Yes":"No"))); - dbprintf (("\traw: %d\n",chg.eject)); - dbprintf(("Inv. auto update: %s\n",(chg.autoinv>0?"Yes":"No"))); - dbprintf (("\traw: %d\n",chg.autoinv)); - dbprintf(("barcode reader : %s\n",(chg.havebarcode>0?"Yes":"No"))); - dbprintf (("\traw: %d\n",chg.havebarcode)); - dbprintf(("Emulate Barcode : %s\n",(chg.emubarcode>0?"Yes":"No"))); - dbprintf (("\traw: %d\n",chg.emubarcode)); - if (chg.debuglevel != NULL) - dbprintf(("debug level : %s\n", chg.debuglevel)); - dbprintf(("Tapes need sleep: %d seconds\n",chg.sleep)); - dbprintf(("Cleancycles : %d\n",chg.cleanmax)); - dbprintf(("Changerdevice : %s\n",chg.device)); - if (chg.labelfile != NULL) - dbprintf(("Labelfile : %s\n", chg.labelfile)); - for (i=0; inumber_of_configs); + dbprintf(_("Tapes need eject: %s\n"), (chg->eject>0 ? _("Yes") : _("No"))); + dbprintf (_("\traw: %d\n"),chg->eject); + dbprintf(_("Inv. auto update: %s\n"), (chg->autoinv>0 ? _("Yes") : _("No"))); + dbprintf (_("\traw: %d\n"),chg->autoinv); + dbprintf(_("barcode reader : %s\n"), (chg->havebarcode>0 ? _("Yes") : _("No"))); + dbprintf (_("\traw: %d\n"),chg->havebarcode); + dbprintf(_("Emulate Barcode : %s\n"), (chg->emubarcode>0 ? _("Yes") : _("No"))); + dbprintf (_("\traw: %d\n"),chg->emubarcode); + if (chg->debuglevel != NULL) + dbprintf(_("debug level : %s\n"), chg->debuglevel); + dbprintf(_("Tapes need sleep: %ld seconds\n"), (long int)chg->sleep); + dbprintf(_("Clean cycles : %d\n"), chg->cleanmax); + dbprintf(_("Changer device : %s\n"), chg->device); + if (chg->labelfile != NULL) + dbprintf(_("Label file : %s\n"), chg->labelfile); + for (i=0; inumber_of_configs; i++){ + dbprintf(_("Tape config Nr: %d\n"), i); + dbprintf(_(" Drive number : %d\n"), chg->conf[i].drivenum); + dbprintf(_(" Start slot : %d\n"), chg->conf[i].start); + dbprintf(_(" End slot : %d\n"), chg->conf[i].end); + dbprintf(_(" Clean slot : %d\n"), chg->conf[i].cleanslot); + + if (chg->conf[i].device != NULL) + dbprintf(_(" Device name : %s\n"), chg->conf[i].device); else - dbprintf((" Devicename : none\n")); + dbprintf(_(" Device name : none\n")); - if (chg.conf[i].changerident != NULL) - dbprintf((" changerident : %s\n",chg.conf[i].changerident)); + if (chg->conf[i].changerident != NULL) + dbprintf(_(" changer ident : %s\n"), chg->conf[i].changerident); else - dbprintf((" changerident : none\n")); + dbprintf(_(" changer ident : none\n")); - if (chg.conf[i].scsitapedev != NULL) - dbprintf((" SCSITapedev : %s\n",chg.conf[i].scsitapedev)); + if (chg->conf[i].scsitapedev != NULL) + dbprintf(_(" SCSI Tape dev : %s\n"), chg->conf[i].scsitapedev); else - dbprintf((" SCSITapedev : none\n")); + dbprintf(_(" SCSI Tape dev : none\n")); - if (chg.conf[i].tapeident != NULL) - dbprintf((" tapeident : %s\n",chg.conf[i].tapeident)); + if (chg->conf[i].tapeident != NULL) + dbprintf(_(" tape ident : %s\n"), chg->conf[i].tapeident); else - dbprintf((" tapeident : none\n")); + dbprintf(_(" tape ident : none\n")); - if (chg.conf[i].tapestatfile != NULL) - dbprintf((" statfile : %s\n", chg.conf[i].tapestatfile)); + if (chg->conf[i].tapestatfile != NULL) + dbprintf(_(" stat file : %s\n"), chg->conf[i].tapestatfile); else - dbprintf((" statfile : none\n")); + dbprintf(_(" stat file : none\n")); - if (chg.conf[i].slotfile != NULL) - dbprintf((" Slotfile : %s\n",chg.conf[i].slotfile)); + if (chg->conf[i].slotfile != NULL) + dbprintf(_(" Slot file : %s\n"), chg->conf[i].slotfile); else - dbprintf((" Slotfile : none\n")); + dbprintf(_(" Slot file : none\n")); - if (chg.conf[i].cleanfile != NULL) - dbprintf((" Cleanfile : %s\n",chg.conf[i].cleanfile)); + if (chg->conf[i].cleanfile != NULL) + dbprintf(_(" Clean file : %s\n"), chg->conf[i].cleanfile); else - dbprintf((" Cleanfile : none\n")); + dbprintf(_(" Clean file : none\n")); - if (chg.conf[i].timefile != NULL) - dbprintf((" Usagecount : %s\n",chg.conf[i].timefile)); + if (chg->conf[i].timefile != NULL) + dbprintf(_(" Usage count : %s\n"), chg->conf[i].timefile); else - dbprintf((" Usagecount : none\n")); + dbprintf(_(" Usage count : none\n")); } } -void free_changer_struct(changer_t *chg) - /* Free all allocated memory */ +/* Free all allocated memory */ +void +free_changer_struct( + changer_t **changer) { + changer_t *chg; int i; + chg = *changer; if (chg->device != NULL) - free(chg->device); - for (i=0; inumber_of_configs; i++){ + amfree(chg->device); + for (i = 0; i < chg->number_of_configs; i++){ if (chg->conf[i].device != NULL) - free(chg->conf[i].device); + amfree(chg->conf[i].device); if (chg->conf[i].slotfile != NULL) - free(chg->conf[i].slotfile); + amfree(chg->conf[i].slotfile); if (chg->conf[i].cleanfile != NULL) - free(chg->conf[i].cleanfile); + amfree(chg->conf[i].cleanfile); if (chg->conf[i].timefile != NULL) - free(chg->conf[i].timefile); + amfree(chg->conf[i].timefile); } if (chg->conf != NULL) - free(chg->conf); + amfree(chg->conf); chg->conf = NULL; chg->device = NULL; + amfree(*changer); } -void parse_line(char *linebuffer,int *token,char **value) - /* This function parses a line, and returns a token and value */ +/* This function parses a line, and returns a token and value */ +void +parse_line( + char *linebuffer, + int *token, + char **value) { char *tok; int i; @@ -299,17 +309,19 @@ void parse_line(char *linebuffer,int *token,char **value) } tok=strtok(NULL," \t\n"); } - return; } -int read_config(char *configfile, changer_t *chg) - /* This function reads the specified configfile and fills the structure */ +/* This function reads the specified configfile and fills the structure */ +int +read_config( + char *configfile, + changer_t *chg) { int numconf; FILE *file; int init_flag = 0; int drivenum=0; - char *linebuffer = NULL; + char *linebuffer; int token; char *value; char *p; @@ -317,28 +329,38 @@ int read_config(char *configfile, changer_t *chg) numconf = 1; /* At least one configuration is assumed */ /* If there are more, it should be the first entry in the configurationfile */ - - if (NULL==(file=fopen(configfile,"r"))){ + assert(chg != NULL); + if ((file=fopen(configfile,"r")) == NULL) { return (-1); } - amfree(linebuffer); - while ((NULL!=(linebuffer=agets(file)))) { - parse_line(linebuffer,&token,&value); + while ((NULL != (linebuffer = agets(file)))) { + if (linebuffer[0] == '\0') { + amfree(linebuffer); + continue; + } + parse_line(linebuffer, &token, &value); if (token != -1){ - if (0==init_flag) { + if (value == NULL) + value = "0"; + + if (init_flag == 0) { if (token != NUMDRIVE){ - init_changer_struct(chg,numconf); + init_changer_struct(chg, numconf); } else { numconf = atoi(value); - init_changer_struct(chg,numconf); + if (numconf < 1 || numconf > 100) { + g_fprintf(stderr,_("numconf %d is bad\n"), numconf); + numconf = 1; + } + init_changer_struct(chg, numconf); } init_flag=1; } - switch (token){ + switch (token) { case NUMDRIVE: if (atoi(value) != numconf) - fprintf(stderr,"Error: number_drives at wrong place, should be "\ - "first in file\n"); + g_fprintf(stderr,_("Error: number_drives at wrong place, should be " + "first in file\n")); break; case AUTOINV: chg->autoinv = 1; @@ -347,6 +369,11 @@ int read_config(char *configfile, changer_t *chg) chg->emubarcode = 1; break; case DEBUGLEVEL: + if (chg->debuglevel != NULL) { + g_fprintf(stderr,_("Error: debuglevel is specified twice " + "(%s then %s).\n"), chg->debuglevel, value); + amfree(chg->debuglevel); + } chg->debuglevel = stralloc(value); break; case EJECT: @@ -356,12 +383,22 @@ int read_config(char *configfile, changer_t *chg) chg->havebarcode = atoi(value); break; case SLEEP: - chg->sleep = atoi(value); + chg->sleep = (unsigned)atoi(value); break; case LABELFILE: + if (chg->labelfile != NULL) { + g_fprintf(stderr,_("Error: labelfile is specified twice " + "(%s then %s).\n"), chg->labelfile, value); + amfree(chg->labelfile); + } chg->labelfile = stralloc(value); break; case CHANGERDEV: + if (chg->device != NULL) { + g_fprintf(stderr,_("Error: changerdev is specified twice " + "(%s then %s).\n"), chg->device, value); + amfree(chg->device); + } chg->device = stralloc(value); break; case SCSITAPEDEV: @@ -372,15 +409,21 @@ int read_config(char *configfile, changer_t *chg) break; case CHANGERIDENT: chg->conf[drivenum].changerident = stralloc(value); - p = chg->conf[drivenum].changerident; - while (*p != '\0') - { - if (*p == '_') + if (drivenum < 0 || drivenum > 100) { + g_fprintf(stderr,_("drivenum %d is bad\n"), drivenum); + drivenum = 0; + } + if (strcmp(chg->conf[drivenum].changerident,"generic_changer") != 0) { + p = chg->conf[drivenum].changerident; + while (*p != '\0') { - *p=' '; + if (*p == '_') + { + *p=' '; + } + p++; } - p++; - } + } break; case TAPEIDENT: chg->conf[drivenum].tapeident = stralloc(value); @@ -390,76 +433,80 @@ int read_config(char *configfile, changer_t *chg) break; case DRIVE: drivenum = atoi(value); - if(drivenum >= numconf){ - fprintf(stderr,"Error: drive must be less than number_drives\n"); + if (drivenum < 0) { + g_fprintf(stderr,_("Error: drive must be >= 0\n")); + drivenum = 0; + } else if (drivenum >= numconf) { + g_fprintf(stderr,_("Error: drive must be less than number_drives\n")); + drivenum = numconf; } break; case DRIVENUM: if (drivenum < numconf){ chg->conf[drivenum].drivenum = atoi(value); } else { - fprintf(stderr,"Error: drive is not less than number_drives"\ - " drivenum ignored\n"); + g_fprintf(stderr,_("Error: drive is not less than number_drives" + " drivenum ignored\n")); } break; case START: if (drivenum < numconf){ chg->conf[drivenum].start = atoi(value); } else { - fprintf(stderr,"Error: drive is not less than number_drives"\ - " startuse ignored\n"); + g_fprintf(stderr,_("Error: drive is not less than number_drives" + " startuse ignored\n")); } break; case END: if (drivenum < numconf){ chg->conf[drivenum].end = atoi(value); } else { - fprintf(stderr,"Error: drive is not less than number_drives"\ - " enduse ignored\n"); + g_fprintf(stderr,_("Error: drive is not less than number_drives" + " enduse ignored\n")); } break; case CLEAN: if (drivenum < numconf){ chg->conf[drivenum].cleanslot = atoi(value); } else { - fprintf(stderr,"Error: drive is not less than number_drives"\ - " cleanslot ignored\n"); + g_fprintf(stderr,_("Error: drive is not less than number_drives" + " cleanslot ignored\n")); } break; case DEVICE: if (drivenum < numconf){ chg->conf[drivenum].device = stralloc(value); } else { - fprintf(stderr,"Error: drive is not less than number_drives"\ - " device ignored\n"); + g_fprintf(stderr,_("Error: drive is not less than number_drives" + " device ignored\n")); } break; case STATFILE: if (drivenum < numconf){ chg->conf[drivenum].slotfile = stralloc(value); } else { - fprintf(stderr,"Error: drive is not less than number_drives"\ - " slotfile ignored\n"); + g_fprintf(stderr,_("Error: drive is not less than number_drives" + " slotfile ignored\n")); } break; case CLEANFILE: if (drivenum < numconf){ chg->conf[drivenum].cleanfile = stralloc(value); } else { - fprintf(stderr,"Error: drive is not less than number_drives"\ - " cleanfile ignored\n"); + g_fprintf(stderr,_("Error: drive is not less than number_drives" + " cleanfile ignored\n")); } break; case USAGECOUNT: if (drivenum < numconf){ chg->conf[drivenum].timefile = stralloc(value); } else { - fprintf(stderr,"Error: drive is not less than number_drives"\ - " usagecount ignored\n"); + g_fprintf(stderr,_("Error: drive is not less than number_drives" + " usagecount ignored\n")); } break; default: - fprintf(stderr,"Error: Unknown token\n"); + g_fprintf(stderr,_("Error: Unknown token\n")); break; } } @@ -477,16 +524,19 @@ int read_config(char *configfile, changer_t *chg) * we use a file to store the current slot. It is not ideal * but it gets the job done */ -int get_current_slot(char *count_file) +int +get_current_slot( + char *count_file) { FILE *inf; - int retval; + int retval = -1; int ret; /* return value for the fscanf function */ if ((inf=fopen(count_file,"r")) == NULL) { - fprintf(stderr, "%s: unable to open (%s)\n", + g_fprintf(stderr, _("%s: unable to open (%s)\n"), get_pname(), count_file); exit(2); } + ret = fscanf(inf,"%d",&retval); fclose(inf); @@ -499,19 +549,28 @@ int get_current_slot(char *count_file) retval = -1; } + if (retval < 0 || retval > 10000) { + retval = -1; + } return retval; } -void put_current_slot(char *count_file,int slot) +void +put_current_slot( + char *count_file, + int slot) { FILE *inf; + if (!count_file) + return; + if ((inf=fopen(count_file,"w")) == NULL) { - fprintf(stderr, "%s: unable to open current slot file (%s)\n", + g_fprintf(stderr, _("%s: unable to open current slot file (%s)\n"), get_pname(), count_file); exit(2); } - fprintf(inf, "%d\n", slot); + g_fprintf(inf, "%d\n", slot); fclose(inf); } @@ -528,21 +587,24 @@ void put_current_slot(char *count_file,int slot) * The passed struct MBC_T will hold the found entry in the DB */ -int MapBarCode(char *labelfile, MBC_T *result) +int +MapBarCode( + char *labelfile, + MBC_T *result) { FILE *fp; int version; LabelV2_T *plabelv2; - int unusedpos = 0; + long unusedpos= 0; int unusedrec = 0; - int pos = 0; - int record = 0; - int volseen = 0; - int loop = 1; - int rsize = 0; - - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : Parameter\n"); - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"labelfile -> %s, vol -> %s, barcode -> %s, action -> %c, slot -> %d, from -> %d\n", + int record = 0; + int loop = 1; + size_t rsize; + long pos; + int rc; + + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : Parameter\n")); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("labelfile -> %s, vol -> %s, barcode -> %s, action -> %c, slot -> %d, from -> %d\n"), labelfile, result->data.voltag, result->data.barcode, @@ -552,51 +614,59 @@ int MapBarCode(char *labelfile, MBC_T *result) if (labelfile == NULL) { - DebugPrint(DEBUG_ERROR,SECTION_MAP_BARCODE,"Got empty labelfile (NULL)\n"); - ChgExit("MapBarCode", "MapBarCode name of labelfile is not set\n",FATAL); + DebugPrint(DEBUG_ERROR,SECTION_MAP_BARCODE,_("Got empty labelfile (NULL)\n")); + ChgExit("MapBarCode", _("MapBarCode name of labelfile is not set\n"),FATAL); + /*NOTREACHED*/ } if (access(labelfile, F_OK) == -1) { - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE, "MapBarCode : creating %s", labelfile); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE, _("MapBarCode : creating %s"), labelfile); if ((fp = fopen(labelfile, "w+")) == NULL) { - DebugPrint(DEBUG_ERROR,SECTION_MAP_BARCODE," failed\n"); - ChgExit("MapBarCode", "MapBarCode, creating labelfile failed\n", FATAL); + DebugPrint(DEBUG_ERROR,SECTION_MAP_BARCODE,_(" failed\n")); + ChgExit("MapBarCode", _("MapBarCode, creating labelfile failed\n"), FATAL); + /*NOTREACHED*/ } - fprintf(fp,":%d:", LABEL_DB_VERSION); + g_fprintf(fp,":%d:", LABEL_DB_VERSION); fclose(fp); } if ((fp = fopen(labelfile, "r+")) == NULL) { - DebugPrint(DEBUG_ERROR,SECTION_MAP_BARCODE,"MapBarCode : failed to open %s\n", labelfile); - ChgExit("MapBarCode", "MapBarCode, opening labelfile for read/write failed\n", FATAL); + DebugPrint(DEBUG_ERROR,SECTION_MAP_BARCODE,_("MapBarCode : failed to open %s\n"), labelfile); + ChgExit("MapBarCode", _("MapBarCode, opening labelfile for read/write failed\n"), FATAL); + /*NOTREACHED*/ } - fscanf(fp,":%d:", &version); - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : DB version %d\n", version); + if (fscanf(fp,":%d:", &version) != 1) { + ChgExit("MapBarCode", _("MapBarCode, DB Version unreadable.\n"), FATAL); + /*NOTREACHED*/ + } + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : DB version %d\n"), version); pos = ftell(fp); if (version != LABEL_DB_VERSION) { - ChgExit("MapBarCode", "MapBarCode, DB Version does not match\n", FATAL); + ChgExit("MapBarCode", _("MapBarCode, DB Version does not match\n"), FATAL); + /*NOTREACHED*/ } - if (( plabelv2 = (LabelV2_T *)malloc(sizeof(LabelV2_T))) == NULL) + if (( plabelv2 = (LabelV2_T *)alloc(SIZEOF(LabelV2_T))) == NULL) { - DebugPrint(DEBUG_ERROR,SECTION_MAP_BARCODE,"MapBarCode : malloc failed\n"); - ChgExit("MapBarCode", "MapBarCode malloc failed\n", FATAL); + DebugPrint(DEBUG_ERROR,SECTION_MAP_BARCODE,_("MapBarCode : alloc failed\n")); + ChgExit("MapBarCode", _("MapBarCode alloc failed\n"), FATAL); + /*NOTREACHED*/ } - memset(plabelv2, 0, sizeof(LabelV2_T)); + memset(plabelv2, 0, SIZEOF(LabelV2_T)); while(feof(fp) == 0 && loop == 1) { - rsize = fread(plabelv2, 1, sizeof(LabelV2_T), fp); - if (rsize == sizeof(LabelV2_T)) + rsize = fread(plabelv2, 1, SIZEOF(LabelV2_T), fp); + if (rsize == SIZEOF(LabelV2_T)) { record++; - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : (%d) VolTag \"%s\", BarCode %s, inuse %d, slot %d, from %d, loadcount %d\n",record, + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : (%d) VolTag \"%s\", BarCode %s, inuse %d, slot %d, from %d, loadcount %d\n"),record, plabelv2->voltag, plabelv2->barcode, plabelv2->valid, @@ -609,7 +679,7 @@ int MapBarCode(char *labelfile, MBC_T *result) * Only dump the info */ case BARCODE_DUMP: - printf("Slot -> %d, from -> %d, valid -> %d, Tag -> %s, Barcode -> %s, Loadcount %d\n", + g_printf(_("Slot -> %d, from -> %d, valid -> %d, Tag -> %s, Barcode -> %s, Loadcount %u\n"), plabelv2->slot, plabelv2->from, plabelv2->valid, @@ -622,9 +692,17 @@ int MapBarCode(char *labelfile, MBC_T *result) * Set all the record to invalid, used by the Inventory function */ case RESET_VALID: - fseek(fp, pos, SEEK_SET); plabelv2->valid = 0; - fwrite(plabelv2, 1, sizeof(LabelV2_T), fp); + if (fseek(fp, pos, SEEK_SET) == -1) { + fclose(fp); + amfree(plabelv2); + return 0; /* Fail */ + } + if (fwrite(plabelv2, 1, SIZEOF(LabelV2_T), fp) < SIZEOF(LabelV2_T)) { + fclose(fp); + amfree(plabelv2); + return 0; /* Fail */ + } break; /* * Add an entry @@ -642,31 +720,31 @@ int MapBarCode(char *labelfile, MBC_T *result) unusedrec = record; } - /* - * Hmm whats that ? - */ - if (strcmp(plabelv2->voltag, result->data.voltag) == 0) - { - volseen = record; - } - /* * OK this record matches the barcode label * so use/update it */ if (strcmp(plabelv2->barcode, result->data.barcode) == 0) { - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : update entry\n"); - fseek(fp, pos, SEEK_SET); + + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : update entry\n")); + if (fseek(fp, pos, SEEK_SET) == -1) { + fclose(fp); + amfree(plabelv2); + return 0; /* Fail */ + } plabelv2->valid = 1; plabelv2->from = result->data.from; plabelv2->slot = result->data.slot; plabelv2->LoadCount = plabelv2->LoadCount + result->data.LoadCount; - strcpy(plabelv2->voltag, result->data.voltag); - strcpy(plabelv2->barcode, result->data.barcode); - fwrite(plabelv2, 1, sizeof(LabelV2_T), fp); + strncpy(plabelv2->voltag, result->data.voltag, + SIZEOF(plabelv2->voltag)); + strncpy(plabelv2->barcode, result->data.barcode, + SIZEOF(plabelv2->barcode)); + rc = (fwrite(plabelv2, 1, SIZEOF(LabelV2_T), fp) < SIZEOF(LabelV2_T)); fclose(fp); - return(1); + amfree(plabelv2); + return(rc); } break; /* @@ -676,8 +754,9 @@ int MapBarCode(char *labelfile, MBC_T *result) case FIND_SLOT: if (strcmp(plabelv2->voltag, result->data.voltag) == 0) { - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode FIND_SLOT : \n"); - memcpy(&(result->data), plabelv2, sizeof(LabelV2_T)); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode FIND_SLOT : \n")); + memcpy(&(result->data), plabelv2, SIZEOF(LabelV2_T)); + amfree(plabelv2); return(1); } break; @@ -689,17 +768,24 @@ int MapBarCode(char *labelfile, MBC_T *result) case UPDATE_SLOT: if (strcmp(plabelv2->voltag, result->data.voltag) == 0) { - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode UPDATE_SLOT : update entry\n"); - fseek(fp, pos, SEEK_SET); - strcpy(plabelv2->voltag, result->data.voltag); - strcpy(plabelv2->barcode, result->data.barcode); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode UPDATE_SLOT : update entry\n")); + if (fseek(fp, pos, SEEK_SET) == -1) { + fclose(fp); + amfree(plabelv2); + return 0; /* Fail */ + } + strncpy(plabelv2->voltag, result->data.voltag, + SIZEOF(plabelv2->voltag)); + strncpy(plabelv2->barcode, result->data.barcode, + SIZEOF(plabelv2->barcode)); plabelv2->valid = 1; plabelv2->slot = result->data.slot; plabelv2->from = result->data.from; plabelv2->LoadCount = plabelv2->LoadCount + result->data.LoadCount; - fwrite(plabelv2, 1, sizeof(LabelV2_T), fp); + rc = (fwrite(plabelv2, 1, SIZEOF(LabelV2_T), fp) < SIZEOF(LabelV2_T)); fclose(fp); - return(1); + amfree(plabelv2); + return(rc); } break; /* @@ -709,15 +795,16 @@ int MapBarCode(char *labelfile, MBC_T *result) */ case BARCODE_VOL: /* - * DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode: (%d) inside BARCODE_VOL\n", record); - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"file value: %s, searched for value: %s\n", plabelv2->voltag, result->data.voltag); + * DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode: (%d) inside BARCODE_VOL\n"), record); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("file value: %s, searched for value: %s\n"), plabelv2->voltag, result->data.voltag); */ if (strcmp(plabelv2->voltag, result->data.voltag) == 0) { - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : VOL %s match\n", result->data.voltag); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : VOL %s match\n"), result->data.voltag); fclose(fp); - memcpy(&(result->data), plabelv2, sizeof(LabelV2_T)); + memcpy(&(result->data), plabelv2, SIZEOF(LabelV2_T)); + amfree(plabelv2); return(1); } break; @@ -728,22 +815,23 @@ int MapBarCode(char *labelfile, MBC_T *result) case BARCODE_BARCODE: if (strcmp(plabelv2->barcode, result->data.barcode) == 0) { - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : BARCODE %s match\n", result->data.barcode); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : BARCODE %s match\n"), result->data.barcode); fclose(fp); - memcpy(&(result->data), plabelv2, sizeof(LabelV2_T)); + memcpy(&(result->data), plabelv2, SIZEOF(LabelV2_T)); + amfree(plabelv2); return(1); } break; default: - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : unknown action\n"); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : unknown action\n")); break; } pos = ftell(fp); } else { - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : feof (%d)\n", feof(fp)); - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : error in read record expect %d, got %d\n",sizeof(LabelV2_T), rsize); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : feof (%d)\n"), feof(fp)); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : error in read record expect %d, got %d\n"),SIZEOF(LabelV2_T), rsize); loop=0; } } @@ -762,29 +850,37 @@ int MapBarCode(char *labelfile, MBC_T *result) */ if (unusedpos != 0) { - DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,"MapBarCode : reuse record %d\n", unusedrec); - fseek(fp, unusedpos, SEEK_SET); + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE,_("MapBarCode : reuse record %d\n"), unusedrec); + if (fseek(fp, unusedpos, SEEK_SET) == -1) { + fclose(fp); + amfree(plabelv2); + return 0; /* Fail */ + } } /* * Set all values to zero */ - memset(plabelv2, 0, sizeof(LabelV2_T)); + memset(plabelv2, 0, SIZEOF(LabelV2_T)); - strcpy(plabelv2->voltag, result->data.voltag); - strncpy(plabelv2->barcode, result->data.barcode, TAG_SIZE); + strncpy(plabelv2->voltag, result->data.voltag, + SIZEOF(plabelv2->voltag)); + strncpy(plabelv2->barcode, result->data.barcode, + SIZEOF(plabelv2->barcode)); plabelv2->valid = 1; plabelv2->from = result->data.from; plabelv2->slot = result->data.slot; - fwrite(plabelv2, 1, sizeof(LabelV2_T), fp); + rc = (fwrite(plabelv2, 1, SIZEOF(LabelV2_T), fp) < SIZEOF(LabelV2_T)); fclose(fp); - return(1); - } + amfree(plabelv2); + return(rc); + } /* * If we hit this point nothing was * found, so return an 0 */ fclose(fp); + amfree(plabelv2); return(0); } @@ -805,6 +901,7 @@ typedef struct com_stru char *parameter; } command; +void parse_args(int argc, char *argv[],command *rval); /* major command line args */ #define COMCOUNT 13 @@ -851,9 +948,12 @@ argument slotdefs[]={{"current",SLOT_CUR,0}, {"last",SLOT_LAST,0}, {"advance",SLOT_ADVANCE,0}, }; -#define SLOTCOUNT (sizeof(slotdefs) / sizeof(slotdefs[0])) +#define SLOTCOUNT (int)(sizeof(slotdefs) / sizeof(slotdefs[0])) -int is_positive_number(char *tmp) /* is the string a valid positive int? */ +/* is the string a valid positive int? */ +int +is_positive_number( + char *tmp) { int i=0; if ((tmp==NULL)||(tmp[0]==0)) @@ -866,26 +966,33 @@ int is_positive_number(char *tmp) /* is the string a valid positive int? */ return 0; } -void usage(char *argv[]) +void +usage( + char *argv[]) { int cnt; - printf("%s: Usage error.\n", argv[0]); + g_printf(_("%s: Usage error.\n"), argv[0]); for (cnt=0; cnt < COMCOUNT; cnt++){ - printf(" %s %s",argv[0],argdefs[cnt].str); + g_printf(" %s %s",argv[0],argdefs[cnt].str); if (argdefs[cnt].takesparam) - printf(" \n"); + g_printf(" \n"); else - printf("\n"); + g_printf("\n"); } exit(2); } -void parse_args(int argc, char *argv[],command *rval) +void +parse_args( + int argc, + char *argv[], + command *rval) { - int i=0; + int i; + for (i=0; i < argc; i++) - dbprintf(("ARG [%d] : %s\n", i, argv[i])); + dbprintf(_("ARG [%d] : %s\n"), i, argv[i]); i = 0; if ((argc<2)||(argc>3)) usage(argv); @@ -907,55 +1014,64 @@ void parse_args(int argc, char *argv[],command *rval) } /* used to find actual slot number from keywords next, prev, first, etc */ -int get_relative_target(int fd,int nslots,char *parameter,int param_index, - int loaded,char *slot_file, - int slot_offset,int maxslot) +int +get_relative_target( + int fd, + int nslots, + char *parameter, + int param_index, + int loaded, + char *slot_file, + int slot_offset, + int maxslot) { int current_slot; + (void)loaded; /* Quiet unused parameter warning */ + current_slot = get_current_slot(slot_file); - if (current_slot > maxslot){ + if (current_slot > maxslot) { current_slot = slot_offset; } - if (current_slot < slot_offset){ + if (current_slot < slot_offset) { current_slot = slot_offset; } switch(param_index) { case SLOT_CUR: return current_slot; - break; + case SLOT_NEXT: case SLOT_ADVANCE: if (++current_slot==nslots+slot_offset) return slot_offset; - else - return current_slot; - break; + return current_slot; + case SLOT_PREV: if (--current_slot no slot `%s'\n",parameter); - close(fd); - exit(2); break; - }; - return(-1); /* never executed */ + } + g_printf(_(" no slot `%s'\n"),parameter); + close(fd); + exit(2); + /*NOTREACHED*/ } -int ask_clean(char *tapedev) - /* This function should ask the drive if it wants to be cleaned */ +/* This function should ask the drive if it wants to be cleaned */ +int +ask_clean( + char *tapedev) { int ret; @@ -968,45 +1084,71 @@ int ask_clean(char *tapedev) return ret; } -void clean_tape(int fd,char *tapedev,char *cnt_file, int drivenum, - int cleancart, int maxclean,char *usagetime) - /* This function should move the cleaning cartridge into the drive */ +/* This function should move the cleaning cartridge into the drive */ +void +clean_tape( + int fd, + char *tapedev, + char *cnt_file, + int drivenum, + int cleancart, + int maxclean, + char *usagetime) { - int counter=-1; + int counter; + char *mailer; + if (cleancart == -1 ){ return; } + /* Now we should increment the counter */ if (cnt_file != NULL){ + mailer = getconf_str(CNF_MAILER); counter = get_current_slot(cnt_file); counter++; if (counter>=maxclean){ /* Now we should inform the administrator */ - char *mail_cmd; - FILE *mailf; - mail_cmd = vstralloc(MAILER, - " -s", " \"", "AMANDA PROBLEM: PLEASE FIX", "\"", - " ", getconf_str(CNF_MAILTO), - NULL); - if((mailf = popen(mail_cmd, "w")) == NULL){ - error("could not open pipe to \"%s\": %s", - mail_cmd, strerror(errno)); - printf("Mail failed\n"); - return; + char *mail_cmd = NULL; + FILE *mailf = NULL; + int mail_pipe_opened = 1; + if (mailer && *mailer != '\0') { + if (getconf_seen(CNF_MAILTO) && strlen(getconf_str(CNF_MAILTO)) > 0 && + validate_mailto(getconf_str(CNF_MAILTO))) { + mail_cmd = vstralloc(mailer, + " -s", " \"", _("AMANDA PROBLEM: PLEASE FIX"), "\"", + " ", getconf_str(CNF_MAILTO), + NULL); + if ((mailf = popen(mail_cmd, "w")) == NULL) { + g_printf(_("Mail failed\n")); + error(_("could not open pipe to \"%s\": %s"), + mail_cmd, strerror(errno)); + /*NOTREACHED*/ + } + } else { + mail_pipe_opened = 0; + mailf = stderr; + g_fprintf(mailf, _("\nNo mail recipient specified, output redirected to stderr")); + } + } else { + mail_pipe_opened = 0; + mailf = stderr; + g_fprintf(mailf, _("\nNo mailer specified; output redirected to stderr")); } - fprintf(mailf,"\nThe usage count of your cleaning tape in slot %d", + g_fprintf(mailf,_("\nThe usage count of your cleaning tape in slot %d"), cleancart); - fprintf(mailf,"\nis more than %d. (cleanmax)",maxclean); - fprintf(mailf,"\nTapedrive %s needs to be cleaned",tapedev); - fprintf(mailf,"\nPlease insert a new cleaning tape and reset"); - fprintf(mailf,"\nthe countingfile %s",cnt_file); - - if(pclose(mailf) != 0) - error("mail command failed: %s", mail_cmd); - + g_fprintf(mailf,_("\nis more than %d. (cleanmax)"),maxclean); + g_fprintf(mailf,_("\nTapedrive %s needs to be cleaned"),tapedev); + g_fprintf(mailf,_("\nPlease insert a new cleaning tape and reset")); + g_fprintf(mailf,_("\nthe countingfile %s"),cnt_file); + + if(mail_pipe_opened == 1 && pclose(mailf) != 0) { + error(_("mail command failed: %s"), mail_cmd); + /*NOTREACHED*/ + } return; } - put_current_slot(cnt_file,counter); + put_current_slot(cnt_file, counter); } load(fd,drivenum,cleancart); /* @@ -1016,34 +1158,37 @@ void clean_tape(int fd,char *tapedev,char *cnt_file, int drivenum, sleep(60); if (drive_loaded(fd, drivenum)) - unload(fd,drivenum,cleancart); - unlink(usagetime); + unload(fd, drivenum, cleancart); + if (usagetime) + unlink(usagetime); } /* ----------------------------------------------------------------------*/ -int main(int argc, char *argv[]) +int +main( + int argc, + char ** argv) { - int loaded,target,oldtarget; + int loaded; + int target, oldtarget; command com; /* a little DOS joke */ int x; - - MBC_T *pbarcoderes = malloc(sizeof(MBC_T)); + MBC_T *pbarcoderes; /* * drive_num really should be something from the config file, but.. * for now, it is set to zero, since most of the common changers * used by amanda only have one drive ( until someone wants to * use an EXB60/120, or a Breece Hill Q45.. ) */ - unsigned char emubarcode = 0; - int drive_num = 0; - int need_eject = 0; /* Does the drive need an eject command ? */ - int need_sleep = 0; /* How many seconds to wait for the drive to get ready */ + unsigned char emubarcode; + int drive_num; + int need_eject; /* Does the drive need an eject command ? */ + time_t need_sleep; /* How many seconds to wait for the drive to get ready */ - int maxclean = 0; - char *clean_file=NULL; - char *time_file=NULL; + int maxclean; + char *clean_file; + char *time_file; - char *ptr; /* a public pointer .... */ /* * For the emubarcode stuff */ @@ -1051,35 +1196,52 @@ int main(int argc, char *argv[]) int slot_offset; int confnum; - int fd, slotcnt, drivecnt; + int fd; + int slotcnt; + int drivecnt; int endstatus = 0; - char *changer_dev = NULL; - char *tape_device = NULL; - char *chg_scsi_conf = NULL; /* The config file for us */ - char *slot_file = NULL; /* Where we will place the info which + char *changer_dev; + char *tape_device; + char *chg_scsi_conf; /* The config file for us */ + char *slot_file; /* Where we will place the info which * slot is loaded */ - char *scsitapedevice = NULL; + char *scsitapedevice; int param_index = 0; - memset(pbarcoderes, 0 , sizeof(MBC_T)); - chg.number_of_configs = 0; - chg.eject = 0; - chg.sleep = 0; - chg.cleanmax = 0; - chg.device = NULL; - chg.labelfile = NULL; - chg.conf = NULL; - chg.debuglevel = NULL; + /* + * Configure program for internationalization: + * 1) Only set the message locale for now. + * 2) Set textdomain for all amanda related programs to "amanda" + * We don't want to be forced to support dozens of message catalogs. + */ + setlocale(LC_MESSAGES, "C"); + textdomain("amanda"); + + changer = alloc(SIZEOF(changer_t)); + pbarcoderes = alloc(SIZEOF(MBC_T)); + + memset(pbarcoderes, 0 , SIZEOF(MBC_T)); + changer->number_of_configs = 0; + changer->eject = 0; + changer->sleep = 0; + changer->cleanmax = 0; + changer->device = NULL; + changer->labelfile = NULL; + changer->conf = NULL; #ifdef CHG_SCSI_STANDALONE - printf("Ups standalone\n"); + g_printf(_("Ups standalone\n")); #else set_pname("chg-scsi"); - dbopen(); - dbprintf(("chg-scsi: %s\n",rcsid)); + /* Don't die when child closes pipe */ + signal(SIGPIPE, SIG_IGN); + + dbopen(DBG_SUBDIR_SERVER); + + dbprintf("chg-scsi: %s\n", rcsid); ChangerDriverVersion(); if (debug_file == NULL) @@ -1089,87 +1251,105 @@ int main(int argc, char *argv[]) parse_args(argc,argv,&com); - pDev = (OpenFiles_T *)malloc(sizeof(OpenFiles_T) * CHG_MAXDEV); - memset(pDev, 0, sizeof(OpenFiles_T) * CHG_MAXDEV ); + pDev = (OpenFiles_T *)alloc(SIZEOF(OpenFiles_T) * CHG_MAXDEV); + memset(pDev, 0, SIZEOF(OpenFiles_T) * CHG_MAXDEV ); - if ((ptr=getenv("CHG_DEBUG")) != NULL) - { - chg.debuglevel = strdup(ptr); - } - switch(com.command_code) { case COM_SCAN: ScanBus(1); return(0); - break; + case COM_GEN_CONF: ScanBus(0); PrintConf(); return(0); - break; + default: break; } - if(read_conffile(CONFFILE_NAME)) { - perror(CONFFILE_NAME); - exit(1); + config_init(CONFIG_INIT_USE_CWD, NULL); + + if (config_errors(NULL) >= CFGERR_WARNINGS) { + config_print_errors(); + if (config_errors(NULL) >= CFGERR_ERRORS) { + g_critical(_("errors processing config file")); + } } - chg_scsi_conf = getconf_str(CNF_CHNGRFILE); + chg_scsi_conf = getconf_str(CNF_CHANGERFILE); tape_device = getconf_str(CNF_TAPEDEV); /* Get the configuration parameters */ /* Attention, this will not support more than 10 tape devices 0-9 */ /* */ if (strlen(tape_device)==1){ - if (read_config(chg_scsi_conf,&chg) == -1) + if (read_config(chg_scsi_conf, changer) == -1) { - fprintf(stderr, "%s open: of %s failed\n", get_pname(), chg_scsi_conf); - return 2; + g_fprintf(stderr, _("%s open: of %s failed\n"), get_pname(), chg_scsi_conf); + return (2); } confnum=atoi(tape_device); - if (chg.number_of_configs == 0) + if (changer->number_of_configs == 0) { - fprintf(stderr,"%s: chg.conf[%d] == NULL\n",get_pname(), confnum); - return(2); + g_fprintf(stderr,_("%s: changer->conf[%d] == NULL\n"), + get_pname(), confnum); + return (2); + } + if (confnum >= changer->number_of_configs) { + g_fprintf(stderr,_("%s: Configuration %s config # out of range (%d >= %d)\n"), + get_pname(), chg_scsi_conf, + confnum, + changer->number_of_configs); + return (2); } - use_slots = chg.conf[confnum].end-chg.conf[confnum].start+1; - slot_offset = chg.conf[confnum].start; - drive_num = chg.conf[confnum].drivenum; - need_eject = chg.eject; - need_sleep = chg.sleep; - - if ( NULL != chg.conf[confnum].cleanfile) - clean_file = stralloc(chg.conf[confnum].cleanfile); + + use_slots = changer->conf[confnum].end-changer->conf[confnum].start+1; + slot_offset = changer->conf[confnum].start; + drive_num = changer->conf[confnum].drivenum; + need_eject = changer->eject; + need_sleep = changer->sleep; + + if ( NULL != changer->conf[confnum].cleanfile) + clean_file = stralloc(changer->conf[confnum].cleanfile); else clean_file = NULL; - clean_slot = chg.conf[confnum].cleanslot; - maxclean = chg.cleanmax; - emubarcode = chg.emubarcode; - if (NULL != chg.conf[confnum].timefile) - time_file = stralloc(chg.conf[confnum].timefile); + clean_slot = changer->conf[confnum].cleanslot; + maxclean = changer->cleanmax; + emubarcode = changer->emubarcode; + if (NULL != changer->conf[confnum].timefile) + time_file = stralloc(changer->conf[confnum].timefile); + else + time_file = NULL; - if (NULL != chg.conf[confnum].slotfile) - slot_file = stralloc(chg.conf[confnum].slotfile); + if (NULL != changer->conf[confnum].slotfile) + slot_file = stralloc(changer->conf[confnum].slotfile); else slot_file = NULL; - if (NULL != chg.conf[confnum].device) - tape_device = stralloc(chg.conf[confnum].device); + if (NULL != changer->conf[confnum].device) + tape_device = stralloc(changer->conf[confnum].device); + else + tape_device = NULL; - if (NULL != chg.device) - changer_dev = stralloc(chg.device); + if (NULL != changer->device) + changer_dev = stralloc(changer->device); + else + changer_dev = NULL; - if (NULL != chg.conf[confnum].scsitapedev) - scsitapedevice = stralloc(chg.conf[confnum].scsitapedev); + if (NULL != changer->conf[confnum].scsitapedev) + scsitapedevice = stralloc(changer->conf[confnum].scsitapedev); + else + scsitapedevice = NULL; - if (NULL != chg.conf[confnum].tapestatfile) - tapestatfile = stralloc(chg.conf[confnum].tapestatfile); - dump_changer_struct(chg); + if (NULL != changer->conf[confnum].tapestatfile) + tapestatfile = stralloc(changer->conf[confnum].tapestatfile); + else + tapestatfile = NULL; + dump_changer_struct(changer); @@ -1178,14 +1358,13 @@ int main(int argc, char *argv[]) * If we can't open it fail with a message */ - if (OpenDevice(INDEX_CHANGER , changer_dev, "changer_dev", chg.conf[confnum].changerident) == 0) + if (OpenDevice(INDEX_CHANGER , changer_dev, "changer_dev", changer->conf[confnum].changerident) == 0) { int localerr = errno; - fprintf(stderr, "%s: open: %s: %s\n", get_pname(), + g_fprintf(stderr, _("%s: open: %s: %s\n"), get_pname(), changer_dev, strerror(localerr)); - printf("%s open: %s: %s\n", "", changer_dev, strerror(localerr)); - dbprintf(("%s: open: %s: %s\n", get_pname(), - changer_dev, strerror(localerr))); + g_printf(_("%s open: %s: %s\n"), _(""), changer_dev, strerror(localerr)); + dbprintf(_("open: %s: %s\n"), changer_dev, strerror(localerr)); return 2; } @@ -1199,9 +1378,9 @@ int main(int argc, char *argv[]) */ if (tape_device != NULL) { - if (OpenDevice(INDEX_TAPE, tape_device, "tape_device", chg.conf[confnum].tapeident) == 0) + if (OpenDevice(INDEX_TAPE, tape_device, "tape_device", changer->conf[confnum].tapeident) == 0) { - dbprintf(("warning open of %s: failed\n", tape_device)); + dbprintf(_("warning open of %s: failed\n"), tape_device); } } @@ -1210,9 +1389,9 @@ int main(int argc, char *argv[]) */ if (scsitapedevice != NULL) { - if (OpenDevice(INDEX_TAPECTL, scsitapedevice, "scsitapedevice", chg.conf[confnum].tapeident) == 0) + if (OpenDevice(INDEX_TAPECTL, scsitapedevice, "scsitapedevice", changer->conf[confnum].tapeident) == 0) { - dbprintf(("warning open of %s: failed\n", scsitapedevice)); + dbprintf(_("warning open of %s: failed\n"), scsitapedevice); } } @@ -1226,13 +1405,13 @@ int main(int argc, char *argv[]) { if (pDev[INDEX_TAPE].avail == 0 && pDev[INDEX_TAPECTL].avail == 0) { - printf("No device found for tape eject"); + g_printf(_("No device found for tape eject")); return(2); } } - if ((chg.conf[confnum].end == -1) || (chg.conf[confnum].start == -1)){ + if ((changer->conf[confnum].end == -1) || (changer->conf[confnum].start == -1)){ slotcnt = get_slot_count(fd); use_slots = slotcnt; slot_offset = 0; @@ -1244,47 +1423,46 @@ int main(int argc, char *argv[]) * we need an label file */ - if ( chg.emubarcode == 1 || BarCode(INDEX_CHANGER) == 1) + if ( changer->emubarcode == 1 || BarCode(INDEX_CHANGER) == 1) { - if (chg.labelfile == NULL) + if (changer->labelfile == NULL) { - printf("labelfile param not set in your config\n"); + g_printf(_("labelfile param not set in your config\n")); return(2); } } if (slot_file == NULL) { - printf("slotfile param. not set in your config\n"); + g_printf(_("slotfile param. not set in your config\n")); return(2); } if (access(slot_file,R_OK|W_OK) != 0) { - printf("slotfile %s does not exsist or is not read/write\n", slot_file); + g_printf(_("slotfile %s does not exsist or is not read/write\n"), slot_file); return(2); } } else { /* if (strlen(tape_device)==1) */ - printf("please check your config and use a config file for chg-scsi\n"); + g_printf(_("please check your config and use a config file for chg-scsi\n")); return(2); } drivecnt = get_drive_count(fd); if (drive_num > drivecnt) { - printf("%s drive number error (%d > %d)\n", "", + g_printf(_("%s drive number error (%d > %d)\n"), _(""), drive_num, drivecnt); - fprintf(stderr, "%s: requested drive number (%d) greater than " - "number of supported drives (%d)\n", get_pname(), + g_fprintf(stderr, _("%s: requested drive number (%d) greater than " + "number of supported drives (%d)\n"), get_pname(), drive_num, drivecnt); - dbprintf(("%s: requested drive number (%d) greater than " - "number of supported drives (%d)\n", get_pname(), - drive_num, drivecnt)); + dbprintf(_("requested drive number (%d) is greater than " + "number of supported drives (%d)\n"), drive_num, drivecnt); return 2; } - loaded = drive_loaded(fd, drive_num); + loaded = (int)drive_loaded(fd, drive_num); target = -1; switch(com.command_code) { @@ -1296,17 +1474,20 @@ int main(int argc, char *argv[]) */ case COM_DUMPDB: pbarcoderes->action = BARCODE_DUMP; - MapBarCode(chg.labelfile, pbarcoderes); + MapBarCode(changer->labelfile, pbarcoderes); break; case COM_STATUS: - ChangerStatus(com.parameter, chg.labelfile, BarCode(fd),slot_file, changer_dev, tape_device); + ChangerStatus(com.parameter, changer->labelfile, + BarCode(fd), slot_file, changer_dev, tape_device); break; case COM_LABEL: /* Update BarCode/Label mapping file */ pbarcoderes->action = BARCODE_PUT; - strcpy(pbarcoderes->data.voltag, com.parameter); - strcpy( pbarcoderes->data.barcode, pDTE[drive_num].VolTag); - MapBarCode(chg.labelfile, pbarcoderes); - printf("0 0 0\n"); + strncpy(pbarcoderes->data.voltag, com.parameter, + SIZEOF(pbarcoderes->data.voltag)); + strncpy(pbarcoderes->data.barcode, pDTE[drive_num].VolTag, + SIZEOF(pbarcoderes->data.barcode)); + MapBarCode(changer->labelfile, pbarcoderes); + g_printf("0 0 0\n"); break; /* @@ -1319,9 +1500,9 @@ int main(int argc, char *argv[]) oldtarget = get_current_slot(slot_file); if (oldtarget < 0) { - dbprintf(("COM_INVENTORY: get_current_slot %d\n", oldtarget)); + dbprintf(_("COM_INVENTORY: get_current_slot %d\n"), oldtarget); oldtarget = find_empty(fd, slot_offset, use_slots); - dbprintf(("COM_INVENTORY: find_empty %d\n", oldtarget)); + dbprintf(_("COM_INVENTORY: find_empty %d\n"), oldtarget); } if (need_eject) @@ -1337,9 +1518,9 @@ int main(int argc, char *argv[]) (void)unload(fd, drive_num, oldtarget); if (ask_clean(scsitapedevice)) clean_tape(fd,tape_device,clean_file,drive_num, - clean_slot,maxclean,time_file); + clean_slot, maxclean, time_file); } - Inventory(chg.labelfile, drive_num, need_eject, 0, 0, clean_slot); + Inventory(changer->labelfile, drive_num, need_eject, 0, 0, clean_slot); do_inventory = 0; /* If set on exit the labeldb will be set to invalid ..... */ break; @@ -1354,11 +1535,12 @@ int main(int argc, char *argv[]) */ if (BarCode(fd) == 1 && emubarcode != 1) { - dbprintf(("search : look for %s\n", com.parameter)); + dbprintf(_("search : look for %s\n"), com.parameter); pbarcoderes->action = BARCODE_VOL; pbarcoderes->data.slot = -1; - strcpy(pbarcoderes->data.voltag, com.parameter); - if (MapBarCode(chg.labelfile, pbarcoderes) == 1) + strncpy(pbarcoderes->data.voltag, com.parameter, + SIZEOF(pbarcoderes->data.voltag)); + if (MapBarCode(changer->labelfile, pbarcoderes) == 1) { /* * If both values are unset we have an problem @@ -1366,7 +1548,7 @@ int main(int argc, char *argv[]) */ if (pbarcoderes->data.slot == -1 && pbarcoderes->data.barcode == NULL) { - printf("Label %s not found (1)\n",com.parameter); + g_printf(_("Label %s not found (1)\n"),com.parameter); endstatus = 2; close(fd); break; @@ -1380,11 +1562,11 @@ int main(int argc, char *argv[]) if (pbarcoderes->data.barcode != NULL) { - for (x = 0; x < STE; x++) + for (x = 0; x < (int)STE; x++) { if (strcmp(pSTE[x].VolTag, pbarcoderes->data.barcode) == 0) { - dbprintf(("search : found slot %d\n", x)); + dbprintf(_("search : found slot %d\n"), x); target = x; } } @@ -1394,19 +1576,19 @@ int main(int argc, char *argv[]) * If we find it check if it is in the right drive * if we have more than one drive. */ - for (x = 0; x < DTE; x++) + for (x = 0; x < (int)DTE; x++) { if (strcmp(pDTE[x].VolTag, pbarcoderes->data.barcode) == 0) { - dbprintf(("search : found in tape %d\n", x)); + dbprintf(_("search : found in tape %d\n"), x); /* */ if (x == drive_num) { oldtarget = get_current_slot(slot_file); - printf("%d %s\n", oldtarget- slot_offset, tape_device); + g_printf("%d %s\n", oldtarget - slot_offset, tape_device); return(0); } else { - printf("LABEL in wrong tape Unit\n"); + g_printf(_("LABEL in wrong tape Unit\n")); return(2); } } @@ -1416,7 +1598,7 @@ int main(int argc, char *argv[]) */ if (target == -1) { - printf("Label %s not found (2) \n",com.parameter); + g_printf(_("Label %s not found (2) \n"),com.parameter); close(fd); endstatus = 2; break; @@ -1438,7 +1620,7 @@ int main(int argc, char *argv[]) */ if (target == -1) { - printf("Label %s not found (3)\n",com.parameter); + g_printf(_("Label %s not found (3)\n"),com.parameter); close(fd); endstatus = 2; break; @@ -1453,24 +1635,25 @@ int main(int argc, char *argv[]) */ if (emubarcode == 1 && BarCode(fd) != 1) { - dbprintf(("search : look for %s\n", com.parameter)); + dbprintf(_("search : look for %s\n"), com.parameter); pbarcoderes->action = FIND_SLOT; pbarcoderes->data.slot = -1; - strcpy(pbarcoderes->data.voltag, com.parameter); + strncpy(pbarcoderes->data.voltag, com.parameter, + SIZEOF(pbarcoderes->data.voltag)); - if (MapBarCode(chg.labelfile, pbarcoderes) == 1) + if (MapBarCode(changer->labelfile, pbarcoderes) == 1) { if (pbarcoderes->data.valid == 1) { target = pbarcoderes->data.slot; } else { - printf("Barcode DB out of sync \n"); + g_printf(_("Barcode DB out of sync \n")); close(fd); endstatus=2; break; } } else { - printf("Label %s not found \n",com.parameter); + g_printf(_("Label %s not found \n"),com.parameter); close(fd); endstatus = 2; break; @@ -1485,24 +1668,25 @@ int main(int argc, char *argv[]) { if (is_positive_number(com.parameter)) { if ((target = atoi(com.parameter))>=use_slots) { - printf(" no slot `%d'\n",target); + g_printf(_(" no slot `%d'\n"),target); close(fd); endstatus = 2; break; } else { - target = target+slot_offset; + target = target + slot_offset; } } else { param_index=0; - while((param_indexfd); */ @@ -1757,21 +1941,22 @@ int main(int argc, char *argv[]) #endif - if (do_inventory == 1 && endstatus == 0 && chg.labelfile != NULL) + if (do_inventory == 1 && endstatus == 0 && changer->labelfile != NULL) { - if ( chg.autoinv == 1) + if (changer->autoinv == 1) { - DebugPrint(DEBUG_INFO,SECTION_INFO, "Do an inventory \n"); - Inventory(chg.labelfile, drive_num , chg.eject, 0, 0, clean_slot); + DebugPrint(DEBUG_INFO,SECTION_INFO, _("Do an inventory \n")); + Inventory(changer->labelfile, drive_num, changer->eject, + 0, 0, clean_slot); } else { - DebugPrint(DEBUG_INFO,SECTION_INFO, "Set all entrys in DB to invalid\n"); - memset(pbarcoderes, 0 , sizeof(MBC_T)); + DebugPrint(DEBUG_INFO,SECTION_INFO, _("Set all entrys in DB to invalid\n")); + memset(pbarcoderes, 0 , SIZEOF(MBC_T)); pbarcoderes->action = RESET_VALID; - MapBarCode(chg.labelfile,pbarcoderes); + MapBarCode(changer->labelfile,pbarcoderes); } } - DebugPrint(DEBUG_INFO,SECTION_INFO,"Exit status -> %d\n", endstatus); + DebugPrint(DEBUG_INFO,SECTION_INFO,_("Exit status -> %d\n"), endstatus); dbclose(); return endstatus; } @@ -1781,4 +1966,3 @@ int main(int argc, char *argv[]) * tab-width: 4 * End: */ -