home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / port-lpr / part01 / dnet-lpd-gw.c < prev    next >
C/C++ Source or Header  |  1993-04-09  |  6KB  |  268 lines

  1. /*
  2.  * line printer daemon gateway for DECnet
  3.  *
  4.  * Listens on a DECnet port and copies packets to/from the local
  5.  * Berkeley line printer daemon.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include <sys/un.h>
  13. #include <netdb.h>
  14. #include <ctype.h>
  15. #include <errno.h>
  16. #define MAIN_PROGRAM
  17. #include "common.h"
  18.  
  19.  
  20. char *DECnet_remoteNode;
  21. char *DECnet_remoteUser;
  22.  
  23. void
  24. dump_buf (fp, prefix, buf, size)
  25. unsigned char *prefix, *buf;
  26. int size;
  27. FILE *fp;
  28. {
  29.     int i;
  30.     fprintf (fp, "%s ", prefix);
  31.     for (i = 0; i < size; ++i)
  32.     if (buf[i] >= ' ' && buf[i] <= '~')
  33.         putc (buf[i], fp);
  34.     else if (buf[i] == '\n')
  35.         fprintf (fp, "\\n");
  36.     else
  37.         fprintf (fp, "\\%03o", buf[i] & 0377);
  38.     putc ('\n', fp);
  39.     fflush (fp);
  40. }
  41.  
  42. char *
  43. strsave (s)
  44. char *s;
  45. {
  46.     char *malloc ();
  47.     char *p;
  48.     if (s == NULL)
  49.     return NULL;
  50.     if ((p = malloc (strlen (s) + 1)) == NULL)
  51.     return NULL;
  52.     strcpy (p, s);
  53.     return p;
  54. }
  55.  
  56.  
  57. #ifdef sun
  58. /*
  59.  * accept code for SunLink DNI
  60.  */
  61.  
  62. #include <sys/ioctl.h>
  63. #include <netdni/dni.h>
  64.  
  65. int
  66. accept_decnet_connection ()
  67. {
  68.     OpenBlock open_block;
  69.     SessionData session_data;
  70.     int dnet_fd;
  71.  
  72.     dnet_fd = 3;
  73.     if (ioctl (dnet_fd, SES_GET_AI, &open_block) < 0) {
  74.     fprintf (stderr, "dnet-lpd: can't get access control information\n");
  75.     fflush (stderr);
  76.     return EOF;
  77.     }
  78.     DECnet_remoteNode = strsave (open_block.op_node_name);
  79.     DECnet_remoteUser = strsave (open_block.op_userid);
  80.     if (ioctl (dnet_fd, SES_ACCEPT, &session_data) < 0) {
  81.     fprintf (stderr, "dnet-lpd: can't accept inbound connection\n");
  82.     fflush (stderr);
  83.     return EOF;
  84.     }
  85.     return dnet_fd;
  86. }
  87. #endif
  88.  
  89.  
  90. #ifdef ultrix
  91. /*
  92.  * accept code for DECnet-Ultrix (untested)
  93.  */
  94.  
  95. #include <netdnet/dn.h>
  96.  
  97. int
  98. accept_decnet_connection ()
  99. {
  100.     struct accessdata_dn acc_data;
  101.     int dnet_fd = 0;
  102.  
  103.     setsockopt (dnet_fd, DNPROTO_NSP, DSO_CONACCESS, &acc_data,
  104.         sizeof (acc_data));
  105.     DECnet_remoteNode = strsave (getenv ("REMNODE"));
  106.     DECnet_remoteUser = strsave (getenv ("REMUSER"));
  107.     setsockopt (dnet_fd, DNPROTO_NSP, DSO_CONACCEPT, 0, 0);
  108.     return dnet_fd;
  109. }
  110. #endif
  111.  
  112. int
  113. x_read (fd, buf, size)
  114. int fd; char *buf; unsigned size;
  115. {
  116.     int nread = read (fd, (char *) buf, size);
  117.     char prefix[10];
  118.     sprintf (prefix, "<%d<", fd);
  119.     if (debug)
  120.     dump_buf (stderr, prefix, buf, nread);
  121.     return nread;
  122. }
  123.  
  124. int
  125. x_write (fd, buf, size)
  126. int fd; char *buf; unsigned size;
  127. {
  128.     char prefix[10];
  129.     sprintf (prefix, ">%d>", fd);
  130.     if (debug)
  131.     dump_buf (stderr, prefix, buf, size);
  132.     return write (fd, (char *) buf, size);
  133. }
  134.  
  135. int
  136. y_read (fd, buf, size)
  137. int fd; char *buf; unsigned size;
  138. {
  139.     int nread = read (fd, (char *) buf, size);
  140.     if (debug)
  141.     fprintf (stderr, "<%d< (%d bytes)\n", fd, nread);
  142.     return nread;
  143. }
  144.  
  145. int
  146. y_write (fd, buf, size)
  147. int fd; char *buf; unsigned size;
  148. {
  149.     if (debug)
  150.     fprintf (stderr, ">%d> (%d bytes)\n", fd, size);
  151.     return write (fd, (char *) buf, size);
  152. }
  153.  
  154. do_gateway (dnet_fd, tcp_fd)
  155. int dnet_fd, tcp_fd;
  156. {
  157.     char buf[512];
  158.     int nread;
  159.  
  160.     while ((nread = x_read (dnet_fd, buf, sizeof buf)) > 0) {
  161.     switch (*buf) {
  162.     case '\02':        /* receive a printer job */
  163.         x_write (tcp_fd, buf, nread);
  164.         nread = x_read (tcp_fd, buf, sizeof buf);
  165.         if (nread > 0) {
  166.         x_write (dnet_fd, buf, nread);
  167.         receive_job (dnet_fd, tcp_fd);
  168.         }
  169.         else
  170.         exit (0);
  171.         break;
  172.     case '\01':        /* print any waiting jobs */
  173.     case '\03':        /* display queue state (short) */
  174.     case '\04':        /* display queue state (long) */
  175.     case '\05':        /* remove jobs */
  176.     default:
  177.         x_write (tcp_fd, buf, nread);
  178.         while ((nread = x_read (tcp_fd, buf, sizeof buf)) > 0)
  179.         x_write (dnet_fd, buf, nread);
  180.         exit (0);
  181.     }
  182.     }
  183. }
  184.  
  185. receive_job (dnet_fd, tcp_fd)
  186. int dnet_fd, tcp_fd;
  187. {
  188.     char buf[512];
  189.     int nread;
  190.     int count;
  191.  
  192.     while ((nread = x_read (dnet_fd, buf, sizeof buf)) > 0) {
  193.     switch (*buf) {
  194.     case '\01':
  195.     default:
  196.         x_write (tcp_fd, buf, nread);
  197.         nread = x_read (tcp_fd, buf, sizeof buf);
  198.         if (nread > 0)
  199.         x_write (dnet_fd, buf, nread);
  200.         else
  201.         exit (0);
  202.     case '\02':        /* send control file */
  203.     case '\03':        /* send data file */
  204.         count = atoi (buf + 1); /* length of control file */
  205.         /* copy command to lpd ; get response*/
  206.         x_write (tcp_fd, buf, nread);    
  207.         nread = x_read (tcp_fd, buf, sizeof buf);
  208.         if (nread > 0)
  209.         x_write (dnet_fd, buf, nread);
  210.         else
  211.         exit (0);
  212.         copy_file (dnet_fd, tcp_fd, count);
  213.     }
  214.     }
  215. }
  216.  
  217. copy_file (src, dest, size)
  218. int  src, dest, size;
  219. {
  220.     int nread;
  221.     char buf[512];
  222.  
  223.     while (size > 0) {
  224.     if ((nread = y_read (src, buf, sizeof buf)) > 0) {
  225.         y_write (dest, buf, nread);
  226.         size -= nread;
  227.     }
  228.     else
  229.         break;
  230.     }
  231.     if (size > 0) {
  232.     int x;
  233.     
  234.     bzero (buf, sizeof buf);
  235.     while (size > 0) {
  236.         x = size > 512 ? 512 : size;
  237.         y_write (dest, buf, x);
  238.         size -= x;
  239.     }
  240.     }
  241.     nread = x_read (src, buf, sizeof buf); /* should be a NUL octet */
  242.     x_write (dest, buf, nread);
  243.     nread = x_read (dest, buf, sizeof buf); /* acknowlegement */
  244.     x_write (src, buf, nread);
  245. }
  246.  
  247. int debug = 0;
  248.  
  249. main (argc, argv)
  250. char **argv;
  251. {
  252.     int dnet_fd, tcp_fd;
  253.     if (debug)
  254.     freopen ("/tmp/dnet-lpd-gw.log", "a", stderr);
  255.  
  256.     if ((dnet_fd = accept_decnet_connection ()) < 0) {
  257.     fprintf (stderr, "DECnet accept failed, exiting\n");
  258.     exit (1);
  259.     }
  260.     if ((tcp_fd = open_lpd ("localhost")) < 0) {
  261.     fprintf (stderr, "TCP open failed, exiting\n");
  262.     exit (1);
  263.     }
  264.     do_gateway (dnet_fd, tcp_fd);
  265.     exit (0);
  266. }
  267.  
  268.