* 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 <pop@cybercable.fr>, 1999-2000
*/
/*-
#ifndef lint
static const char rcsid[] =
- "$Id: dumprmt.c,v 1.7 1999/10/30 22:55:50 tiniou Exp $";
+ "$Id: dumprmt.c,v 1.12 2000/11/03 18:28:58 stelian Exp $";
#endif /* not lint */
#ifdef __linux__
static int rmtstate = TS_CLOSED;
static int tormtape = -1;
static int fromrmtape = -1;
+int rshpid = -1;
static const char *rmtpeer = 0;
static int okname __P((const char *));
int size;
int throughput;
int on;
+ char *rmtpeercopy;
rsh = getenv("RSH");
rshcmd[4] = rmt;
rshcmd[5] = NULL;
- if (piped_child(rshcmd) < 0) {
+ /* 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);
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);