X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=common%2Fdumprmt.c;h=7f88f63a9fb95851eec469556015230170bde7ac;hp=f89a13de1fb60a1c5cf5fdc14b0b3bdd12a85dee;hb=35ed8cf887b00613ffa27f7259ef081830f447e2;hpb=ba3af39e8b08027d3338b5533bddc86a9c803a74 diff --git a/common/dumprmt.c b/common/dumprmt.c index f89a13d..7f88f63 100644 --- a/common/dumprmt.c +++ b/common/dumprmt.c @@ -18,11 +18,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -41,7 +37,7 @@ #ifndef lint static const char rcsid[] = - "$Id: dumprmt.c,v 1.23 2002/07/29 12:00:33 stelian Exp $"; + "$Id: dumprmt.c,v 1.28 2003/10/26 16:05:45 stelian Exp $"; #endif /* not lint */ #include @@ -104,12 +100,12 @@ int rshpid = -1; static const char *rmtpeer = 0; static int okname __P((const char *)); -static int rmtcall __P((const char *, const char *)); +static OFF_T rmtcall __P((const char *, const char *)); static void rmtconnaborted __P((int)); static int rmtgetb __P((void)); static int rmtgetconn __P((void)); static void rmtgets __P((char *, size_t)); -static int rmtreply __P((const char *)); +static OFF_T rmtreply __P((const char *)); static int piped_child __P((const char **command)); #ifdef KERBEROS int krcmd __P((char **, int /*u_short*/, char *, char *, int *, char *)); @@ -118,6 +114,8 @@ int krcmd __P((char **, int /*u_short*/, char *, char *, int *, char *)); static int errfd = -1; extern int dokerberos; extern int ntrec; /* blocking factor on tape */ +extern int abortifconnerr; /* set to 1 if this lib should exit on connection errors + otherwise just print a message using msg */ #ifndef errno extern int errno; #endif @@ -156,8 +154,8 @@ rmtconnaborted(UNUSED(int signo)) } } } - - exit(X_ABORT); + if (abortifconnerr) + exit(X_ABORT); } static int @@ -178,20 +176,36 @@ rmtgetconn(void) if (!rsh && sp == NULL) { sp = getservbyname(dokerberos ? "kshell" : "shell", "tcp"); - if (sp == NULL) - errx(1, "%s/tcp: unknown service", - dokerberos ? "kshell" : "shell"); + if (sp == NULL) { + if (abortifconnerr) { + errx(1, "%s/tcp: unknown service", dokerberos ? "kshell" : "shell"); + } else { + msg("%s/tcp: unknown service", dokerberos ? "kshell" : "shell"); + return 0; + } + } } if (pwd == NULL) { pwd = getpwuid(getuid()); - if (pwd == NULL) - errx(1, "who are you?"); + if (pwd == NULL) { + if (abortifconnerr) { + errx(1, "who are you?"); + } else { + msg("who are you?"); + return 0; + } + } } if ((cp = strchr(rmtpeer, '@')) != NULL) { tuser = rmtpeer; *cp = '\0'; - if (!okname(tuser)) - exit(X_STARTUP); + if (!okname(tuser)) { + if (abortifconnerr) { + exit(X_STARTUP); + } else { + return 0; + } + } rmtpeer = ++cp; } else tuser = pwd->pw_name; @@ -254,7 +268,7 @@ rmtgetconn(void) perror("TCP_NODELAY setsockopt"); fromrmtape = tormtape; } - (void)fprintf(stderr, "Connection to %s established.\n", rmtpeer); + (void)fprintf(stdout, "Connection to %s established.\n", rmtpeer); return 1; } @@ -309,9 +323,11 @@ rmtread(char *buf, size_t count) (void)snprintf(line, sizeof (line), "R%u\n", (unsigned)count); n = rmtcall("read", line); - if (n < 0) + if (n < 0) { /* rmtcall() properly sets errno for us on errors. */ - return (n); + errno = n; + return (-1); + } for (i = 0; i < n; i += cc) { cc = read(fromrmtape, buf+i, n - i); if (cc <= 0) @@ -331,12 +347,12 @@ rmtwrite(const char *buf, size_t count) return (rmtreply("write")); } -int -rmtseek(int offset, int pos) +OFF_T +rmtseek(OFF_T offset, int pos) { char line[80]; - (void)snprintf(line, sizeof (line), "L%d\n%d\n", offset, pos); + (void)snprintf(line, sizeof (line), "L%lld\n%d\n", (long long)offset, pos); return (rmtcall("seek", line)); } @@ -350,7 +366,15 @@ rmtstatus(void) if (rmtstate != TS_OPEN) return (NULL); - rmtcall("status", "S\n"); + i = rmtcall("status", "S"); + if (i < 0) return NULL; + if (i != (int)sizeof(mts)) { + msg("mtget sizes different between host (%d) " + "and remote tape (%d)", sizeof(mts), i); + for ( /* empty */; i > 0; --i) + rmtgetb(); + return NULL; + } for (i = 0, cp = (char *)&mts; i < (int)sizeof(mts); i++) *cp++ = rmtgetb(); return (&mts); @@ -367,7 +391,7 @@ rmtioctl(int cmd, int count) return (rmtcall("ioctl", buf)); } -static int +static OFF_T rmtcall(const char *cmd, const char *buf) { @@ -376,7 +400,7 @@ rmtcall(const char *cmd, const char *buf) return (rmtreply(cmd)); } -static int +static OFF_T rmtreply(const char *cmd) { char *cp; @@ -401,7 +425,7 @@ rmtreply(const char *cmd) code); rmtconnaborted(0); } - return (atoi(code + 1)); + return (OFF_T)(atoll(code + 1)); } static int