]> git.wh0rd.org - dump.git/blobdiff - common/dumprmt.c
Fix rmtopen() extended format...
[dump.git] / common / dumprmt.c
index 5f53079c6ddb7131702af8d8a39a0b2275cb4fb4..f89a13de1fb60a1c5cf5fdc14b0b3bdd12a85dee 100644 (file)
@@ -2,7 +2,8 @@
  *     Ported to Linux's Second Extended File System as part of the
  *     dump and restore backup suit
  *     Remy Card <card@Linux.EU.Org>, 1994-1997
- *     Stelian Pop <pop@cybercable.fr>, 1999
+ *     Stelian Pop <stelian@popies.net>, 1999-2000
+ *     Stelian Pop <stelian@popies.net> - AlcĂ´ve <www.alcove.com>, 2000-2002
  */
 
 /*-
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: dumprmt.c,v 1.8 1999/11/02 09:35:56 tiniou Exp $";
+       "$Id: dumprmt.c,v 1.23 2002/07/29 12:00:33 stelian Exp $";
 #endif /* not lint */
 
-#ifdef __linux__
-#include <sys/types.h>
-#include <linux/types.h>
-#endif
+#include <config.h>
 #include <sys/param.h>
 #include <sys/mtio.h>
 #include <sys/socket.h>
 #include <sys/time.h>
+#include <fcntl.h>
 #ifdef __linux__
+#include <sys/types.h>
+#ifdef HAVE_EXT2FS_EXT2_FS_H
+#include <ext2fs/ext2_fs.h>
+#else
 #include <linux/ext2_fs.h>
+#endif
 #include <bsdcompat.h>
 #include <signal.h>
-#else
-#ifdef sunos
+#elif defined sunos
 #include <sys/vnode.h>
 
 #include <ufs/inode.h>
 #else
 #include <ufs/ufs/dinode.h>
 #endif
-#endif
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
@@ -75,6 +77,7 @@ static const char rcsid[] =
 #include <ctype.h>
 #include <errno.h>
 #include <compaterr.h>
+#include <rmtflags.h>
 #include <netdb.h>
 #include <pwd.h>
 #include <stdio.h>
@@ -88,8 +91,8 @@ static const char rcsid[] =
 #include <ext2fs/ext2fs.h>
 #endif
 
-#include "pathnames.h"
-#include "dump.h"
+#include <pathnames.h>
+#include "dump.h"      /* for X_STARTUP, X_ABORT etc */
 
 #define        TS_CLOSED       0
 #define        TS_OPEN         1
@@ -131,7 +134,7 @@ rmthost(const char *host)
 }
 
 static void
