* 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.9 2000/01/11 12:33:44 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>
#include <ctype.h>
#include <errno.h>
#include <compaterr.h>
+#include <rmtflags.h>
#include <netdb.h>
#include <pwd.h>
#include <stdio.h>
#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
}
static void
-rmtconnaborted(int signo)
+rmtconnaborted(UNUSED(int signo))
{
msg("Lost connection to remote host.\n");
if (errfd != -1) {
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;
int size;
int throughput;
int on;
+ char *rmtpeercopy;
rsh = getenv("RSH");
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);
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;
}
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));
}
{
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"));
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);
}
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));
}
static int
rmtreply(const char *cmd)
{
- register char *cp;
+ char *cp;
char code[30], emsg[BUFSIZ];
rmtgets(code, sizeof (code));
static void
rmtgets(char *line, size_t len)
{
- register char *cp = line;
+ char *cp = line;
while (len > 1) {
*cp = rmtgetb();