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