|
|
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: main(argc,argv)
26: char **argv; {
27: /* parms are flags to the lpr command on the rem mach */
28: int rcode,uid,pid;
29: char parms[BUFSIZ], fnoacct, *sn, suid[20], sLprCommand[20];
30: static char tomachstr[BUFSIZ], realcmd[BUFSIZ], tempbuf[BUFSIZ], sCmdAct[BUFSIZ];
31: argv[argc] = 0;
32: parms[0] = 0;
33: debugflg = DBV;
34:
35: strcpy(sLprCommand,"lpr");
36:
37: argv++; argc--;
38: while(argc > 0 && argv[0][0] == '-'){
39: switch(argv[0][1]){
40: case 'b': status.nonotify++; break;
41: case 'c': harg(sLprCommand,&argc,&argv); break;
42: case 'f': status.force++; break;
43: case 'l': harg(status.login,&argc,&argv); break;
44: case 'm': harg(tempbuf,&argc,&argv);
45: remote = lookup(tempbuf);
46: break;
47: case 'n': status.nowrite++; break;
48: case 'p': harg(status.mpasswd,&argc,&argv); break;
49: case 'q': status.quiet++; break;
50: default: strcat(parms,argv[0]); strcat(parms," "); break;
51: }
52: argc--, argv++;
53: }
54: /* read the .netrc file, to get a value for "remote" */
55: commandfile();
56: if(remote == 0)remote = getremote(local);
57: /* fnoacct is true if no password is needed to netlpr */
58: fnoacct = machtype[remote-'a']==M_CC&&machtype[local-'a']==M_CC;
59:
60: if(fnoacct){ /* no acct needed. */
61: /* look in passwd file for jobno */
62: uid = getuid();
63: passwdent();
64: sprintf(suid,"%d",uid);
65: } else {
66: /* get status.localname */
67: sn = SnCurrent();
68: if(sn == NULL){
69: fprintf(stderr,"Unknown userid\n");
70: exit(1);
71: }
72: strcpy(status.localname,sn);
73: /* prompt for login and passwd */
74: promptlogin(remote);
75: }
76:
77: /* check to see that the lpr command is one of the approved set */
78: if(strcmp(sLprCommand,"lpr") != 0
79: && strcmp(sLprCommand,"epr") != 0
80: && strcmp(sLprCommand,"bpr") != 0){
81: fprintf(stderr,
82: "May not execute the '%s' command from netlpr.\n",
83: sLprCommand);
84: exit(1);
85: }
86:
87: do {
88: if(fnoacct)
89: sprintf(sCmdAct,"%s -c%04d,%s %s",
90: sLprCommand,status.jobno,status.localname,parms);
91: else sprintf(sCmdAct,"%s %s",sLprCommand,parms);
92:
93: sprintf(tomachstr,"-m%c",remote);
94: sprintf(realcmd,"netlpr %s%s",parms,(argc > 0 ? argv[0] : ""));
95:
96: while((pid = fork()) == -1)sleep(2);
97: if(pid == 0){
98: if(argc > 0){
99: if(access(argv[0],04) == -1){
100: perror(argv[0]);
101: exit(1);
102: }
103: # ifdef CC
104: if(fnoacct){
105: setuid(0);
106: mexecl(netcmd,"net",tomachstr,"-y",
107: "-l",status.localname,"-u",suid,
108: "-s",argv[0],"-c",realcmd,sCmdAct,0);
109: }
110: else
111: # endif
112: {
113: kexecl(netcmd,"net",tomachstr,
114: "-s",argv[0],"-c",realcmd,sCmdAct,0);
115: }
116: }
117: else {
118: # ifdef CC
119: if(fnoacct){
120: setuid(0);
121: mexecl(netcmd,"net",tomachstr,"-y","-",
122: "-l",status.localname,"-u",suid,
123: "-c",realcmd,sCmdAct,0);
124: }
125: else
126: # endif
127: {
128: kexecl(netcmd,"net",tomachstr, "-",
129: "-c",realcmd,sCmdAct,0);
130: }
131: }
132: fprintf(stderr,"Network is down\n");
133: exit(1);
134: }
135: wait(&rcode);
136: argc--, argv++;
137: } while(argc > 0);
138: exit(rcode >> 8);
139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.