Annotation of 43BSD/old/berknet/netlpr.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)netlpr.c   4.1     (Berkeley)      9/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:        }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.