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

  1. /*
  2.  * lpr interface for VAX/VMS DECnet
  3.  */
  4.  
  5. #include "common.h"
  6. #include "config.h"
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include <lnmdef.h>
  10.  
  11. struct item_list {
  12.     unsigned short buffer_length;
  13.     unsigned short item_code;
  14.     char *buffer_address;
  15.     char *length_address;
  16. };
  17.  
  18. struct descrip {
  19.     int length;
  20.     char *ptr;
  21. };
  22.  
  23. /*
  24.  * Translate a VAX/VMS logical name, given the name we want to translate
  25.  * and the table name we want to search with.
  26.  */
  27.  
  28. int
  29. translate_logical_name (table, name, buf, size)
  30. char *table; char *name; char *buf; int size;
  31. {
  32.     struct descrip table_d;
  33.     struct descrip name_d;
  34.     struct item_list item_list[2];
  35.     int foo;
  36.     int status;
  37.  
  38.     table_d.length = strlen (table);
  39.     table_d.ptr = table;
  40.     name_d.length = strlen (name);
  41.     name_d.ptr = name;
  42.     item_list[0].buffer_length = size - 1;
  43.     item_list[0].item_code = LNM$_STRING;
  44.     item_list[0].buffer_address = buf;
  45.     item_list[0].length_address = &foo;
  46.     item_list[1].buffer_length = 0;
  47.     item_list[1].item_code = 0;
  48.     item_list[1].buffer_address = 0;
  49.     item_list[1].length_address = 0;
  50.     status = SYS$TRNLNM (0, &table_d, &name_d, 0, item_list);
  51.     if ((status & 01) != 01)
  52.     lib$signal (status);
  53.     if (foo >= 0 && foo < size)
  54.     buf[foo] = '\0';
  55.     return ((status & 01) ? 0 : EOF);
  56. }
  57.  
  58. /*
  59.  * Determine the DECnet node name by translating the system logical name
  60.  * SYS$NODE.  We use this function rather than the getenv() function,
  61.  * just to make sure the user doesn't define his/her own SYS$NODE variable
  62.  * and pretend he/she is submitting the print job from somewhere else.
  63.  */
  64.  
  65. int
  66. get_decnet_node_name (buf, size)
  67. char *buf; int size;
  68. {
  69.     char *strrchr ();
  70.     if (!translate_logical_name ("LNM$SYSTEM_TABLE", "SYS$NODE", buf, size)) {
  71.     char *p;
  72.     while (p = strrchr (buf, ':'))
  73.         *p = '\0';
  74.     return 0;
  75.     }
  76.     return EOF;
  77. }
  78.  
  79. #ifndef MAKE_EMAIL_ADDRESS
  80. #define MAKE_EMAIL_ADDRESS(buf,user,dom) sprintf (buf, "%s@%s", user, dom)
  81. #endif
  82.  
  83. void 
  84. sysdep()
  85. {
  86.     struct passwd *pwd;
  87.     char *p;
  88.     struct hostent *hp;
  89.     char *getenv ();
  90.     char nodename[100];
  91.  
  92.     get_decnet_node_name (nodename, sizeof(nodename));
  93.     strcpy (hostname, nodename);
  94.  
  95.     /* get user name (will be in ALL CAPS - yikes!) */
  96.     cuserid (username);
  97.  
  98.     MAKE_EMAIL_ADDRESS(email_address, username, hostname);
  99.  
  100.     /* lower case host name and user name */
  101.     for (p = hostname; *p; ++p)
  102.     if (isupper (*p))
  103.         *p = tolower (*p);
  104.  
  105.     for (p = username; *p; ++p)
  106.     if (isupper (*p))
  107.         *p = tolower (*p);
  108. }
  109.  
  110. /*
  111.  * Open a DECnet connection to an lpd-server.
  112.  */
  113.  
  114. int
  115. open_lpd (server)
  116. char *server;
  117. {
  118.     int fd;
  119.     char buf[512];
  120.  
  121.     if (server == NULL || *server == '\0') {
  122.     fprintf (stderr, "lpr: no printer server host is defined\n");
  123.     fprintf (stderr, "     Either specify one using -S, or\n");
  124.     fprintf (stderr, "     using the logical name LPD_SERVER.\n");
  125.     return EOF;
  126.     }
  127.     sprintf (buf, "%s::\"223=\"", server);
  128.     if ((fd = open (buf, 2)) < 0) {
  129.     fprintf (stderr, "cannot open remote DECnet object '%s'\n", buf);
  130.     perror ("");
  131.     }
  132.     max_net_read = max_net_write = 512;
  133.     return fd;
  134. }
  135.  
  136. /*
  137.  * unlink() is not provided by the VMS C library (for reasons which have
  138.  * always eluded me).  delete() does essentially the same thing, but
  139.  * doesn't return the same error codes as unlink.  It is, however, sufficient 
  140.  * for our purposes.
  141.  */
  142.  
  143. int
  144. unlink (filename)
  145. char *filename;
  146. {
  147.     return delete (filename);
  148. }
  149.  
  150.