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