Commit | Line | Data |
---|---|---|
e804469b | 1 | static char sccsid[] = "@(#)netlpr.c 4.1 (Berkeley) 9/12/82"; |
0030a8f9 KM |
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 | } |