1: static char sccsid[] = "@(#)netlpr.c	4.1	(Berkeley)	9/12/82";
   2: 
   3: /* sccs id variable */
   4: static char *netlpr_sid = "@(#)netlpr.c	1.4";
   5: /*
   6: 
   7: netlpr [-m mach] [-l login] [-p password] [-f] [-n] [-q] [-c ?pr] [file1 ... filen]
   8: 
   9: 	send a set of files to the lineprinter on the mach machine.
  10: 	if between CC machines, no account is needed, so no login
  11: 	or passwd is prompted.
  12: 	Other flags are simply passed thru.
  13: 	Flags:
  14: 		-m mach		remote machine
  15: 		-l login	remote login name, ignored on CC
  16: 		-p passwd	remote password,     "     "   "
  17: 		-f		force prompting of user name
  18: 		-n		don't send anything back
  19: 		-q		quiet option
  20: 		-c printer	use the "printer" command instead of "lpr"
  21: */
  22: /* also, netlpr should check the remote lpr's other user execute
  23:    bit to see if it is down
  24: */
  25: /* must run setuid root on CC machines only */
  26: 
  27: # include "defs.h"
  28: 
  29: /* global variables */
  30: struct userinfo status;
  31: 
  32: main(argc,argv)
  33:   char **argv; {
  34:     /* parms are flags to the lpr command on the rem mach */
  35:     int rcode,uid,pid, Iflag;
  36:     char parms[BUFSIZ], fnoacct, *sn, suid[20], sLprCommand[20];
  37:     static char tomachstr[BUFSIZ], realcmd[BUFSIZ], tempbuf[BUFSIZ],
  38:         sCmdAct[BUFSIZ];
  39:     argv[argc] = 0;
  40:     parms[0] = 0;
  41:     debugflg = DBV;
  42: 
  43:     strcpy(sLprCommand,"lpr");
  44: 
  45:     argv++; argc--;
  46:     Iflag = 0;
  47:     while(argc > 0 && argv[0][0] == '-'){
  48:         if( Iflag ) {
  49:             strcat( parms, argv[0] );
  50:             strcat( parms, " " );
  51:             argc--; argv++;
  52:             continue;
  53:         }
  54:         switch(argv[0][1]){
  55:         case 'c': harg(sLprCommand); break;
  56:         case 'f': status.force++; break;
  57:         case 'l': harg(status.login); break;
  58:         case 'm': harg(tempbuf);
  59:               remote = lookup(tempbuf);
  60:               if(remote == 0){
  61:                 fprintf(stderr,"Unknown machine %s\n",tempbuf);
  62:                 exit(EX_NOHOST);
  63:               }
  64:               break;
  65:         case 'n': status.nowrite++; break;
  66:         case 'p': harg(status.mpasswd); break;
  67:         case 'q': status.quiet++; break;
  68:         case 'I': Iflag++; break;
  69:         default:  strcat(parms,argv[0]); strcat(parms," "); break;
  70:         }
  71:         argc--, argv++;
  72:         }
  73:     /* read the .netrc file, to get a value for "remote" */
  74:     commandfile();
  75:     if(remote == 0)remote = getremote(local);
  76:     /* fnoacct is true if no password is needed to netlpr */
  77:     fnoacct = machtype[chtoinx(remote)]==M_CC
  78:               && machtype[chtoinx(local)]==M_CC;
  79: 
  80:     if(fnoacct){ /* no acct needed. */
  81:         /* look in passwd file for jobno */
  82:         uid = getuid();
  83:         passwdent();
  84:         sprintf(suid,"%d",uid);
  85:     } else {
  86:         /* get status.localname */
  87:         sn = SnFromUid(getuid());
  88:         if(sn == NULL){
  89:             fprintf(stderr,"Unknown userid\n");
  90:             exit(EX_OSFILE);
  91:         }
  92:         strcpy(status.localname,sn);
  93:         /* prompt for login and passwd */
  94:         envloginpasswd(remote,status.login,status.mpasswd);
  95:         promptlogin(remote);
  96:     }
  97: 
  98:     /* check to see that the lpr command is one of the approved set */
  99:     if(strcmp(sLprCommand,"lpr") != 0
 100:     && strcmp(sLprCommand,"vpr") != 0
 101:     && strcmp(sLprCommand,"epr") != 0
 102:     && strcmp(sLprCommand,"bpr") != 0){
 103:         fprintf(stderr,
 104:             "May not execute the '%s' command from netlpr.\n",
 105:             sLprCommand);
 106:         exit(EX_USAGE);
 107:     }
 108: 
 109:     do {
 110:         if(fnoacct)
 111:             sprintf(sCmdAct,"%s -c%s,%s %s",
 112:             sLprCommand,status.jobno,status.localname,parms);
 113:         else    sprintf(sCmdAct,"%s %s",sLprCommand,parms);
 114: 
 115:         sprintf(tomachstr,"-m%c",remote);
 116:         sprintf(realcmd,"netlpr %s%s",parms,(argc > 0 ? argv[0] : ""));
 117: 
 118:         while((pid = fork()) == -1)sleep(2);
 119:         if(pid == 0){
 120:             if(argc > 0){
 121:                 if(access(argv[0],04) == -1){
 122:                     perror(argv[0]);
 123:                     exit(EX_USAGE);
 124:                     }
 125: # ifdef NOREMACCT
 126:                 if(fnoacct){
 127:                     setuid(0);
 128:                     mexecl(netcmd,"net",tomachstr,"-y",
 129:                     "-l",status.localname,"-u",suid,
 130:                     "-s",argv[0],"-c",realcmd,sCmdAct,0);
 131:                     perror(netcmd);
 132:                     }
 133:                 else
 134: # endif
 135:                 {
 136:                     kexecl(netcmd,"net",tomachstr,
 137:                     "-s",argv[0],"-c",realcmd,sCmdAct,0);
 138:                     perror(netcmd);
 139:                     }
 140:                 }
 141:             else {
 142: # ifdef NOREMACCT
 143:                 if(fnoacct){
 144:                     setuid(0);
 145:                     mexecl(netcmd,"net",tomachstr,"-y","-b","-",
 146:                     "-l","root","-u",suid,
 147:                     "-c",realcmd,sCmdAct,0);
 148:                     perror(netcmd);
 149:                     }
 150:                 else
 151: # endif
 152:                 {
 153:                     kexecl(netcmd,"net",tomachstr, "-",
 154:                     "-c",realcmd,sCmdAct,0);
 155:                     perror(netcmd);
 156:                     }
 157:                 }
 158:             fprintf(stderr,"Network is down\n");
 159:             exit(EX_UNAVAILABLE);
 160:             }
 161:         wait(&rcode);
 162:         argc--, argv++;
 163:         } while(argc > 0);
 164:     exit(rcode >> 8);
 165:     }

Defined functions

main defined in line 32; never used

Defined variables

netlpr_sid defined in line 4; never used
sccsid defined in line 1; never used
status defined in line 30; used 11 times
Last modified: 1982-09-13
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1597
Valid CSS Valid XHTML 1.0 Strict