xref: /original-bsd/old/berknet/netlpr.c (revision 2301fdfb)
1 static char sccsid[] = "@(#)netlpr.c	4.1	(Berkeley)	09/12/82";
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 	}
166