static char sccsid
[] = "@(#)uux.c 5.8 (Berkeley) %G%";
register char *p; for (p = d; *p != '\0';)\
if(cmdp>(sizeof(cmd)+&cmd[0])){\
fprintf(stderr,"argument list too long\n");\
*cmdp++ = ' '; *cmdp = '\0';}
#define GENSEND(f, a, b, c, d, e) {\
fprintf(f, "S %s %s %s -%s %s 0666\n", a, b, c, d, e); }
#define GENRCV(f, a, b, c) {fprintf(f, "R %s %s %s - \n", a, b, c);}
char cfile
[NAMESIZE
]; /* send commands for files from here */
char dfile
[NAMESIZE
]; /* used for all data files from here */
char rxfile
[NAMESIZE
]; /* to be sent to xqt file (X. ...) */
char tfile
[NAMESIZE
]; /* temporary file name */
char tcfile
[NAMESIZE
]; /* temporary file name */
char t2file
[NAMESIZE
]; /* temporary file name */
int cflag
= 0; /* commands in C. file flag */
int rflag
= 0; /* C. files for receiving flag */
int Copy
= 0; /* Don't Copy spool files */
int Copy
= 1; /* Copy spool files */
int Linkit
= 0; /* Try link before copy */
long Gradedelta
= 100000000L; /* "huge number" */
char syspart
[MAXBASENAME
+1], rest
[MAXFULLNAME
];
char Xsys
[MAXBASENAME
+1], local
[MAXBASENAME
+1];
FILE *fprx
, *fpc
, *fpd
, *fp
;
extern char *getprm(), *lastpart();
while ((c
= getopt(argc
, argv
, "prclCg:x:nzLa:")) != EOF
||
/* getopt doesn't like "-" as an argument... */
Gradedelta
= atol(optarg
+1);
if (prefix(Myname
, ReturnTo
) && ReturnTo
[strlen(Myname
)] == '!')
ReturnTo
= index(ReturnTo
, '!') + 1;
fprintf(stderr
, "unknown flag %s\n", argv
[optind
-1]);
fprintf(stderr
, "can't get working directory; will try to continue\n");
strcpy(Wrkdir
, "/UNKNOWN");
DEBUG(4, "\n\n** %s **\n", "START");
DEBUG(4, "arg - %s:", argv
[optind
]);
strcat(inargs
, argv
[optind
++]);
DEBUG(4, "arg - %s\n", inargs
);
if (subchdir(Spool
) < 0) {
syslog(LOG_WARNING
, "chdir(%s) failed: %m", Spool
);
if (guinfo(uid
, User
, path
) != SUCCESS
) {
syslog(LOG_WARNING
, "Can't find username for uid %d", uid
);
DEBUG(1, "Using username", "uucp");
strncpy(local
, Myname
, MAXBASENAME
);
gename(DATAPRE
, local
, 'X', rxfile
);
fprx
= ufopen(rxfile
, "w");
syslog(LOG_WARNING
, "fopen(%s) failed: %m", rxfile
);
gename(DATAPRE
, local
, 'T', tcfile
);
fpc
= ufopen(tcfile
, "w");
syslog(LOG_WARNING
, "fopen(%s) failed: %m", tcfile
);
fprintf(fprx
, "%c %s %s\n", X_USER
, User
, local
);
fprintf(fprx
, "%c\n", X_NONOTI
);
fprintf(fprx
, "%c\n", X_NONZERO
);
if (ReturnTo
== NULL
|| *ReturnTo
== '\0')
fprintf(fprx
, "%c %s\n", X_RETURNTO
, ReturnTo
);
/* find remote system name */
while ((ap
= getprm(ap
, prm
)) != NULL
) {
if (prm
[0] == '>' || prm
[0] == '<') {
if (versys(&xsys
) != 0) {
fprintf(stderr
, "bad system name: %s\n", xsys
);
strncpy(Rmtname
, xsys
, MAXBASENAME
);
DEBUG(4, "xsys %s\n", xsys
);
gename(DATAPRE
, local
, 'B', dfile
);
fpd
= ufopen(dfile
, "w");
syslog(LOG_WARNING
, "fopen(%s) failed: %m", dfile
);
ret
= fread(buf
, 1, BUFSIZ
, stdin
);
fwrite(buf
, 1, ret
, fpd
);
if (strcmp(local
, xsys
) != SAME
) {
register int Len
= strlen(local
);
GENSEND(fpc
, dfile
, tfile
, User
, "", dfile
);
fprintf(fprx
, "%c %s\n", X_RQDFILE
, tfile
);
fprintf(fprx
, "%c %s\n", X_STDIN
, tfile
);
while ((ap
= getprm(ap
, prm
)) != NULL
) {
DEBUG(4, "prm - %s\n", prm
);
if (prm
[0] == '>' || prm
[0] == '<') {
if (prm
[0] == '|' || prm
[0] == '^') {
/* process command or file or option */
ret
= split(prm
, syspart
, rest
);
DEBUG(4, "s - %s, ", syspart
);
DEBUG(4, "r - %s, ", rest
);
DEBUG(4, "ret - %d\n", ret
);
if (cmdp
== cmd
&& redir
== '\0') {
/* process file or option */
DEBUG(4, "file s- %s, ", syspart
);
DEBUG(4, "local - %s\n", local
);
fprintf(fprx
, "%c %s %s\n", X_STDOUT
, rest
,
if (ret
== NOSYSPART
&& redir
== '\0') {
if (stat(rest
, &stbuf
) < 0)
DEBUG(4, "Can't stat %s\n", rest
);
DEBUG(4, "size = %ld\n", size
);
if (strcmp(xsys
, local
) == SAME
&& strcmp(xsys
, syspart
) == SAME
) {
fprintf(fprx
, "%c %s\n", X_STDIN
, rest
);
if (strcmp(syspart
, local
) == SAME
) {
gename(DATAPRE
, local
, 'A', dfile
);
DEBUG(4, "rest %s\n", rest
);
if ((chkpth(User
, "", rest
) || anyread(rest
)) != 0) {
fprintf(stderr
, "permission denied %s\n", rest
);
if (link(subfile(rest
), subfile(dfile
)) != 0)
GENSEND(fpc
, rest
, dfile
, User
, "", dfile
);
if (Copy
|| link_failed
) {
if (xcp(rest
, dfile
) != 0) {
fprintf(stderr
, "can't copy %s to %s\n", rest
, dfile
);
GENSEND(fpc
, rest
, dfile
, User
, "", dfile
);
GENSEND(fpc
, rest
, dfile
, User
, "c", "D.0");
fprintf(fprx
, "%c %s\n", X_STDIN
, dfile
);
fprintf(fprx
, "%c %s\n", X_RQDFILE
, dfile
);
fprintf(fprx
, "%c %s %s\n", X_RQDFILE
,
if (strcmp(local
, xsys
) == SAME
) {
/* generate local receive */
gename(CMDPRE
, syspart
, 'R', tfile
);
syslog(LOG_WARNING
, "fopen(%s) failed: %m",
GENRCV(fp
, rest
, dfile
, User
);
fprintf(fprx
, "%c %s\n", X_RQDFILE
, dfile
);
fprintf(fprx
, "%c %s\n", X_STDIN
, dfile
);
fprintf(fprx
, "%c %s %s\n", X_RQDFILE
, dfile
,
if (strcmp(syspart
, xsys
) != SAME
) {
/* generate remote receives */
gename(DATAPRE
, syspart
, 'R', dfile
);
fpd
= ufopen(dfile
, "w");
syslog(LOG_WARNING
, "fopen(%s) failed: %m",
gename(DATAPRE
, local
, 'T', t2file
);
GENRCV(fpd
, rest
, t2file
, User
);
GENSEND(fpc
, dfile
, tfile
, User
, "", dfile
);
fprintf(fprx
, "%c %s\n", X_RQDFILE
, t2file
);
fprintf(fprx
, "%c %s\n", X_STDIN
, t2file
);
fprintf(fprx
, "%c %s %s\n", X_RQDFILE
, t2file
,
/* file on remote system */
fprintf(fprx
, "%c %s\n", X_STDIN
, rest
);
* clean up trailing ' ' in command.
if (cmdp
> cmd
&& cmdp
[0] == '\0' && cmdp
[-1] == ' ')
/* block multi-hop uux, which doesn't work */
for (ap
= cmd
; *ap
&& *ap
!= ' '; ap
++)
fprintf(stderr
, "uux handles only adjacent sites.\n");
fprintf(stderr
, "Try uusend for multi-hop delivery.\n");
fprintf(fprx
, "%c %s\n", X_CMD
, cmd
);
logent(cmd
, "COULD NOT QUEUE XQT");
logent(cmd
, "XQT QUE'D");
if (size
> 0 && Gradedelta
> 0) {
DEBUG (4, "Grade changed from %c ", Grade
);
Grade
+= size
/Gradedelta
;
DEBUG(4, "to %c\n", Grade
);
gename(XQTPRE
, local
, Grade
, tfile
);
if (strcmp(xsys
, local
) == SAME
) {
/* rti!trt: xmv() works across filesystems, link(II) doesnt */
GENSEND(fpc
, rxfile
, tfile
, User
, "", rxfile
);
gename(CMDPRE
, xsys
, Grade
, cfile
);
/* rti!trt: use xmv() rather than link(II) */
char Fname
[FTABSIZE
][NAMESIZE
];
* cleanup and unlink if error
* return - none - do exit()
for (i
= 0; i
< Fnamect
; i
++)
unlink(subfile(Fname
[i
]));
fprintf(stderr
, "uux failed. code %d\n", code
);
DEBUG(1, "exit code %d\n", code
);
* open file and record name
strcpy(Fname
[Fnamect
++], file
);
logent("Fname", "TABLE OVERFLOW");
return fopen(subfile(file
), mode
);
* quotes are not stripped from DCL. Do it here.
* Note if we are running under Unix shell we don't
for (; argc
> 0; --argc
, argv
++) {
if (cp
== (char *)0 || *cp
++ != '"')
* split into system and file part
register char *name
, *rest
;
if ((c
= index(name
+ 1, RQUOTE
)) != NULL
) {
if ((c
= index(name
, '!')) == NULL
) {
strncpy(sys
, name
, MAXBASENAME
);