X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Fchanger.c;h=c49319a2ec507abcb45c346424c7af37af6be92c;hb=94a044f90357edefa6f4ae9f0b1d5885b0e34aee;hp=84ea94296576f5bce504aff4b72bb562352e9b8b;hpb=d3b2175e084f88c8736ad7073eacbf4670147aec;p=debian%2Famanda diff --git a/server-src/changer.c b/server-src/changer.c index 84ea942..c49319a 100644 --- a/server-src/changer.c +++ b/server-src/changer.c @@ -57,25 +57,29 @@ static char *tapechanger = NULL; /* local functions */ static int changer_command(char *cmd, char *arg); -static int report_bad_resultstr(void); +static int report_bad_resultstr(char *cmd); static int run_changer_command(char *cmd, char *arg, char **slotstr, char **rest); int changer_init(void) { - tapechanger = getconf_str(CNF_TPCHANGER); + if (tapechanger == NULL) + tapechanger = getconf_str(CNF_TPCHANGER); + if (*tapechanger != '\0' && *tapechanger != '/') { + tapechanger = vstralloc(amlibexecdir, "/", tapechanger, versionsuffix(), + NULL); + } return strcmp(tapechanger, "") != 0; } static int -report_bad_resultstr(void) +report_bad_resultstr(char *cmd) { char *s; - s = vstralloc("badly formed result from changer: ", - "\"", changer_resultstr, "\"", - NULL); + s = vstrallocf(_("badly formed result from changer command %s: \"%s\""), + cmd, changer_resultstr); amfree(changer_resultstr); changer_resultstr = s; return 2; @@ -105,7 +109,7 @@ run_changer_command( ch = *s++; skip_whitespace(s, ch); - if(ch == '\0') return report_bad_resultstr(); + if(ch == '\0') return report_bad_resultstr(cmd); slot = s - 1; skip_non_whitespace(s, ch); s[-1] = '\0'; @@ -120,7 +124,7 @@ run_changer_command( } if(exitcode) { - if(ch == '\0') return report_bad_resultstr(); + if(ch == '\0') return report_bad_resultstr(cmd); result_copy = stralloc(s - 1); amfree(changer_resultstr); changer_resultstr = result_copy; @@ -168,7 +172,7 @@ changer_loadslot( rc = run_changer_command("-slot", inslotstr, outslotstr, &rest); if(rc) return rc; - if(*rest == '\0') return report_bad_resultstr(); + if(*rest == '\0') return report_bad_resultstr("-slot"); *devicename = newstralloc(*devicename, rest); return 0; @@ -198,15 +202,15 @@ changer_query( rc = run_changer_command("-info", (char *) NULL, curslotstr, &rest); if(rc) return rc; - dbprintf(("changer_query: changer return was %s\n",rest)); + dbprintf(_("changer_query: changer return was %s\n"),rest); if (sscanf(rest, "%d %d %d", nslotsp, backwardsp, searchable) != 3) { if (sscanf(rest, "%d %d", nslotsp, backwardsp) != 2) { - return report_bad_resultstr(); + return report_bad_resultstr("-info"); } else { *searchable = 0; } } - dbprintf(("changer_query: searchable = %d\n",*searchable)); + dbprintf(_("changer_query: searchable = %d\n"),*searchable); return 0; } @@ -223,7 +227,7 @@ changer_info( if(rc) return rc; if (sscanf(rest, "%d %d", nslotsp, backwardsp) != 2) { - return report_bad_resultstr(); + return report_bad_resultstr("-info"); } return 0; } @@ -253,7 +257,7 @@ changer_find( if (rc != 0) { /* Problem with the changer script. Bail. */ - fprintf(stderr, "Changer problem: %s\n", changer_resultstr); + g_fprintf(stderr, _("Changer problem: %s\n"), changer_resultstr); return; } @@ -262,11 +266,11 @@ changer_find( if (searchlabel != NULL) { - dbprintf(("changer_find: looking for %s changer is searchable = %d\n", - searchlabel, searchable)); + dbprintf(_("changer_find: looking for %s changer is searchable = %d\n"), + searchlabel, searchable); } else { - dbprintf(("changer_find: looking for NULL changer is searchable = %d\n", - searchable)); + dbprintf(_("changer_find: looking for NULL changer is searchable = %d\n"), + searchable); } if ((searchlabel!=NULL) && searchable && !done){ @@ -327,36 +331,26 @@ changer_command( int fd[2]; amwait_t wait_exitcode = 1; int exitcode; - char num1[NUM_STR_SIZE]; - char num2[NUM_STR_SIZE]; char *cmdstr; pid_t pid, changer_pid = 0; int fd_to_close[4], *pfd_to_close = fd_to_close; - if (*tapechanger != '/') { - tapechanger = vstralloc(libexecdir, "/", tapechanger, versionsuffix(), - NULL); - malloc_mark(tapechanger); - } cmdstr = vstralloc(tapechanger, " ", cmd, arg ? " " : "", arg ? arg : "", NULL); if(changer_debug) { - fprintf(stderr, "changer: opening pipe to: %s\n", cmdstr); + g_fprintf(stderr, _("changer: opening pipe to: %s\n"), cmdstr); fflush(stderr); } amfree(changer_resultstr); if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd) == -1) { - changer_resultstr = vstralloc (" ", - "could not create pipe for \"", - cmdstr, - "\": ", - strerror(errno), - NULL); + changer_resultstr = vstrallocf( + _(" could not create pipe for \"%s\": %s"), + cmdstr, strerror(errno)); exitcode = 2; goto failed; } @@ -378,96 +372,73 @@ changer_command( } if(fd[0] < 0 || fd[0] >= (int)FD_SETSIZE) { - snprintf(num1, SIZEOF(num1), "%d", fd[0]); - snprintf(num2, SIZEOF(num2), "%d", FD_SETSIZE-1); - changer_resultstr = vstralloc (" ", - "could not create pipe for \"", - cmdstr, - "\": ", - "socketpair 0: descriptor ", - num1, - " out of range ( .. ", - num2, - ")", - NULL); + changer_resultstr = vstrallocf( + _(" could not create pipe for \"%s\":" + "socketpair 0: descriptor %d out of range ( 0 .. %d)"), + cmdstr, fd[0], (int)FD_SETSIZE-1); exitcode = 2; goto done; } if(fd[1] < 0 || fd[1] >= (int)FD_SETSIZE) { - snprintf(num1, SIZEOF(num1), "%d", fd[1]); - snprintf(num2, SIZEOF(num2), "%d", FD_SETSIZE-1); - changer_resultstr = vstralloc (" ", - "could not create pipe for \"", - cmdstr, - "\": ", - "socketpair 1: descriptor ", - num1, - " out of range ( .. ", - num2, - ")", - NULL); + changer_resultstr = vstrallocf( + _(" could not create pipe for \"%s\":" + "socketpair 1: descriptor %d out of range ( 0 .. %d)"), + cmdstr, fd[1], (int)FD_SETSIZE-1); exitcode = 2; goto done; } switch(changer_pid = fork()) { case -1: - changer_resultstr = vstralloc (" ", - "could not fork for \"", - cmdstr, - "\": ", - strerror(errno), - NULL); + changer_resultstr = vstrallocf( + _(" could not fork for \"%s\": %s"), + cmdstr, strerror(errno)); exitcode = 2; goto done; case 0: - if(dup2(fd[1], 1) == -1 || dup2(dbfd(), 2) == -1) { - changer_resultstr = vstralloc (" ", - "could not open pipe to \"", - cmdstr, - "\": ", - strerror(errno), - NULL); + debug_dup_stderr_to_debug(); + if(dup2(fd[1], 1) == -1) { + changer_resultstr = vstrallocf( + _(" could not open pipe to \"%s\": %s"), + cmdstr, strerror(errno)); (void)fullwrite(fd[1], changer_resultstr, strlen(changer_resultstr)); exit(1); } aclose(fd[0]); aclose(fd[1]); if(config_dir && chdir(config_dir) == -1) { - changer_resultstr = vstralloc (" ", - "could not cd to \"", - config_dir, - "\": ", - strerror(errno), - NULL); - (void)fullwrite(2, changer_resultstr, strlen(changer_resultstr)); + changer_resultstr = vstrallocf( + _(" could not cd to \"%s\": %s"), + config_dir, strerror(errno)); + (void)fullwrite(STDOUT_FILENO, changer_resultstr, strlen(changer_resultstr)); exit(1); } + safe_fd(-1, 0); if(arg) { execle(tapechanger, tapechanger, cmd, arg, (char *)NULL, safe_env()); } else { execle(tapechanger, tapechanger, cmd, (char *)NULL, safe_env()); } - changer_resultstr = vstralloc (" ", - "could not exec \"", - tapechanger, - "\": ", - strerror(errno), - NULL); - (void)fullwrite(2, changer_resultstr, strlen(changer_resultstr)); + changer_resultstr = vstrallocf( + _(" could not exec \"%s\": %s"), + tapechanger, strerror(errno)); + (void)fullwrite(STDOUT_FILENO, changer_resultstr, strlen(changer_resultstr)); exit(1); default: aclose(fd[1]); } if((changer_resultstr = areads(fd[0])) == NULL) { - changer_resultstr = vstralloc (" ", - "could not read result from \"", - tapechanger, - errno ? "\": " : "\"", - errno ? strerror(errno) : "", - NULL); + if (errno == 0) { + changer_resultstr = vstrallocf( + _(" could not read result from \"%s\": Premature end of file, see %s"), + tapechanger, dbfn()); + } else { + changer_resultstr = vstrallocf( + _(" could not read result from \"%s\": %s"), + tapechanger, strerror(errno)); + } } while(1) { @@ -475,23 +446,16 @@ changer_command( if(errno == EINTR) { continue; } else { - changer_resultstr = vstralloc (" ", - "wait for \"", - tapechanger, - "\" failed: ", - strerror(errno), - NULL); + changer_resultstr = vstrallocf( + _(" wait for \"%s\" failed: %s"), + tapechanger, strerror(errno)); exitcode = 2; goto done; } } else if (pid != changer_pid) { - snprintf(num1, SIZEOF(num1), "%ld", (long)pid); - changer_resultstr = vstralloc (" ", - "wait for \"", - tapechanger, - "\" returned unexpected pid ", - num1, - NULL); + changer_resultstr = vstrallocf( + _(" wait for \"%s\" returned unexpected pid %ld"), + tapechanger, (long)pid); exitcode = 2; goto done; } else { @@ -501,12 +465,9 @@ changer_command( /* mark out-of-control changers as fatal error */ if(WIFSIGNALED(wait_exitcode)) { - snprintf(num1, SIZEOF(num1), "%d", WTERMSIG(wait_exitcode)); - changer_resultstr = newvstralloc (changer_resultstr, - " ", - changer_resultstr, - " (got signal ", num1, ")", - NULL); + changer_resultstr = newvstrallocf(changer_resultstr, + _(" %s (got signal %d)"), + changer_resultstr, WTERMSIG(wait_exitcode)); exitcode = 2; } else { exitcode = WEXITSTATUS(wait_exitcode); @@ -518,7 +479,7 @@ done: failed: if (exitcode != 0) { - dbprintf(("changer: got exit: %d str: %s\n", exitcode, changer_resultstr)); + dbprintf(_("changer: got exit: %d str: %s\n"), exitcode, changer_resultstr); } amfree(cmdstr); @@ -542,11 +503,11 @@ changer_search( char *rest; int rc; - dbprintf(("changer_search: %s\n",searchlabel)); + dbprintf("changer_search: %s\n",searchlabel); rc = run_changer_command("-search", searchlabel, outslotstr, &rest); if(rc) return rc; - if(*rest == '\0') return report_bad_resultstr(); + if(*rest == '\0') return report_bad_resultstr("-search"); *devicename = newstralloc(*devicename, rest); return 0; @@ -572,12 +533,12 @@ changer_label( char *curslotstr = NULL; int nslots, backwards, searchable; - dbprintf(("changer_label: %s for slot %s\n",labelstr,slotsp)); + dbprintf(_("changer_label: %s for slot %s\n"),labelstr,slotsp); rc = changer_query(&nslots, &curslotstr, &backwards,&searchable); amfree(curslotstr); if ((rc == 0) && (searchable == 1)){ - dbprintf(("changer_label: calling changer -label %s\n",labelstr)); + dbprintf(_("changer_label: calling changer -label %s\n"),labelstr); rc = run_changer_command("-label", labelstr, &slotstr, &rest); amfree(slotstr); }