1 static char sccsid[] = "@(#)netlpr.c 4.1 (Berkeley) 09/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 } 166