home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 164.img / UUPC.ZIP / LOCAL.ZIP / ULIB.C < prev   
C/C++ Source or Header  |  1987-08-26  |  5KB  |  260 lines

  1. /*    ibmpc/ulib.c
  2.  
  3.     DCP system-dependent library
  4.  
  5.     Services provided by ulib.c:
  6.  
  7.         serial I/O
  8.         UNIX commands simulation
  9.         login 
  10.  
  11. */
  12.  
  13. #include <string.h>
  14.  
  15. #include "dcp.h"
  16.  
  17. /*
  18.    login - login handler
  19. */
  20.  
  21. /* Currently a very dumb login handshake for PC in slave mode. */
  22.  
  23. login()
  24. {
  25.    char line[132];
  26.  
  27.    for ( ; ; ) {
  28.       msgtime = 9999; /* make it very long */
  29.       rmsg(line, 0); /* wait for a <CR> or <NL> */
  30.       msgtime = 2 * MSGTIME;
  31.       wmsg("Login:", 0);
  32.       rmsg(line, 0);
  33.       printmsg(0, "login: login=%s", line);
  34.       wmsg("Password:", 0);
  35.       rmsg(line, 0);
  36.       printmsg(14, "login: password=%s", line);
  37.       if (strcmp(line, "uucp") == SAME)
  38.          break;
  39.    };
  40.  
  41.    return('I');
  42.  
  43. } /*login*/
  44.  
  45.  
  46. /*
  47.    notimp - "perform" Unix commands which aren't implemented
  48. */
  49.  
  50. notimp(argc, argv)
  51. int argc;
  52. char *argv[];
  53. {
  54.  
  55.     fprintf(stderr, "shell: command '%s' is not implemented.\n", *argv);
  56.  
  57. } /*notimp*/
  58.  
  59.  
  60. /*
  61.    shell - simulate a Unix command
  62.  
  63.    Only the 'rmail' and 'rnews' command are currently supported.
  64. */
  65.  
  66. shell(command, inname, outname, errname)
  67. char *command;
  68. char *inname;
  69. char *outname;
  70. char *errname;
  71. {
  72.  
  73.     char    *argvec[50];
  74.  
  75.     int rmail();
  76.     int rnews();
  77.  
  78.     char **argvp;
  79.     char argcp;
  80.  
  81.     int    (*proto)();
  82.  
  83.     argcp = getargs(command, argvec);
  84.     argvp = argvec;
  85.  
  86.     if ( debuglevel > 5 ) {
  87.         int args;
  88.         args = argcp;
  89.         while ( args )
  90.             fprintf(stderr, "shell: args: %d, %s\n", args--, *argvp++);
  91.         argvp = argvec;
  92.     }
  93.  
  94.     proto = notimp;
  95.  
  96.     if (strcmp(*argvp, "rmail") == SAME)
  97.         proto = rmail;
  98.     else if (strcmp(*argvp, "rnews") == SAME)
  99.         proto = rnews;
  100.     
  101.     if (*inname != '\0') {
  102.         char localname[64];
  103.         importpath(localname, inname);
  104.         if (freopen(localname, "rb", stdin) == NULL) {
  105.             extern int errno;
  106.             fprintf(stderr, "shell: couldn't open %s (%s), errno=%d.\n",
  107.                 inname, localname, errno);
  108.         }
  109.     }
  110.  
  111.     (*proto)(argcp, argvp);
  112.  
  113.     freopen("con", "r", stdin);
  114.  
  115. } /*shell*/
  116.  
  117.  
  118. /* IBM-PC I/O routines */
  119.  
  120. /* "DCP" a uucp clone. Copyright Richard H. Lamb 1985,1986,1987 */
  121.  
  122. /*************** BASIC I/O ***************************/
  123. /* Saltzers serial pkg */
  124. /* Some notes: When pkts are flying in both directions, there seems to */
  125. /* be some interupt handling problems as far as recieving. checksum errs*/
  126. /* may therfore occur often even though we recover from them. This is */
  127. /* especially true with sliding windows. Errors are very few in the VMS */
  128. /* version. RH Lamb*/
  129.  
  130. #include "comm.h"
  131.  
  132. #define STOPBIT 1
  133.  
  134.  
  135. /*
  136.    swrite - write to the serial port
  137. */
  138.  
  139. swrite(data, num)
  140. int num;
  141. char *data;
  142. {
  143.    int i;
  144.  
  145.    for (i = 0; i < num; i++) send_com(*(data++));
  146.    return(i);
  147.  
  148. } /*swrite*/
  149.  
  150.  
  151. /*
  152.    sread - read from the serial port
  153. */
  154.  
  155. /* Non-blocking read essential to "g" protocol.
  156.    See "dcpgpkt.c" for description.
  157.    This all changes in a multi-tasking system.  Requests for
  158.    I/O should get queued and an event flag given.  Then the
  159.    requesting process (e.g. gmachine()) waits for the event
  160.    flag to fire processing either a read or a write.
  161.    Could be implemented on VAX/VMS or DG but not MS-DOS. */
  162.  
  163. sread(buf, expected, timeout)
  164. char *buf;
  165. int expected, timeout;
  166. {
  167.    long start;
  168.  
  169.    start = time((long *)NULL);
  170.    for ( ; ; ) {
  171.       int pending;
  172.       pending = r_count_pending();
  173.       printmsg(20, "---> pending=%d expected=%d", pending, expected);
  174.       if (pending >= expected) {
  175.          int i;
  176.          for (i = 0; i < expected; i++)
  177.             *(buf++) = receive_com();
  178.          return(pending);
  179.       } else {
  180.          int elapsed;
  181.          elapsed = time((long *)NULL) - start;
  182.          if (elapsed >= timeout)
  183.             return(pending);
  184.       }
  185.    }
  186.  
  187. } /*sread*/
  188.  
  189.  
  190. /*
  191.    openline - open the serial port for I/O
  192. */
  193.  
  194. openline(name, baud)
  195. char *name, *baud;
  196. {
  197.    int i;
  198.  
  199.    sscanf(name, "COM%d", &i);
  200.    select_port(i);
  201.    save_com();
  202.    install_com();
  203.    sscanf(baud, "%d", &i);
  204.    open_com(i, 'D', 'N', STOPBIT, 'D');
  205.    dtr_on();
  206.  
  207.    return(0);
  208.  
  209. } /*openline*/
  210.  
  211.  
  212. /*
  213.    closeline - close the serial port down
  214. */
  215.  
  216. closeline()
  217. {
  218.  
  219.    dtr_off();
  220.    close_com();
  221.    restore_com();
  222.  
  223. } /*closeline*/
  224.  
  225.  
  226. /*
  227.    sleep() - wait n seconds
  228.  
  229.    Simply delay until n seconds have passed.
  230. */
  231.  
  232. void sleep(interval)
  233. int interval;
  234. {
  235.    long start;
  236.  
  237.    start = time((long *)NULL);
  238.    while ((time((long *)NULL) - start) < interval);
  239.  
  240. } /*sleep*/
  241.  
  242.  
  243. /*
  244.    SIOSpeed - re-specify the speed of an opened serial port
  245. */
  246.  
  247. void SIOSpeed(baud)
  248. char *baud;
  249. {
  250.    int speed;
  251.  
  252.    dtr_off();
  253.    close_com();
  254.    sscanf(baud, "%d", &speed);
  255.    open_com(speed, 'D', 'N', STOPBIT, 'D');
  256.    dtr_on();
  257.  
  258. } /*SIOSpeed*/
  259.  
  260.