]> git.wh0rd.org - dump.git/blobdiff - common/dumprmt.c
Updated buggy example.
[dump.git] / common / dumprmt.c
index d39e13432b2c9a4ca391ba9eb16c5839b544ebae..7f88f63a9fb95851eec469556015230170bde7ac 100644 (file)
  * 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.26 2003/03/26 10:58:22 stelian Exp $";
+       "$Id: dumprmt.c,v 1.28 2003/10/26 16:05:45 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -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)