home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / OS9_Unix.lzh / RSHSRC / lpr.c < prev    next >
C/C++ Source or Header  |  1992-10-06  |  4KB  |  193 lines

  1. /*
  2.  * LPR
  3.  * Print one or more files on a remote line printer.
  4.  * See usage() below for details. The OS9 version of this
  5.  * utility is based upon original code by W. Richard Stevens,
  6.  *
  7.  *    OS9 port by Ivan Powis (pczip@chem.nott.ac.uk) Aug 92
  8.  *
  9.  */
  10.  
  11. #define LPRMAIN    /*to include storage in defs.h*/
  12. #include    "lpr.h"
  13.  
  14.  
  15. char    *pname;
  16. int        nfiles=0, tmpfile=0;
  17.  
  18. main(argc, argv)
  19. int    argc;
  20. char    *argv[];
  21. {
  22.     FILE        *fp, *fopen(), *xtemp();
  23.     char        *s, *filename, *getenv();
  24.     int        i;
  25.  
  26.     if ((s=getenv("LPHOST")) != 0) hostname=s;
  27.     if ((s=getenv("LPDEST")) != 0) printername=s;
  28. #ifdef SET_USER
  29.     if ((s=getenv("LPUSER")) != 0) rusername=s;
  30. #endif
  31.  
  32.     pname = argv[0];
  33.     while (--argc > 0 && (*++argv)[0] == '-'){
  34.         for (s = argv[0]+1; *s != '\0'; s++){
  35.             switch (*s) {
  36.  
  37.             case 'H':        /* specify host name */
  38.             case 'h':        /* specify host name */
  39.                 if(*++s == '=') ++s;    /*skip over = */
  40.                 hostname=s;
  41.                 s="h";
  42.                 break;
  43.  
  44.             case 'p':        /* specify printer device name */
  45.             case 'P':
  46.                 if(*++s == '=') ++s;    /*skip over = */
  47.                 printername=s;
  48.                 s="p";
  49.                 break;
  50.                 
  51. #ifdef SET_USER
  52.             case 'u':        /* specify username to ues on server */
  53.                 if(*++s == '=') ++s;
  54.                 rusername=s;
  55.                 s="u";
  56.                 break;
  57. #endif
  58.             case 'C':        /* specify Classname */
  59.                 if(*++s == '=') ++s;    /*skip over = */
  60.                 Cname=s;
  61.                 s="C";
  62.                 break;
  63.  
  64.             case 'J':        /* specify Jobname */
  65.             case 't':
  66.             case 'T':
  67.                 if(*++s == '=') ++s;    /*skip over = */
  68.                 Jname=s;
  69.                 s="J";
  70.                 break;
  71.  
  72.             case 'D':        /* debug */
  73.             case 'd':
  74.                 debugflag = 1;
  75.                 break;
  76.  
  77.             case 'b':        /* raw */
  78.             case 'l':
  79.                 rflag = 1;
  80.                 break;
  81.  
  82.             case 'm':        /* mail */
  83.                 mailflag = 1;
  84.                 break;
  85.  
  86.             case 'q':        /* quiet */
  87.                 qflag = 1;
  88.                 break;
  89.  
  90.             case 's':        /* status */
  91.             case 'S':
  92.                 s++;
  93.                 query_server(s);
  94.                 exit(0);
  95.                 
  96.             case 'k':        /* kill */
  97.             case 'K':
  98.                 if(*++s == '=') ++s;    /*skip over = */
  99.                 send_kill(s);
  100.                 exit(0);
  101.                 
  102.             case 'r':        /* rm - remove file after printing */
  103.                 if (*(s+1)=='m'){
  104.                     delflag=1;
  105.                     break;
  106.                 }
  107.             /* else fall thru .... */
  108.             default:
  109.                 printf("Option -%s ?\n",s);
  110.             case '?':
  111.                 usage();
  112.                 break;
  113.             } /*switch*/
  114.         } /*for*/
  115.     } /*while*/
  116.  
  117.     i = 0;
  118.     send_start();
  119.     do {
  120.         tmpfile=0;
  121.         if (argc > 0) {
  122.             filename = argv[i];
  123.             if (strcmp(filename, "-") == 0) {
  124.                 fp = xtemp(&filename);    /*copy stdin to temp filename*/
  125.                 if(fp==NULL) continue;
  126.                 tmpfile=1;
  127.              } else if ( (fp = fopen(argv[i], "r")) == NULL) {
  128.                 fprintf(stderr, "%s: can't open %s\n",
  129.                                 pname, argv[i]);
  130.                 continue;
  131.             }
  132.         } else {
  133.             fp = xtemp(&filename);    /*copy stdin to temp filename*/
  134.             if( fp == NULL)  continue;
  135.             tmpfile=1;
  136.         }
  137.  
  138.         send_file(filename, fp);
  139.         fclose(fp);
  140.         nfiles++;
  141.         if(delflag || tmpfile){
  142.             if(unlink(filename) )
  143.                 printf("Error %d deleting %s\n",errno,filename);
  144.         }
  145.     } while (++i < argc);
  146.     send_done();
  147.     if(nfiles && !qflag)
  148.         printf("Job %s - %d files submitted to %s:%s\n",
  149.             jcname,nfiles,hostname,printername);
  150.     exit(0);
  151. }
  152.  
  153. FILE *xtemp(str)
  154. char **str;
  155. {
  156.     register int c;
  157.     FILE *fp, *fopen();
  158.     static char buf[25]="lpr_temp_XXXXXX";
  159.     char *mktemp();
  160.     
  161.     if( mktemp(buf) == NULL) return NULL;
  162.     *str=buf;
  163.     /* open a temporary file */
  164.     fp=fopen(buf,"w+");
  165.     if(fp == NULL) return NULL;
  166.     /* copy stdin to it */
  167.     while( (c=getchar()) != EOF ) putc(c,fp);
  168.     /* rewind it */
  169.     rewind(fp);
  170.     return fp;
  171. }
  172.  
  173. usage()
  174. {
  175. printf("lpr [modes] [options] [file(s)...]\nlpr [modes] -s[+[secs]]\n");
  176. printf("lpr [modes] -k[=]id\n\n");
  177. printf("Functions:\n\tremote printing of `files'  ... \"-\" implies standard input.\n");
  178. printf("\t-s\t\tprint queue status\n");
  179. printf("\t-s+[n]\trepeat every n secs (default=5)\n");
  180. printf("\t-k[=]n\tdelete entry id=n from queue (n is numeric)\n");
  181. printf("Modes:\n\t-h[=]server_host {or use $LPHOST}\n");
  182. printf("\t-p[=]printer {or use $LPDEST}\n");
  183. #ifdef SET_USER
  184. printf("\t-u[=]server_uname {or use $LPUSER}\n");
  185. #endif
  186. printf("Options:\n\t-C[=]class_name\t\t-{T,J}[=]title\n");
  187. printf("\t-d\tdebug\t\t\t-b,l\tbinary xfer\n");
  188. printf("\t-m\tmail back\t\t-q\tquiet operation\n");
  189. printf("\t-rm\tremove (delete) file after printing\n");
  190. exit(0);
  191. }
  192.  
  193.