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: }