projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added depend label
[unix-history]
/
usr
/
src
/
usr.bin
/
rdist
/
docmd.c
diff --git
a/usr/src/usr.bin/rdist/docmd.c
b/usr/src/usr.bin/rdist/docmd.c
index
ae30109
..
478d07c
100644
(file)
--- a/
usr/src/usr.bin/rdist/docmd.c
+++ b/
usr/src/usr.bin/rdist/docmd.c
@@
-1,12
+1,23
@@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
#ifndef lint
#ifndef lint
-static char
*sccsid = "@(#)docmd.c 4.19 (Berkeley) 84/04/06
";
-#endif
+static char
sccsid[] = "@(#)docmd.c 5.1 (Berkeley) %G%
";
+#endif
not lint
#include "defs.h"
#include <setjmp.h>
#include "defs.h"
#include <setjmp.h>
+#include <netdb.h>
+
+#ifndef RDIST
+#define RDIST "/usr/ucb/rdist"
+#endif
FILE *lfp; /* log file for recording files updated */
FILE *lfp; /* log file for recording files updated */
-struct subcmd *s
pecial; /* list of special commands
*/
+struct subcmd *s
ubcmds; /* list of sub-commands for current cmd
*/
jmp_buf env;
int cleanup();
jmp_buf env;
int cleanup();
@@
-15,7
+26,8
@@
int lostconn();
/*
* Do the commands in cmds (initialized by yyparse).
*/
/*
* Do the commands in cmds (initialized by yyparse).
*/
-docmds(argc, argv)
+docmds(dhosts, argc, argv)
+ char **dhosts;
int argc;
char **argv;
{
int argc;
char **argv;
{
@@
-30,10
+42,17
@@
docmds(argc, argv)
signal(SIGTERM, cleanup);
for (c = cmds; c != NULL; c = c->c_next) {
signal(SIGTERM, cleanup);
for (c = cmds; c != NULL; c = c->c_next) {
+ if (dhosts != NULL && *dhosts != NULL) {
+ for (cpp = dhosts; *cpp; cpp++)
+ if (strcmp(c->c_name, *cpp) == 0)
+ goto fndhost;
+ continue;
+ }
+ fndhost:
if (argc) {
for (cpp = argv; *cpp; cpp++) {
if (c->c_label != NULL &&
if (argc) {
for (cpp = argv; *cpp; cpp++) {
if (c->c_label != NULL &&
- strcmp(c->c_label,
(*cpp)+1
) == 0) {
+ strcmp(c->c_label,
*cpp
) == 0) {
cpp = NULL;
goto found;
}
cpp = NULL;
goto found;
}
@@
-71,7
+90,7
@@
doarrow(filev, files, rhost, cmds)
register struct namelist *f;
register struct subcmd *sc;
register char **cpp;
register struct namelist *f;
register struct subcmd *sc;
register char **cpp;
- int n, ddir;
+ int n, ddir
, opts = options
;
if (debug)
printf("doarrow(%x, %s, %x)\n", files, rhost, cmds);
if (debug)
printf("doarrow(%x, %s, %x)\n", files, rhost, cmds);
@@
-80,12
+99,9
@@
doarrow(filev, files, rhost, cmds)
error("no files to be updated\n");
return;
}
error("no files to be updated\n");
return;
}
- if (!mkexceptlist(cmds))
- return;
- special = cmds;
+ subcmds = cmds;
ddir = files->n_next != NULL; /* destination is a directory */
ddir = files->n_next != NULL; /* destination is a directory */
-
if (nflag)
printf("updating host %s\n", rhost);
else {
if (nflag)
printf("updating host %s\n", rhost);
else {
@@
-116,6
+132,7
@@
doarrow(filev, files, rhost, cmds)
n++;
install(f->n_name, sc->sc_name,
sc->sc_name == NULL ? 0 : ddir, sc->sc_options);
n++;
install(f->n_name, sc->sc_name,
sc->sc_name == NULL ? 0 : ddir, sc->sc_options);
+ opts = sc->sc_options;
}
if (n == 0)
install(f->n_name, NULL, 0, options);
}
if (n == 0)
install(f->n_name, NULL, 0, options);
@@
-129,8
+146,16
@@
done:
for (sc = cmds; sc != NULL; sc = sc->sc_next)
if (sc->sc_type == NOTIFY)
notify(tmpfile, rhost, sc->sc_args, 0);
for (sc = cmds; sc != NULL; sc = sc->sc_next)
if (sc->sc_type == NOTIFY)
notify(tmpfile, rhost, sc->sc_args, 0);
- if (!nflag)
+ if (!nflag)
{
(void) unlink(tmpfile);
(void) unlink(tmpfile);
+ for (; ihead != NULL; ihead = ihead->nextp) {
+ free(ihead);
+ if ((opts & IGNLNKS) || ihead->count == 0)
+ continue;
+ log(lfp, "%s: Warning: missing links\n",
+ ihead->pathname);
+ }
+ }
}
/*
}
/*
@@
-141,8
+166,11
@@
makeconn(rhost)
{
register char *ruser, *cp;
static char *cur_host = NULL;
{
register char *ruser, *cp;
static char *cur_host = NULL;
+ static int port = -1;
+ char tuser[20];
int n;
extern char user[];
int n;
extern char user[];
+ extern int userid;
if (debug)
printf("makeconn(%s)\n", rhost);
if (debug)
printf("makeconn(%s)\n", rhost);
@@
-152,26
+180,42
@@
makeconn(rhost)
return(1);
closeconn();
}
return(1);
closeconn();
}
-
- ruser = rindex(rhost, '.');
- if (ruser != NULL) {
- *ruser++ = '\0';
- if (!okname(ruser))
+ cur_host = rhost;
+ cp = index(rhost, '@');
+ if (cp != NULL) {
+ char c = *cp;
+
+ *cp = '\0';
+ strncpy(tuser, rhost, sizeof(tuser)-1);
+ *cp = c;
+ rhost = cp + 1;
+ ruser = tuser;
+ if (*ruser == '\0')
+ ruser = user;
+ else if (!okname(ruser))
return(0);
} else
ruser = user;
if (!qflag)
printf("updating host %s\n", rhost);
return(0);
} else
ruser = user;
if (!qflag)
printf("updating host %s\n", rhost);
- (void) sprintf(buf, "/usr/local/rdist -Server%s", qflag ? " -q" : "");
+ (void) sprintf(buf, "%s -Server%s", RDIST, qflag ? " -q" : "");
+ if (port < 0) {
+ struct servent *sp;
+
+ if ((sp = getservbyname("shell", "tcp")) == NULL)
+ fatal("shell/tcp: unknown service");
+ port = sp->s_port;
+ }
if (debug) {
if (debug) {
- printf("
luser = %s, ruser = %s\n"
, user, ruser);
+ printf("
port = %d, luser = %s, ruser = %s\n", ntohs(port)
, user, ruser);
printf("buf = %s\n", buf);
}
fflush(stdout);
printf("buf = %s\n", buf);
}
fflush(stdout);
- cur_host = rhost;
- rem = rcmd(&rhost, IPPORT_CMDSERVER, user, ruser, buf, 0);
+ setreuid(userid, 0);
+ rem = rcmd(&rhost, port, user, ruser, buf, 0);
+ setreuid(0, userid);
if (rem < 0)
return(0);
cp = buf;
if (rem < 0)
return(0);
cp = buf;
@@
-189,8
+233,9
@@
makeconn(rhost)
n = (n * 10) + (*cp++ - '0');
if (*cp == '\0' && n == VERSION)
return(1);
n = (n * 10) + (*cp++ - '0');
if (*cp == '\0' && n == VERSION)
return(1);
- }
- error("connection failed: version numbers don't match\n");
+ error("connection failed: version numbers don't match (local %d, remote %d)\n", VERSION, n);
+ } else
+ error("connection failed: version numbers don't match\n");
closeconn();
return(0);
}
closeconn();
return(0);
}
@@
-265,9
+310,6
@@
dodcolon(filev, files, stamp, cmds)
error("no files to be updated\n");
return;
}
error("no files to be updated\n");
return;
}
- if (!mkexceptlist(cmds))
- return;
-
if (stat(stamp, &stb) < 0) {
error("%s: %s\n", stamp, sys_errlist[errno]);
return;
if (stat(stamp, &stb) < 0) {
error("%s: %s\n", stamp, sys_errlist[errno]);
return;
@@
-275,6
+317,7
@@
dodcolon(filev, files, stamp, cmds)
if (debug)
printf("%s: %d\n", stamp, stb.st_mtime);
if (debug)
printf("%s: %d\n", stamp, stb.st_mtime);
+ subcmds = cmds;
lastmod = stb.st_mtime;
if (nflag || (options & VERIFY))
tfp = NULL;
lastmod = stb.st_mtime;
if (nflag || (options & VERIFY))
tfp = NULL;
@@
-320,7
+363,7
@@
cmptime(name)
if (debug)
printf("cmptime(%s)\n", name);
if (debug)
printf("cmptime(%s)\n", name);
- if (
inlist(except,
name))
+ if (
except(
name))
return;
if (nflag) {
return;
if (nflag) {
@@
-476,8
+519,6
@@
notify(file, rhost, to, lmod)
(void) pclose(pf);
}
(void) pclose(pf);
}
-struct namelist *except; /* list of files to exclude */
-
/*
* Return true if name is in the list.
*/
/*
* Return true if name is in the list.
*/
@@
-494,35
+535,32
@@
inlist(list, file)
}
/*
}
/*
- *
Build the exception list from the EXCEPT commands
.
+ *
Return TRUE if file is in the exception list
.
*/
*/
-
mkexceptlist(cmds
)
-
struct subcmd *cmds
;
+
except(file
)
+
char *file
;
{
{
- register struct subcmd *sc;
- register struct namelist *
el, *
nl;
+ register struct subcmd *sc;
+ register struct namelist *nl;
if (debug)
if (debug)
- printf("
mkexceptlist()\n"
);
+ printf("
except(%s)\n", file
);
- except = el = NULL;
- for (sc = cmds; sc != NULL; sc = sc->sc_next) {
- if (sc->sc_type != EXCEPT)
+ for (sc = subcmds; sc != NULL; sc = sc->sc_next) {
+ if (sc->sc_type != EXCEPT && sc->sc_type != PATTERN)
continue;
for (nl = sc->sc_args; nl != NULL; nl = nl->n_next) {
continue;
for (nl = sc->sc_args; nl != NULL; nl = nl->n_next) {
- if (el == NULL)
- except = el = makenl(nl->n_name);
- else {
- el->n_next = makenl(nl->n_name);
- el = el->n_next;
+ if (sc->sc_type == EXCEPT) {
+ if (!strcmp(file, nl->n_name))
+ return(1);
+ continue;
}
}
+ re_comp(nl->n_name);
+ if (re_exec(file) > 0)
+ return(1);
}
}
}
}
- if (debug) {
- printf("except = ");
- prnames(except);
- }
- return(1);
+ return(0);
}
char *
}
char *