home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / UUCP_Blars.lzh / uux.c < prev    next >
C/C++ Source or Header  |  1991-11-02  |  7KB  |  284 lines

  1. /*
  2.  * uux.c
  3.  *
  4.  * Copyrights (c) 1988 by reccoware systems, Wolfgang Ocker, Puchheim
  5.  *
  6.  */
  7. #include <stdio.h>
  8. #include <strings.h>
  9. #include <modes.h>
  10. #include "uucp.h"
  11. #include <pwd.h>
  12. #include <errno.h>
  13.  
  14. #define TRUE  1
  15. #define FALSE 0
  16.  
  17. #define PERMS  (S_IREAD | S_IWRITE)
  18.  
  19. extern char *tzname[2];        /* contains two strings CDT or CST   */
  20. extern int daylight;        /* array reference for above         */
  21.  
  22. extern char *malloc();
  23.  
  24. struct passwd *names;
  25. int     fbfile, fcfile, fdfile;
  26. char    bfile[32], cfile[32], dfile[32], xfile[32];
  27. char    rmtname[16], rmtprog[128], HostName[16];
  28. char   *inpath, tmp[8192], tmp2[256];
  29. char   *p, *ptr, *cp;
  30. char    grade_char = 'N';
  31. int     debug, i, j, queue, progarg, rem_fnam_num;
  32. char   *rem_fnames[30];
  33. char    UserName[32];
  34. int     binfile = 0;
  35.  
  36. static int CheckLegalName();
  37.  
  38. char   *uuarg[] = {"uucico", "-r1", "-x0", NULL, NULL};
  39.  
  40. extern int os9fork();
  41. extern char **environ;
  42.  
  43. main(argc, argv)
  44. int     argc;
  45. char   *argv[];
  46.  
  47. {
  48.     struct passwd *pw;
  49.  
  50.     queue = FALSE;
  51.     progarg = 0;
  52.     inpath = NULL;
  53.  
  54.     if ((pw = getpwuid(getuid())) == NULL)
  55.     strcpy(UserName, "uucp");
  56.     else
  57.     strcpy(UserName, pw->pw_name);
  58.  
  59.     for (i = 1; i < argc; i++)
  60.     if (argv[i][0] == '-') {
  61.         if (argv[i][1] == '\0')
  62.         inpath = "";
  63.         else
  64.         for (j = 1; j < strlen(argv[i]); j++)
  65.             switch (tolower(argv[i][j])) {
  66.             case '?':
  67.             usage();
  68.             exit(1);
  69.             case 'a':
  70.             j = strlen(argv[i]);
  71.             break;    /* Hack */
  72.             strcpy(UserName, argv[i] + j + (argv[i][j + 1] == '=' ? 2 : 1));
  73.             j = strlen(argv[i]);
  74.             break;
  75.             case 's':
  76.             j = strlen(argv[i]);    /* ignorieren */
  77.             break;
  78.             case 'r':    /* Queuen! */
  79.             queue = TRUE;
  80.             break;
  81.             case 'd':    /* Debug-Level */
  82.             case 'x':
  83.             debug = atoi(argv[i] + j + (argv[i][j + 1] == '=' ? 2 : 1));
  84.             j = strlen(argv[i]);
  85.             break;
  86.             case 'z':    /* Eingabe kommt von? */
  87.             inpath = argv[i] + j + (argv[i][j + 1] == '=' ? 2 : 1);
  88.             j = strlen(argv[i]);
  89.             break;
  90.             case 'g':
  91.             grade_char = argv[i][++j];
  92.             break;
  93.             case 'b':
  94.             binfile = 1;
  95.             break;
  96.             default:
  97.             usage();
  98.             exit(_errmsg(1, "unknown option '%c'\n", argv[i][j]));
  99.             }
  100.     } else {
  101.         progarg = i;
  102.         break;
  103.     }
  104.  
  105.     if (progarg == 0)        /* Programmname angegeben (erstes Argument) */
  106.     exit(_errmsg(1, "no program\n"));
  107.  
  108.     if (gethostname(HostName, 16 - 1) < 0)
  109.     exit(_errmsg(1, "No hostname\n"));
  110.  
  111.  
  112.     if ((pw = getpwname("uucp")) == NULL) {
  113.     exit(_errmsg(1, "Could not get uucp's uid"));
  114.     }
  115.     setuid((pw->pw_gid << 16) | pw->pw_uid);
  116.  
  117.     if (!(ptr = index(argv[progarg], '!')))
  118.     exit(_errmsg(1, "no remote program given\n"));
  119.  
  120.     *ptr = '\0';
  121.     strcpy(rmtname, argv[progarg]);
  122.     strcpy(rmtprog, ptr + 1);
  123.  
  124.     if (CheckLegalName(rmtname) == FALSE)
  125.     exit(_errmsg(E_PNNF, "Unknown Host '%s'\n", rmtname));
  126.  
  127.     if (chdir(SPOOLDIR) < 0 || (chdir(rmtname) < 0 &&
  128.             (makdir(rmtname, S_IFDIR, S_IFDIR | S_IREAD | S_IWRITE) < 0 ||
  129.                 chdir(rmtname) < 0))) {
  130.     exit(_errmsg(errno, "Could not chdir to spool directory\n"));
  131.     }
  132.     if (inpath) {
  133.     sprintf(dfile, "D.%.7s%c%04x", rmtname, grade_char, getseq());
  134.     fdfile = creat(dfile, PERMS);
  135.  
  136.     while ((i = read(0, tmp, sizeof tmp)) > 0) {
  137.         if (!binfile) {
  138.         for (j = 0; j < i; j++)
  139.             if (tmp[j] == '\n')
  140.             tmp[j] = '\l';
  141.         }
  142.         write(fdfile, tmp, i);
  143.     }
  144.  
  145.     close(fdfile);
  146.     }
  147.     /* make the spool files for uucico */
  148.  
  149.     sprintf(bfile, "B.%.7s%c%04x", HostName, grade_char, getseq);
  150.     mktemp(bfile);
  151.     fbfile = creat(bfile, PERMS);
  152.  
  153.     sprintf(tmp, "U %s %s\l", UserName, HostName);
  154.     write(fbfile, tmp, strlen(tmp));
  155.  
  156.  
  157.     if (inpath) {
  158.     sprintf(tmp, "F %s\l", dfile);
  159.     write(fbfile, tmp, strlen(tmp));
  160.     }
  161.     rem_fnam_num = 0;
  162.     for (i = progarg + 1; i < argc; i++)
  163.     if (index(argv[i], '!') && argv[i][0] != '(') {
  164.         sprintf(tmp, "D.%s%c%.04x", rmtname, grade_char, getseq());
  165.         rem_fnames[rem_fnam_num] = malloc(strlen(tmp) + 1);
  166.         strcpy(rem_fnames[rem_fnam_num++], tmp);
  167.  
  168.         cp = rindex(argv[i], '!') + 1;
  169.         if (rindex(cp, '/'))
  170.         cp = rindex(cp, '/') + 1;
  171.         sprintf(tmp2, "F %s %s\l", tmp, cp);
  172.         write(fbfile, tmp2, strlen(tmp2));
  173.     }
  174.     if (inpath) {
  175.     sprintf(tmp, "I %s\l", dfile);
  176.     write(fbfile, tmp, strlen(tmp));
  177.     }
  178.     j = 0;
  179.     sprintf(tmp, "C %s", rmtprog);
  180.     for (i = progarg + 1; i < argc; i++) {
  181.     strcat(tmp, " ");
  182.     if (index(argv[i], '!') && argv[i][0] != '(')
  183.         strcat(tmp, rem_fnames[j++]);
  184.     else {
  185.         strcpy(tmp2, argv[i]);
  186.         if (tmp2[0] == '(') {
  187.         tmp2[strlen(tmp2) - 1] = '\0';    /* ')' */
  188.         strcpy(tmp2, tmp2 + 1);
  189.         }
  190.         strcat(tmp, tmp2);
  191.     }
  192.     }
  193.     strcat(tmp, "\l");
  194.  
  195.     write(fbfile, tmp, strlen(tmp));
  196.     close(fbfile);
  197.  
  198.     sprintf(cfile, "C.%.7s%c%04x", rmtname, grade_char, getseq());
  199.     sprintf(xfile, "X.%.7s%c%04x", HostName, grade_char, getseq());
  200.  
  201.     fcfile = creat(cfile, PERMS);
  202.     if (inpath) {
  203.     sprintf(tmp, "S %s %s %s - %s 0666\l", dfile, dfile, UserName, dfile);
  204.     write(fcfile, tmp, strlen(tmp));
  205.     }
  206.     j = 0;
  207.     for (i = 1; i < argc; i++) {
  208.     if (argv[i][0] == '-')
  209.         continue;
  210.     if (index(argv[i], '!') && argv[i][0] != '(') {
  211.         sprintf(tmp, "S %s %s %s - %s 0666\n",
  212.             rindex(argv[i], '!') + 1, rem_fnames[j], UserName,
  213.             rindex(argv[i], '!') + 1);
  214.         write(fcfile, tmp, strlen(tmp));
  215.         j++;
  216.     }
  217.     }
  218.  
  219.     sprintf(tmp, "S %s %s %s - %s 0666\l", bfile, xfile, UserName, bfile);
  220.     write(fcfile, tmp, strlen(tmp));
  221.  
  222.     close(fcfile);
  223.  
  224.     /* Call uucico (in background) ... */
  225.     if (!queue) {
  226.     fclose(stdin);
  227.     fclose(stdout);
  228.     fclose(stderr);
  229.     open("/nil", S_IREAD);    /* reopen std handles */
  230.     dup(0);
  231.     dup(0);
  232.     sprintf(tmp, "-s%s", rmtname);
  233.     uuarg[3] = tmp;
  234.     os9exec(os9fork, uuarg[0], uuarg, environ, 0, 0, 3);
  235.     }
  236. }
  237.  
  238.  
  239. /*
  240.  * Site-Namen ueberpruefen
  241.  */
  242.  
  243. static int 
  244. CheckLegalName(name)
  245. register char *name;
  246. {
  247.     register FILE *fd;
  248.     char    line[256], tmp[16], s_systems[150];
  249.  
  250.     sprintf(s_systems, "%s/Systems", LIBDIR);
  251.  
  252.     if ((fd = fopen(s_systems, "r")) == NULL)
  253.     return (FALSE);
  254.  
  255.     while (fgets(line, sizeof line, fd) != NULL) {
  256.     sscanf(line, "%s ", tmp);
  257.  
  258.     if (strncmp(name, tmp, 7) == 0) {
  259.         fclose(fd);
  260.         return (TRUE);
  261.     }
  262.     }
  263.  
  264.     fclose(fd);
  265.     return (FALSE);
  266. }
  267.  
  268.  
  269. usage()
  270. {
  271.     fputs("Syntax: uux [<opts>] <host>!<prog> [<args>]\n", stderr);
  272.     fputs("Function: UUCP Executive\n", stderr);
  273.     fputs("Options:\n", stderr);
  274.     fputs("     -a=<user name>      user requesting the service\n", stderr);
  275.     fputs("     -b                  binary file transfer (default ascii)\n", stderr);
  276.     fputs("     -g<grade>           specify grade\n", stderr);
  277.     fputs("     -r                  queue request\n", stderr);
  278.     fputs("     -d,-x=<level>       debug level\n", stderr);
  279.     fputs("     -z                  input from standard input\n", stderr);
  280. /* does not work
  281.   fputs("     -z=<path>           input from <path>\n", stderr);
  282. */
  283. }
  284.