home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / telecomm / nhclb120 / sys5unix.x < prev    next >
Text File  |  1993-09-26  |  9KB  |  534 lines

  1. /*
  2.     FILE: unix.c
  3.  
  4.     Routines: This file contains the following routines:
  5.         fileinit()
  6.         eihalt()
  7.         kbread()
  8.         clksec()
  9.         tmpfile()
  10.         restore()
  11.         stxrdy()
  12.         disable()
  13.         memstat()
  14.         filedir()
  15.         sysreset()
  16.  
  17.     Written by Mikel Matthews, N9DVG
  18.     SYS5 stuff added by Jere Sandidge, K4FUM
  19. */
  20.  
  21. #include <stdio.h>
  22. #include <signal.h>
  23. #include <termio.h>
  24. #include <sys/types.h>
  25. #include <sys/stat.h>
  26. #include <sys/times.h>
  27. #include <time.h>
  28. #include <string.h>
  29. #include <ctype.h>
  30. #undef    toupper
  31. #undef    tolower
  32.  
  33. #include "global.h"
  34. #include "config.h"
  35. #include "cmdparse.h"
  36. #include "iface.h"
  37. #include "unix.h"
  38. #include <dirent.h>
  39.  
  40. #define    MAXCMD    1024
  41.  
  42. int asy_attach();
  43. #ifdef    SUNOS4
  44. char *sprintf();
  45. #endif
  46.  
  47. extern struct cmds attab[];
  48. extern struct termio savecon;
  49.  
  50. unsigned long selmask = 0;
  51.  
  52. unsigned nasy;
  53.  
  54. fileinit(argv0)
  55. char *argv0;
  56. {
  57.     int el;
  58.     char *ep, *cp, *malloc(), *getenv(), *getcwd();
  59.     char tmp[MAXCMD];
  60.     extern char *startup, *config, *userfile, *Dfile, *hosts, *mailspool;
  61.     extern char *mailqdir, *mailqueue, *routeqdir, *alias, *netexe;
  62. #ifdef    _FINGER
  63.     extern char *fingerpath;
  64. #endif
  65. #ifdef    XOBBS
  66.     extern char *bbsexe;
  67. #endif
  68.  
  69.     /* Get the name of the currently executing program */
  70.     if ((cp = malloc((unsigned)(strlen(argv0) + 1))) == NULL)
  71.         perror("malloc");
  72.     else {
  73.         sprintf(cp, "%s", argv0);
  74.         netexe = cp;
  75.     }
  76.  
  77. #ifdef    XOBBS
  78.     /* Get the path to the W2XO BBS executable. */
  79.     if ((ep = getenv("XOBBS")) == NULLCHAR) {
  80.         bbsexe = "xobbs";
  81.     } else {
  82.         if ((cp = malloc((unsigned)(strlen(ep) + 2))) == NULL)
  83.             perror("malloc");
  84.         else {
  85.             sprintf(cp, "%s", ep);
  86.             bbsexe = cp;
  87.         }
  88.     }
  89. #endif
  90.     /* Try to get home directory name */
  91.     if ((ep = getenv("NETHOME")) == NULLCHAR) {
  92.         if ((ep = getenv("HOME")) == NULLCHAR) {
  93.             ep = ".";
  94.         }
  95.     }
  96.     el = strlen(ep);
  97.     /* Replace each of the file name strings with the complete path */
  98.     if (*startup != '/') {
  99.         if ((cp = malloc((unsigned)(el + strlen(startup) + 2))) == NULL)
  100.             perror("malloc");
  101.         else {
  102.             sprintf(cp, "%s/%s", ep, startup);
  103.             startup = cp;
  104.         }
  105.     }
  106.  
  107.     if (*config != '/') {
  108.         if ((cp = malloc((unsigned)(el + strlen(config) + 2))) == NULL)
  109.             perror("malloc");
  110.         else {
  111.             sprintf(cp, "%s/%s", ep, config);
  112.             config = cp;
  113.         }
  114.     }
  115.  
  116.     if (*userfile != '/') {
  117.         if ((cp = malloc((unsigned)(el + strlen(userfile) + 2))) == NULL)
  118.             perror("malloc");
  119.         else {
  120.             sprintf(cp, "%s/%s", ep, userfile);
  121.             userfile = cp;
  122.         }
  123.     }
  124.  
  125.     if (*Dfile != '/') {
  126.         if ((cp = malloc((unsigned)(el + strlen(Dfile) + 2))) == NULL)
  127.             perror("malloc");
  128.         else {
  129.             sprintf(cp, "%s/%s", ep, Dfile);
  130.             Dfile = cp;
  131.         }
  132.     }
  133.  
  134.     if (*hosts != '/') {
  135.         if ((cp = malloc((unsigned)(el + strlen(hosts) + 2))) == NULL)
  136.             perror("malloc");
  137.         else {
  138.             sprintf(cp, "%s/%s", ep, hosts);
  139.             hosts = cp;
  140.         }
  141.     }
  142.  
  143.     if (*alias != '/') {
  144.         if ((cp = malloc((unsigned)(el + strlen(alias) + 2))) == NULL)
  145.             perror("malloc");
  146.         else {
  147.             sprintf(cp, "%s/%s", ep, alias);
  148.             alias = cp;
  149.         }
  150.     }
  151.  
  152. #ifdef        _FINGER
  153.     if (*fingerpath != '/') {
  154.         if ((cp = malloc((unsigned)(el + strlen(fingerpath) + 2))) == NULL)
  155.             perror("malloc");
  156.         else {
  157.             sprintf(cp, "%s/%s", ep, fingerpath);
  158.             fingerpath = cp;
  159.         }
  160.     }
  161. #endif
  162.  
  163.     /* Try to get home directory name */
  164.     if ((ep = getenv("NETSPOOL")) == NULLCHAR)
  165.         ep = "/usr/spool";
  166.     el = strlen(ep);
  167.  
  168.     if (*mailspool != '/') {
  169.         if ((cp = malloc((unsigned)(el + strlen(mailspool) + 2))) == NULL)
  170.             perror("malloc");
  171.         else {
  172.             sprintf(cp, "%s/%s", ep, mailspool);
  173.             mailspool = cp;
  174.         }
  175.     }
  176.  
  177.     if (*mailqdir != '/') {
  178.         if ((cp = malloc((unsigned)(el + strlen(mailqdir) + 2))) == NULL)
  179.             perror("malloc");
  180.         else {
  181.             sprintf(cp, "%s/%s", ep, mailqdir);
  182.             mailqdir = cp;
  183.         }
  184.     }
  185.  
  186.     if (*mailqueue != '/') {
  187.         if ((cp = malloc((unsigned)(el + strlen(mailqueue) + 2))) == NULL)
  188.             perror("malloc");
  189.         else {
  190.             sprintf(cp, "%s/%s", ep, mailqueue);
  191.             mailqueue = cp;
  192.         }
  193.     }
  194.  
  195.     if (*routeqdir != '/') {
  196.         if ((cp = malloc((unsigned)(el + strlen(routeqdir) + 2))) == NULL)
  197.             perror("malloc");
  198.         else {
  199.             sprintf(cp, "%s/%s", ep, routeqdir);
  200.             routeqdir = cp;
  201.         }
  202.     }
  203. }
  204.  
  205. /* action routine for remote reset */
  206. sysreset()
  207. {
  208.     extern char *netexe;
  209.  
  210.     execlp(netexe,netexe,0);
  211.     execlp("net","net",0);
  212.     printf("reset failed: exiting\n");
  213.     exit(1);
  214. }
  215.  
  216. long waittime = 100;
  217.  
  218. dowait(argc,argv)
  219. int argc;
  220. char *argv[];
  221. {
  222.   if (argc < 2)  {
  223.     printf("Wait in main select is %d msec\n", waittime);
  224.     return;
  225.   }
  226.   waittime = atoi(argv[1]);
  227. }
  228.  
  229. eihalt()
  230. {
  231.     void tnix_scan();
  232.     struct timeval {
  233.         long    tv_sec;        /* seconds */
  234.         long    tv_usec;    /* microseconds */
  235.     } tv;
  236.     unsigned long mask;
  237.  
  238.     tnix_scan();
  239.  
  240.     if (waittime) {
  241.       tv.tv_sec = waittime / 1000;
  242.       tv.tv_usec = (waittime % 1000) * 1000;
  243.       mask = selmask | 1;
  244.       select(20,&mask,0,0,&tv);
  245.     }
  246. }
  247.  
  248.  
  249. kbread()
  250. {
  251.     unsigned char c;
  252.  
  253.     if (read(fileno(stdin), &c, 1) <= 0)
  254.         return -1;
  255.  
  256.     return ((int) c);
  257. }
  258.  
  259.  
  260. clksec()
  261. {
  262.     time_t tim, time();
  263.  
  264.     (void) time(&tim);
  265.  
  266.     return ((int) tim);
  267. }
  268.  
  269.  
  270. /*ARGSUSED*/
  271. restore(state)
  272. char state;
  273. {
  274. }
  275.  
  276.  
  277. /*ARGSUSED*/
  278. stxrdy(dev)
  279. int16 dev;
  280. {
  281.     return 1;
  282. }
  283.  
  284.  
  285. disable()
  286. {
  287. }
  288.  
  289.  
  290. memstat()
  291. {
  292.     return 0;
  293. }
  294.  
  295.  
  296. /* wildcard filename lookup */
  297. filedir(name, times, ret_str)
  298. char    *name;
  299. int    times;
  300. char    *ret_str;
  301. {
  302.     static char    dname[128], fname[128];
  303.     static DIR *dirp = NULL;
  304.     struct dirent *dp;
  305.     struct stat sbuf;
  306.     char    *cp, temp[128];
  307.  
  308.     /*
  309.      * Make sure that the NULL is there in case we don't find anything
  310.      */
  311.     ret_str[0] = '\0';
  312.  
  313.     if (times == 0) {
  314.         /* default a null name to *.* */
  315.         if (name == NULL || *name == '\0')
  316.             name = "*.*";
  317.         /* split path into directory and filename */
  318.         if ((cp = strrchr(name, '/')) == NULL) {
  319.             strcpy(dname, ".");
  320.             strcpy(fname, name);
  321.         } else {
  322.             strcpy(dname, name);
  323.             dname[cp - name] = '\0';
  324.             strcpy(fname, cp + 1);
  325.             /* root directory */
  326.             if (dname[0] == '\0')
  327.                 strcpy(dname, "/");
  328.             /* trailing '/' */
  329.             if (fname[0] == '\0')
  330.                 strcpy(fname, "*.*");
  331.         }
  332.         /* close directory left over from another call */
  333.         if (dirp != NULL)
  334.             closedir(dirp);
  335.         /* open directory */
  336.         if ((dirp = opendir(dname)) == NULL) {
  337.             printf("Could not open DIR (%s)\n", dname);
  338.             return;
  339.         }
  340.     } else {
  341.         /* for people who don't check return values */
  342.         if (dirp == NULL)
  343.             return;
  344.     }
  345.  
  346.     /* scan directory */
  347.     while ((dp = readdir(dirp)) != NULL) {
  348.         /* test for name match */
  349.         if (wildmat(dp->d_name, fname)) {
  350.             /* test for regular file */
  351.             sprintf(temp, "%s/%s", dname, dp->d_name);
  352.             if (stat(temp, &sbuf) < 0)
  353.                 continue;
  354.             if ((sbuf.st_mode & S_IFMT) != S_IFREG)
  355.                 continue;
  356.             strcpy(ret_str, dp->d_name);
  357.             break;
  358.         }
  359.     }
  360.  
  361.     /* close directory if we hit the end */
  362.     if (dp == NULL) {
  363.         closedir(dirp);
  364.         dirp = NULL;
  365.     }
  366. }
  367.  
  368.  
  369. /* checks the time then ticks and updates ISS */
  370. void
  371. check_time()
  372. {
  373.     int32 iss();
  374.     long times();
  375.  
  376.     struct tms tb;
  377.     static long clkval;
  378.     long ntime, offset;
  379.  
  380.     /* read elapsed real time (typ. 60 Hz) */
  381.     ntime = times(&tb);
  382.  
  383.     /* resynchronize if the error is large (10 seconds or more) */
  384.     offset = ntime - clkval;
  385.     if (offset > (10000/MSPTICK) || offset < 0)
  386.         clkval = ntime;
  387.  
  388.     /* Handle possibility of several missed ticks */
  389.     while (ntime != clkval) {
  390.         ++clkval;
  391.         icmpclk();
  392.         tick();
  393.         (void) iss();
  394.     }
  395. }
  396.  
  397.  
  398. getds()
  399. {
  400.     return 0;
  401. }
  402.  
  403.  
  404. audit()
  405. {
  406. }
  407.  
  408.  
  409. doshell(argc, argv)
  410. char    **argv;
  411. {
  412.     int    i, stat, pid, pid1, (*savi)();
  413.     char    *cp, str[MAXCMD], *getenv();
  414.     struct termio tt_config;
  415.  
  416.     str[0] = '\0';
  417.     for (i = 1; i < argc; i++) {
  418.         strcat(str, argv[i]);
  419.         strcat(str, " ");
  420.     }
  421.  
  422.     ioctl(0, TCGETA, &tt_config);
  423.     ioctl(0, TCSETAW, &savecon);
  424.  
  425.     if ((cp = getenv("SHELL")) == NULL || *cp != '\0')
  426.         cp = "/bin/sh";
  427.  
  428.     if ((pid = fork()) == 0) {
  429.         if (argc > 1)
  430.             (void)execl("/bin/sh", "sh", "-c", str, 0);
  431.         else
  432.             (void)execl(cp, cp, (char *)0, (char *)0, 0);
  433.         perror("execl");
  434.         exit(1);
  435.     } else if (pid == -1) {
  436.         perror("fork");
  437.         stat = -1;
  438.     } else {
  439.         savi = signal(SIGINT, SIG_IGN);
  440.         while ((pid1 = wait(&stat)) != pid && pid1 != -1)
  441.             ;
  442.         signal(SIGINT, savi);
  443.     }
  444.  
  445.     ioctl(0, TCSETAW, &tt_config);
  446.  
  447.     return stat;
  448. }
  449.  
  450.  
  451. dodir(argc, argv)
  452. int    argc;
  453. char    **argv;
  454. {
  455.     int    i, stat;
  456.     char    str[MAXCMD];
  457.     struct termio tt_config;
  458.  
  459.     strcpy(str, "ls -l ");
  460.     for (i = 1; i < argc; i++) {
  461.         strcat(str, argv[i]);
  462.         strcat(str, " ");
  463.     }
  464.  
  465.     ioctl(0, TCGETA, &tt_config);
  466.     ioctl(0, TCSETAW, &savecon);
  467.  
  468.     stat = system(str);
  469.  
  470.     ioctl(0, TCSETAW, &tt_config);
  471.  
  472.     return stat;
  473. }
  474.  
  475.  
  476. rename(s1, s2)
  477. const char *s1; const char *s2;
  478. {
  479.     char tmp[MAXCMD];
  480.  
  481.     (void) sprintf(tmp, "mv %s %s", s1, s2);
  482.     (void) system(tmp);
  483. }
  484.  
  485.  
  486. int
  487. docd(argc, argv)
  488. int argc;
  489. char **argv;
  490. {
  491.     char tmp[MAXCMD];
  492.     char *getcwd();
  493.  
  494.     if (argc > 1) {
  495.         if (chdir(argv[1]) == -1) {
  496.             printf("Can't change directory\n");
  497.             return 1;
  498.         }
  499.     }
  500.     if (getcwd(tmp, sizeof(tmp)) != NULL)
  501.         printf("%s\n", tmp);
  502.  
  503.     return 0;
  504. }
  505.  
  506.  
  507. xmkdir(s, m)
  508. char    *s;
  509. int    m;
  510. {
  511.     char tmp[MAXCMD];
  512.  
  513.     sprintf(tmp, "mkdir %s", s);
  514.     if (system(tmp))
  515.         return -1;
  516.     if (chmod(s, m) < 0)
  517.         return -1;
  518.  
  519.     return 0;
  520. }
  521.  
  522.  
  523. rmdir(s)
  524. char    *s;
  525. {
  526.     char tmp[MAXCMD];
  527.  
  528.     sprintf(tmp, "rmdir %s", s);
  529.     if (system(tmp))
  530.         return -1;
  531.  
  532.     return 0;
  533. }
  534.