Research V7 development
authorD. A. Nowitz <dan@research.uucp>
Thu, 11 Jan 1979 19:54:35 +0000 (14:54 -0500)
committerD. A. Nowitz <dan@research.uucp>
Thu, 11 Jan 1979 19:54:35 +0000 (14:54 -0500)
Work on file usr/src/cmd/uucp/uux.c
Work on file usr/src/cmd/uucp/getprm.c

Co-Authored-By: Michael E. Lesk <mel@research.uucp>
Synthesized-from: v7

usr/src/cmd/uucp/getprm.c [new file with mode: 0644]
usr/src/cmd/uucp/uux.c [new file with mode: 0644]

diff --git a/usr/src/cmd/uucp/getprm.c b/usr/src/cmd/uucp/getprm.c
new file mode 100644 (file)
index 0000000..758ee87
--- /dev/null
@@ -0,0 +1,97 @@
+#include <stdio.h>
+
+#define LQUOTE '('
+#define RQUOTE ')'
+#define NOSYSPART      0
+#define HASSYSPART     1
+
+/*******
+ *     char *
+ *     getprm(s, prm)  get next parameter from s
+ *     char *s, *prm;
+ *
+ *     return - pointer to next character in s
+ */
+
+char *
+getprm(s, prm)
+char *s, *prm;
+{
+       char *c;
+
+       while (*s == ' ' || *s == '\t' || *s == '\n')
+               s++;
+
+       *prm = '\0';
+       if (*s == '\0')
+               return(NULL);
+
+       if (*s == '>' || *s == '<' || *s == '|'
+       || *s == ';') {
+               *prm++ = *s++;
+               *prm = '\0';
+               return(s);
+       }
+
+       /* look for quoted argument */
+       if (*s == LQUOTE) {
+               if ((c = index(s + 1, RQUOTE)) != NULL) {
+                       c++;
+                       while (c != s)
+                               *prm++ = *s++;
+                       *prm = '\0';
+                       return(s);
+               }
+       }
+
+       while (*s != ' ' && *s != '\t' && *s != '<'
+       && *s != '>' && *s != '|' && *s != '\0'
+       && *s != ';' && *s != '\n')
+               *prm++ = *s++;
+       *prm = '\0';
+
+       return(s);
+}
+
+/***
+ *     split(name, sys, rest)  split into system and file part
+ *     char *name, *sys, *rest;
+
+ *
+ *     return codes:
+ *             NOSYSPART
+ *             HASSYSPART
+ */
+
+split(name, sys, rest)
+char *name, *sys, *rest;
+{
+       char *c;
+       int i;
+
+       if (*name == LQUOTE) {
+               if ((c = index(name + 1, RQUOTE)) != NULL) {
+               /* strip off quotes */
+                       name++;
+                       while (c != name)
+                               *rest++ = *name++;
+                       *rest = '\0';
+                       *sys = '\0';
+                       return(NOSYSPART);
+               }
+       }
+
+       if ((c = index(name, '!')) == NULL) {
+               strcpy(rest, name);
+               *sys = '\0';
+               return(NOSYSPART);
+       }
+
+       *c = '\0';
+       for (i = 0; i < 7; i++)
+               if ((*sys++ = *name++) == '\0')
+                       break;
+
+       strcpy(rest, ++c);
+       return(HASSYSPART);
+}
diff --git a/usr/src/cmd/uucp/uux.c b/usr/src/cmd/uucp/uux.c
new file mode 100644 (file)
index 0000000..6f8bc98
--- /dev/null
@@ -0,0 +1,327 @@
+#include "uucp.h"
+#include "uucpdefs.h"
+
+#define NOSYSPART 0
+#define HASSYSPART 1
+
+#define APPCMD(d) {\
+char *p;\
+for (p = d; *p != '\0';) *cmdp++ = *p++;\
+*cmdp++ = ' ';\
+*cmdp = '\0';}
+
+#define GENSEND(f, a, b, c, d) {\
+fprintf(f, "S %s %s %s - %s 0666\n", a, b, c, d);\
+}
+#define GENRCV(f, a, b, c) {\
+fprintf(f, "R %s %s %s - \n", a, b, c);\
+}
+/*
+ *     
+ */
+
+main(argc, argv)
+char *argv[];
+{
+       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  */
+       char buf[BUFSIZ];
+       char inargs[BUFSIZ];
+       int pipein = 0;
+       int startjob = 1;
+       char path[MAXFULLNAME];
+       char cmd[BUFSIZ];
+       char *ap, *cmdp;
+       char prm[BUFSIZ];
+       char syspart[8], rest[MAXFULLNAME];
+       char xsys[8], local[8];
+       FILE *fprx, *fpc, *fpd, *fp;
+       FILE *xqtstr();
+       extern char *getprm(), *index(), *lastpart();
+       int uid, ret;
+       char redir = '\0';
+
+       Debug = 0;
+       Ofn = 1;
+       Ifn = 0;
+       while (argc>1 && argv[1][0] == '-') {
+               switch(argv[1][1]){
+               case 'p':
+               case '\0':
+                       pipein = 1;
+                       break;
+               case 'r':
+                       startjob = 0;
+                       break;
+               case 'x':
+                       Debug = atoi(&argv[1][2]);
+                       if (Debug <= 0)
+                               Debug = 1;
+                       break;
+               default:
+                       sprintf(stderr, "unknown flag %s\n", argv[1]);
+                               break;
+               }
+               --argc;  argv++;
+       }
+
+       DEBUG(4, "\n\n** %s **\n", "START");
+
+       inargs[0] = '\0';
+       for (argv++; argc > 1; argc--) {
+               DEBUG(4, "arg - %s:", *argv);
+               strcat(inargs, " ");
+               strcat(inargs, *argv++);
+       }
+       DEBUG(4, "arg - %s\n", inargs);
+       ret = gwd(Wrkdir);
+       ASSERT(ret == 0, "GWD FAILED %d", ret);
+       chdir(Spool);
+       uid = getuid();
+       guinfo(uid, User, path);
+
+       sprintf(local, "%.7s", Myname);
+       cmdp = cmd;
+       *cmdp = '\0';
+       gename(DATAPRE, local, 'X', rxfile);
+       fprx = fopen(rxfile, "w");
+       ASSERT(fprx != NULL, "CAN'T OPEN %s", rxfile);
+       chmod(rxfile, 0666);
+       gename(DATAPRE, local, 'T', tcfile);
+       fpc = fopen(tcfile, "w");
+       ASSERT(fpc != NULL, "CAN'T OPEN %s", tcfile);
+       chmod(tcfile, 0666);
+       fprintf(fprx, "%c %s %s\n", X_USER, User, local);
+
+       /* find remote system name */
+       ap = inargs;
+       while ((ap = getprm(ap, prm)) != NULL) {
+               if (prm[0] == '>' || prm[0] == '<') {
+                       ap = getprm(ap, prm);
+                       continue;
+               }
+
+               if (prm[0] == ';') {
+                       APPCMD(prm);
+                       continue;
+               }
+
+               split(prm, xsys, rest);
+               if (xsys[0] == '\0')
+                       strcpy(xsys, local);
+               break;
+       }
+       DEBUG(4, "xsys %s\n", xsys);
+       if (versys(xsys) != 0) {
+               /*  bad system name  */
+               fprintf(stderr, "bad system name: %s\n", xsys);
+               fclose(fprx);
+               fclose(fpc);
+               unlink(rxfile);
+               unlink(tcfile);
+               cleanup(101);
+       }
+
+       if (pipein) {
+               gename(DATAPRE, xsys, 'B', dfile);
+               fpd = fopen(dfile, "w");
+               ASSERT(fpd != NULL, "CAN'T OPEN %s", dfile);
+               chmod(dfile, 0666);
+               while (fgets(buf, BUFSIZ, stdin) != NULL)
+                       fputs(buf, fpd);
+               fclose(fpd);
+               if (strcmp(local, xsys) != SAME) {
+                       GENSEND(fpc, dfile, dfile, User, dfile);
+                       cflag++;
+               }
+               fprintf(fprx, "%c %s\n", X_RQDFILE, dfile);
+               fprintf(fprx, "%c %s\n", X_STDIN, dfile);
+       }
+       /* parse command */
+       ap = inargs;
+       while ((ap = getprm(ap, prm)) != NULL) {
+               DEBUG(4, "prm - %s\n", prm);
+               if (prm[0] == '>' || prm[0] == '<') {
+                       redir = prm[0];
+                       continue;
+               }
+
+               if (prm[0] == '|' || prm[0] == '^') {
+                       if (cmdp != cmd)
+                               APPCMD(prm);
+                       continue;
+               }
+
+               /* 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 (syspart[0] == '\0')
+                       strcpy(syspart, local);
+
+               if (cmdp == cmd && redir == '\0') {
+                       /* command */
+                       APPCMD(rest);
+                       continue;
+               }
+
+               /* process file or option */
+               DEBUG(4, "file s- %s, ", syspart);
+               DEBUG(4, "local - %s\n", local);
+               /* process file */
+               if (redir == '>') {
+                       if (rest[0] != '~')
+                               expfile(rest);
+                       fprintf(fprx, "%c %s %s\n", X_STDOUT, rest,
+                        syspart);
+                       redir = '\0';
+                       continue;
+               }
+
+               if (ret == NOSYSPART) {
+                       /* option */
+                       APPCMD(rest);
+                       continue;
+               }
+
+               if (strcmp(xsys, local) == SAME
+                && strcmp(xsys, syspart) == SAME) {
+                       expfile(rest);
+                       if (redir == '<')
+                               fprintf(fprx, "%c %s\n", X_STDIN, rest);
+                       else
+                               APPCMD(rest);
+                       redir = '\0';
+                       continue;
+               }
+
+               if (strcmp(syspart, local) == SAME) {
+                       /*  generate send file */
+                       expfile(rest);
+                       gename(DATAPRE, xsys, 'A', dfile);
+                       if (redir == '<') {
+                               fprintf(fprx, "%c %s\n", X_STDIN, dfile);
+                       }
+                       DEBUG(4, "rest %s\n", rest);
+                       if (chkpth(User, "", rest) != 0) {
+                               fprintf(stderr, "permission denied %s\n", rest);
+                               cleanup(1);
+                       }
+                       if (xcp(rest, dfile) != 0)
+                               cleanup(1);
+                       GENSEND(fpc, rest, dfile, User, dfile);
+                       cflag++;
+                       fprintf(fprx, "%c %s %s\n", X_RQDFILE,
+                        dfile, lastpart(rest));
+                       if (redir != '<')
+                               APPCMD(lastpart(rest));
+                       redir = '\0';
+                       continue;
+               }
+
+               if (strcmp(local, xsys) == SAME) {
+                       /*  generate local receive  */
+                       gename(CMDPRE, syspart, 'R', tfile);
+                       strcpy(dfile, tfile);
+                       dfile[0] = DATAPRE;
+                       fp = fopen(tfile, "w");
+                       ASSERT(fp != NULL, "CAN'T OPEN %s", tfile);
+                       chmod(tfile, 0666);
+                       expfile(rest);
+                       GENRCV(fp, rest, dfile, User);
+                       fclose(fp);
+                       rflag++;
+                       fprintf(fprx, "%c %s %s\n", X_RQDFILE, dfile,
+                         lastpart(rest));
+                       if (rest[0] != '~')
+                               expfile(rest);
+                       if (redir == '<')
+                               fprintf(fprx, "%c %s\n", X_STDIN, dfile);
+                       else
+                               APPCMD(lastpart(rest));
+                       redir = '\0';
+                       continue;
+               }
+
+               if (strcmp(syspart, xsys) != SAME) {
+                       /* generate remote receives */
+                       gename(DATAPRE, syspart, 'R', dfile);
+                       strcpy(tfile, dfile);
+                       tfile[0] = CMDPRE;
+                       fpd = fopen(dfile, "w");
+                       ASSERT(fpd != NULL, "CAN'T OPEN %s", dfile);
+                       chmod(dfile, 0666);
+                       gename(DATAPRE, xsys, 'T', t2file);
+                       GENRCV(fpd, rest, t2file, User);
+                       fclose(fpd);
+                       GENSEND(fpc, dfile, tfile, User, dfile);
+                       cflag++;
+                       fprintf(fprx, "%c %s %s\n", X_RQDFILE, t2file,
+                         lastpart(rest));
+                       if (redir == '<')
+                               fprintf(fprx, "%c %s\n", X_STDIN, t2file);
+                       else
+                               APPCMD(lastpart(rest));
+                       redir = '\0';
+                       continue;
+               }
+
+               /* file on remote system */
+               if (rest[0] != '~')
+                       expfile(rest);
+               if (redir == '<')
+                       fprintf(fprx, "%c %s\n", X_STDIN, rest);
+               else
+                       APPCMD(rest);
+               redir = '\0';
+               continue;
+
+       }
+
+       fprintf(fprx, "%c %s\n", X_CMD, cmd);
+       fclose(fprx);
+
+       strcpy(tfile, rxfile);
+       tfile[0] = XQTPRE;
+       if (strcmp(xsys, local) == SAME) {
+               link(rxfile, tfile);
+               unlink(rxfile);
+               if (startjob)
+                       if (rflag)
+                               xuucico("");
+                       else
+                               xuuxqt();
+       }
+       else {
+               GENSEND(fpc, rxfile, tfile, User, rxfile);
+               cflag++;
+       }
+
+       fclose(fpc);
+       if (cflag) {
+               gename(CMDPRE, xsys, 'A', cfile);
+               link(tcfile, cfile);
+               unlink(tcfile);
+               if (startjob)
+                       xuucico(xsys);
+               cleanup(0);
+       }
+       else
+               unlink(tcfile);
+}
+
+
+cleanup(code)
+int code;
+{
+       rmlock(NULL);
+       DEBUG(1, "exit code %d\n", code);
+       exit(code);
+}