-rmtconnaborted(int signo)
+rmtconnaborted(UNUSED(int signo))
 {
        msg("Lost connection to remote host.\n");
        if (errfd != -1) {
@@ -160,8 +163,8 @@ rmtconnaborted(int signo)
 static int
 rmtgetconn(void)
 {
-       register char *cp;
-       register const char *rmt;
+       char *cp;
+       const char *rmt;
        static struct servent *sp = NULL;
        static struct passwd *pwd = NULL;
        const char *tuser;
@@ -169,6 +172,7 @@ rmtgetconn(void)
        int size;
        int throughput;
        int on;
+       char *rmtpeercopy;
 
        rsh = getenv("RSH");
 
@@ -204,19 +208,29 @@ rmtgetconn(void)
                rshcmd[4] = rmt;
                rshcmd[5] = NULL;
 
+               /* Restore the uid and gid. We really don't want
+                * to execute whatever is put into RSH variable with
+                * more priviledges than needed... */
+               setuid(getuid());
+               setgid(getgid());
+
                if ((rshpid = piped_child(rshcmd)) < 0) {
                        msg("cannot open connection\n");
                        return 0;
                }
        }
        else {
+               /* Copy rmtpeer to rmtpeercopy to ignore the
+                  return value from rcmd. I cannot figure if
+                  this is this a bug in rcmd or in my code... */
+               rmtpeercopy = (char *)rmtpeer;
 #ifdef KERBEROS
                if (dokerberos)
-                       tormtape = krcmd((char **)&rmtpeer, sp->s_port, tuser, rmt, &errfd,
+                       tormtape = krcmd(&rmtpeercopy, sp->s_port, tuser, rmt, &errfd,
                                       (char *)0);
                else
 #endif
-                       tormtape = rcmd((char **)&rmtpeer, (u_short)sp->s_port, pwd->pw_name,
+                       tormtape = rcmd(&rmtpeercopy, (u_short)sp->s_port, pwd->pw_name,
                                      tuser, rmt, &errfd);
                if (tormtape < 0) {
                        msg("login to %s as %s failed.\n", rmtpeer, tuser);
@@ -247,8 +261,8 @@ rmtgetconn(void)
 static int
 okname(const char *cp0)
 {
-       register const char *cp;
-       register int c;
+       const char *cp;
+       int c;
 
        for (cp = cp0; *cp; cp++) {
                c = *cp;
@@ -261,11 +275,17 @@ okname(const char *cp0)
 }
 
 int
-rmtopen(const char *tape, int mode)
+rmtopen(const char *tape, const int mode)
 {
        char buf[MAXPATHLEN];
-
-       (void)snprintf(buf, sizeof (buf), "O%s\n%d\n", tape, mode);
+       char *rmtflags;
+
+       rmtflags = rmtflags_tochar(mode);
+       (void)snprintf(buf, sizeof (buf), "O%s\n%d %s\n", 
+                      tape, 
+                      mode & O_ACCMODE, 
+                      rmtflags);
+       free(rmtflags);
        rmtstate = TS_OPEN;
        return (rmtcall(tape, buf));
 }
@@ -305,7 +325,7 @@ rmtwrite(const char *buf, size_t count)
 {
        char line[30];
 
-       (void)snprintf(line, sizeof (line), "W%d\n", count);
+       (void)snprintf(line, sizeof (line), "W%ld\n", (long)count);
        write(tormtape, line, strlen(line));
        write(tormtape, buf, count);
        return (rmtreply("write"));
@@ -325,13 +345,13 @@ struct    mtget mts;
 struct mtget *
 rmtstatus(void)
 {
-       register int i;
-       register char *cp;
+       int i;
+       char *cp;
 
        if (rmtstate != TS_OPEN)
                return (NULL);
        rmtcall("status", "S\n");
-       for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++)
+       for (i = 0, cp = (char *)&mts; i < (int)sizeof(mts); i++)
                *cp++ = rmtgetb();
        return (&mts);
 }
@@ -351,7 +371,7 @@ static int
 rmtcall(const char *cmd, const char *buf)
 {
 
-       if (write(tormtape, buf, strlen(buf)) != strlen(buf))
+       if (write(tormtape, buf, strlen(buf)) != (ssize_t)strlen(buf))
                rmtconnaborted(0);
        return (rmtreply(cmd));
 }
@@ -359,7 +379,7 @@ rmtcall(const char *cmd, const char *buf)
 static int
 rmtreply(const char *cmd)
 {
-       register char *cp;
+       char *cp;
        char code[30], emsg[BUFSIZ];
 
        rmtgets(code, sizeof (code));
@@ -398,7 +418,7 @@ rmtgetb(void)
 static void
 rmtgets(char *line, size_t len)
 {
-       register char *cp = line;
+       char *cp = line;
 
        while (len > 1) {
                *cp = rmtgetb();
@@ -450,6 +470,7 @@ int piped_child(const char **command) {
                        msg ("cannot dup2 pipe: %s\n", strerror(errno));
                        exit(1);
                }
+               setpgid(0, getpid());
                execvp (command[0], (char *const *) command);
                msg("cannot exec %s: %s\n", command[0], strerror(errno));
                exit(1);