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 labels for partial updates.
[unix-history]
/
usr
/
src
/
usr.bin
/
rdist
/
main.c
diff --git
a/usr/src/usr.bin/rdist/main.c
b/usr/src/usr.bin/rdist/main.c
index
e4bdf15
..
2ec01c8
100644
(file)
--- a/
usr/src/usr.bin/rdist/main.c
+++ b/
usr/src/usr.bin/rdist/main.c
@@
-1,5
+1,5
@@
#ifndef lint
#ifndef lint
-static char *sccsid = "@(#)main.c 4.
3 (Berkeley) 83/10/10
";
+static char *sccsid = "@(#)main.c 4.
11 (Berkeley) 84/04/09
";
#endif
#include "defs.h"
#endif
#include "defs.h"
@@
-9,46
+9,33
@@
static char *sccsid = "@(#)main.c 4.3 (Berkeley) 83/10/10";
*/
char *distfile = "distfile";
*/
char *distfile = "distfile";
-char tmpfile[] = "/tmp/rdist
A
XXXXXX";
+char tmpfile[] = "/tmp/rdistXXXXXX";
char *tmpname = &tmpfile[5];
char *tmpname = &tmpfile[5];
-char *tmpinc = &tmpfile[10];
int debug; /* debugging flag */
int nflag; /* NOP flag, just print commands without executing */
int qflag; /* Quiet. Don't print messages */
int debug; /* debugging flag */
int nflag; /* NOP flag, just print commands without executing */
int qflag; /* Quiet. Don't print messages */
-int vflag; /* verify only */
-int yflag; /* update iff remote younger than master */
+int options; /* global options */
int iamremote; /* act as remote server for transfering files */
int iamremote; /* act as remote server for transfering files */
-int filec; /* number of files to update */
-char **filev; /* list of files/directories to update */
FILE *fin = NULL; /* input file pointer */
FILE *fin = NULL; /* input file pointer */
-int rem =
0;
/* file descriptor to remote source/sink process */
+int rem =
-1;
/* file descriptor to remote source/sink process */
char host[32]; /* host name */
char host[32]; /* host name */
-int
errs;
/* number of errors while sending/receiving */
+int
nerrs;
/* number of errors while sending/receiving */
char user[10]; /* user's name */
char homedir[128]; /* user's home directory */
int userid; /* user's user ID */
int groupid; /* user's group ID */
char user[10]; /* user's name */
char homedir[128]; /* user's home directory */
int userid; /* user's user ID */
int groupid; /* user's group ID */
-int iamupdate;
-int cleanup();
-int lostconn();
+struct passwd *pw; /* pointer to static area used by getpwent */
+struct group *gr; /* pointer to static area used by getgrent */
main(argc, argv)
int argc;
char *argv[];
{
register char *arg;
main(argc, argv)
int argc;
char *argv[];
{
register char *arg;
- register struct passwd *pw;
-
- arg = rindex(argv[0], '/');
- if (arg == NULL)
- arg = argv[0];
- else
- arg++;
- if (!strcmp(arg, "update"))
- iamupdate++;
+ int cmdargs = 0;
pw = getpwuid(userid = getuid());
if (pw == NULL) {
pw = getpwuid(userid = getuid());
if (pw == NULL) {
@@
-85,7
+72,15
@@
main(argc, argv)
debug++;
break;
debug++;
break;
+ case 'c':
+ cmdargs++;
+ break;
+
case 'n':
case 'n':
+ if (options & VERIFY) {
+ printf("rdist: -n overrides -v\n");
+ options &= ~VERIFY;
+ }
nflag++;
break;
nflag++;
break;
@@
-93,12
+88,28
@@
main(argc, argv)
qflag++;
break;
qflag++;
break;
+ case 'b':
+ options |= COMPARE;
+ break;
+
+ case 'R':
+ options |= REMOVE;
+ break;
+
case 'v':
case 'v':
- vflag++;
+ if (nflag) {
+ printf("rdist: -n overrides -v\n");
+ break;
+ }
+ options |= VERIFY;
+ break;
+
+ case 'w':
+ options |= WHOLE;
break;
case 'y':
break;
case 'y':
-
yflag++
;
+
options |= YOUNGER
;
break;
default:
break;
default:
@@
-107,122
+118,97
@@
main(argc, argv)
}
mktemp(tmpfile);
}
mktemp(tmpfile);
- signal(SIGPIPE, lostconn);
+
if (iamremote) {
server();
if (iamremote) {
server();
- exit(errs);
+ exit(
n
errs);
}
}
- signal(SIGHUP, cleanup);
- signal(SIGINT, cleanup);
- signal(SIGQUIT, cleanup);
- signal(SIGTERM, cleanup);
-
- if (iamupdate)
- doupdate(argc, argv);
+ if (cmdargs)
+ docmdargs(argc, argv);
else {
else {
- filec = argc;
- filev = argv;
if (fin == NULL && (fin = fopen(distfile, "r")) == NULL) {
perror(distfile);
exit(1);
}
yyparse();
if (fin == NULL && (fin = fopen(distfile, "r")) == NULL) {
perror(distfile);
exit(1);
}
yyparse();
+ if (nerrs == 0)
+ docmds(argc, argv);
}
}
- exit(errs);
+ exit(
n
errs);
}
usage()
{
}
usage()
{
- printf("Usage: rdist [-f distfile] [-d var=value] [-nqyD] [file ...]\n");
+ printf("Usage: rdist [-nqbrvwyD] [-f distfile] [-d var=value] [file ...]\n");
+ printf("or: rdist [-nqbrvwyD] -c source [...] machine[:dest]\n");
exit(1);
}
/*
* rcp like interface for distributing files.
*/
exit(1);
}
/*
* rcp like interface for distributing files.
*/
-do
update
(nargs, args)
+do
cmdargs
(nargs, args)
int nargs;
char *args[];
{
int nargs;
char *args[];
{
- struct block *bp, *files, *hosts, *cmds, *prev;
+ register struct namelist *nl, *prev;
+ register char *cp;
+ struct namelist *files, *hosts;
+ struct subcmd *cmds;
+ char *dest;
+ static struct namelist tnl = { NULL, NULL };
int i;
int i;
- char *pos, dest[BUFSIZ];
if (nargs < 2)
if (nargs < 2)
- u
pu
sage();
+ usage();
prev = NULL;
prev = NULL;
- bp = files = ALLOC(block);
- for (i = 0; i < nargs - 1; bp = ALLOC(block), i++) {
- bp->b_type = NAME;
-
bp->b_name = args[i]
;
- if (prev != NULL)
- prev->
b_next = bp
;
-
bp->b_next = bp->b_args = NULL
;
- prev = bp;
+ for (i = 0; i < nargs - 1; i++) {
+ nl = makenl(args[i]);
+ if (prev == NULL)
+
files = prev = nl
;
+ else {
+ prev->
n_next = nl
;
+
prev = nl
;
+ }
}
}
- hosts = ALLOC(block);
- hosts->b_type = NAME;
- hosts->b_name = args[i];
- hosts->b_name = args[i];
- hosts->b_next = hosts->b_args = NULL;
- if ((pos = index(hosts->b_name, ':')) != NULL) {
- *pos++ = '\0';
- strcpy(dest, pos);
- } else
- dest[0] = '\0';
+ cp = args[i];
+ if ((dest = index(cp, ':')) != NULL)
+ *dest++ = '\0';
+ tnl.n_name = cp;
+ hosts = expand(&tnl, E_ALL);
- hosts = expand(hosts, 0);
-
- if (dest[0] == '\0')
+ if (dest == NULL || *dest == '\0')
cmds = NULL;
else {
cmds = NULL;
else {
- cmds = ALLOC(block);
- if (vflag)
- cmds->b_type = VERIFY;
- else
- cmds->b_type = INSTALL;
- cmds->b_name = dest;
- cmds->b_next = cmds->b_args = NULL;
+ cmds = makesubcmd(INSTALL);
+ cmds->sc_options = options;
+ cmds->sc_name = dest;
}
if (debug) {
}
if (debug) {
- printf("do
update
()\nfiles = ");
+ printf("do
cmdargs
()\nfiles = ");
prnames(files);
printf("hosts = ");
prnames(hosts);
}
prnames(files);
printf("hosts = ");
prnames(hosts);
}
- dohcmds(files, hosts, cmds);
-}
-
-upusage()
-{
- printf("Usage: update [-nqyD] source [...] machine[:dest]\n");
- exit(1);
-}
-
-/*
- * Remove temporary files and do any cleanup operations before exiting.
- */
-cleanup()
-{
- (void) unlink(tmpfile);
- exit(1);
+ insert(NULL, files, hosts, cmds);
+ docmds(0, NULL);
}
/*
* Print a list of NAME blocks (mostly for debugging).
*/
}
/*
* Print a list of NAME blocks (mostly for debugging).
*/
-prnames(
bp
)
- register struct
block *bp
;
+prnames(
nl
)
+ register struct
namelist *nl
;
{
printf("( ");
{
printf("( ");
- while (
bp
!= NULL) {
- printf("%s ",
bp->b
_name);
-
bp = bp->b
_next;
+ while (
nl
!= NULL) {
+ printf("%s ",
nl->n
_name);
+
nl = nl->n
_next;
}
printf(")\n");
}
}
printf(")\n");
}