home *** CD-ROM | disk | FTP | other *** search
- #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);
- }
-