xref: /csrg-svn/old/berknet/netlpr.c (revision 8195)
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