LPQ.C
上传用户:better800
上传日期:2022-06-13
资源大小:1853k
文件大小:4k
源码类别:

TCP/IP协议栈

开发平台:

DOS

  1. /*
  2.  * Lpq - query printer
  3.  *
  4.  *   Copyright (C) 1991 Erick Engelke
  5.  *
  6.  *   Portions Copyright (C) 1990, National Center for Supercomputer Applications
  7.  *   and portions copyright (c) 1990, Clarkson University
  8.  *
  9.  *   This program is free software; you can redistribute it and/or modify
  10.  *   it, but you may not sell it.
  11.  *
  12.  *   This program is distributed in the hope that it will be useful,
  13.  *   but without any warranty; without even the implied warranty of
  14.  *   merchantability or fitness for a particular purpose.
  15.  *
  16.  *       Erick Engelke                   or via E-Mail
  17.  *       Faculty of Engineering
  18.  *       University of Waterloo          Erick@development.watstar.uwaterloo.ca
  19.  *       200 University Ave.,
  20.  *       Waterloo, Ont., Canada
  21.  *       N2L 3G1
  22.  *
  23.  *  If you want to use this, make sure you are in /etc/host.lpr or better.
  24.  *
  25.  */
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include <tcp.h>
  30. #define SHORT_LIST 3
  31. #define LONG_LIST  4
  32. #define LPQ_PORT 515
  33. #define LOCAL_PORT 722
  34. extern int errno;
  35. void usage( void )
  36. {
  37. printf("usage: lpq [-Pprinter] [-Sserver] [-l]n");
  38. exit(1);
  39. }
  40. int main(int argc, char **argv)
  41. {
  42.     char buffer[513];
  43.     char printer[35];
  44.     char host[35];
  45.     char *cptr;
  46.     static tcp_Socket socketdata;
  47.     tcp_Socket *s;
  48.     longword host_ip;
  49.     int status;
  50.     int connected = 0;
  51.     int localport;
  52.     int len;
  53.     int i;
  54.     int verbose=0;
  55.     /* */
  56.     /* Set defaults from the environment */
  57.     *host = *printer = '';
  58.     if( (cptr = getenv("LPRSRV")) != NULL )
  59.         strncpy(host,cptr,35);
  60.     if( (cptr = getenv("PRINTER")) != NULL )
  61.         strncpy(printer,cptr,35);
  62.     /* Parse the command line arguments */
  63.     for(i=1; i<=argc ; i++)
  64.     {
  65. if(argv[i][0] == '-')
  66. {
  67. switch(argv[i][1])
  68.    {
  69. case 'P':
  70. if(strlen(argv[i])>2)
  71. {
  72. strcpy(printer,&argv[i][2]);
  73. }
  74. else
  75. {
  76. i++;
  77. strcpy(printer,argv[i]);
  78. }
  79. break;
  80. case 'S':
  81. if(strlen(argv[i])>2)
  82. {
  83. strcpy(host,&argv[i][2]);
  84. }
  85. else
  86. {
  87. i++;
  88. strcpy(host,argv[i]);
  89. }
  90. break;
  91. case 'l':
  92. verbose=1;
  93. break;
  94. default:
  95. usage();
  96. }
  97. }
  98.     }
  99.    /* Verify that we have enough data to procede */
  100.    if(strlen(printer)==0)
  101.    {
  102. printf("A printer must be specified! Use either the command linen");
  103. printf("flag, -Pprinter, or the environment variable, PRINTER.n");
  104. exit(1);
  105.    }
  106.    if(strlen(host)==0)
  107.    {
  108. printf("A LPR Server must be specified! Use either the command linen");
  109. printf("flag, -Sserver, or the environment variable, LPRSRV.n");
  110. exit(1);
  111.    }
  112.    sock_init();
  113.    s = &socketdata;
  114.    if (!(host_ip = resolve( host ))) {
  115.       fprintf(stderr, "lpq: unknown host %snr",host);
  116.       exit(1);
  117.    }
  118.    localport = 255 + (MsecClock() & 255);
  119.    localport = LOCAL_PORT;
  120.    if ( !tcp_open( s, localport, host_ip, LPQ_PORT, NULL)) {
  121.       fprintf(stderr,"Unable to open socket.");
  122.       exit(1);
  123.    }
  124.    sock_wait_established( s, sock_delay , NULL, &status );
  125.    connected = 1;
  126.    if (sock_dataready( s )) {
  127.        sock_fastread( s, buffer, sizeof( buffer ));
  128.        buffer[ sizeof( buffer ) - 1] = 0;
  129.        printf("Response: %sn", buffer );
  130.        sock_tick( s, &status ); /* in case above message closed port */
  131.    }
  132.    if (verbose)
  133.    {
  134. sprintf(buffer,"%c%sn",LONG_LIST,printer);
  135.    }
  136.    else
  137.    {
  138. sprintf(buffer,"%c%sn",SHORT_LIST,printer);
  139.    }
  140.    sock_write(s, buffer, strlen(buffer));
  141.    while ( 1 ) {
  142. sock_wait_input( s, sock_delay, NULL, &status );
  143. len = sock_read( s, buffer, sizeof( buffer ));
  144. printf("%*.*s",len,len,buffer);
  145.    }
  146. sock_err:
  147.    switch ( status) {
  148. case 1 : status = 0;
  149.  break;
  150. case -1: fprintf( stderr, "Host closed connection.nr");
  151.  status = 3;
  152.  break;
  153.    }
  154.    if (!connected)
  155.        fprintf( stderr , "nrCould not get connected.  You may not be in the /etc/hosts.lpd file!nr");
  156.    exit( status );
  157.    return (0);   /* not reached */
  158. }