BSD 4_1c_2 release
[unix-history] / usr / src / ucb / berknet / netlpr.c
CommitLineData
e804469b 1static char sccsid[] = "@(#)netlpr.c 4.1 (Berkeley) 9/12/82";
0030a8f9
KM
2
3/* sccs id variable */
4static char *netlpr_sid = "@(#)netlpr.c 1.4";
5/*
6
7netlpr [-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 */
30struct userinfo status;
31
32main(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 }