void Do_removal(char **argv) { int fd, n; char msg[LINEBUFFER]; DEBUG1("Do_removal: start"); Fix_Rm_Rp_info(0,0); if( ISNULL(RemotePrinter_DYN) ){ SNPRINTF( msg, sizeof(msg)) _("Printer: %s - cannot remove jobs from device '%s'\n"), Printer_DYN, Lp_device_DYN ); if( Write_fd_str( 1, msg ) < 0 ) cleanup(0); return; } /* fix up authentication */ if( Auth ){ Set_DYN(&Auth_DYN, getenv("AUTH")); } if( Check_for_rg_group( Logname_DYN ) ){ SNPRINTF( msg, sizeof(msg)) _("Printer: %s - not in privileged group\n"), Printer_DYN ); if( Write_fd_str( 1, msg ) < 0 ) cleanup(0); return; } if( Direct_DYN && Lp_device_DYN ){ SNPRINTF( msg, sizeof(msg)) _("Printer: %s - direct connection to device '%s'\n"), Printer_DYN, Lp_device_DYN ); if( Write_fd_str( 1, msg ) < 0 ) cleanup(0); return; }
void Show_status(char **argv, int display_format) { int fd; char msg[LINEBUFFER]; DEBUG1("Show_status: start"); /* set up configuration */ Fix_Rm_Rp_info(0,0); if( Check_for_rg_group( Logname_DYN ) ){ SNPRINTF( msg, sizeof(msg)) " Printer: %s - cannot use printer, not in privileged group\n", Printer_DYN ); if( Write_fd_str( 1, msg ) < 0 ) cleanup(0); return; } if( A_flag ){ Set_DYN(&Auth_DYN, getenv("AUTH")); } if( Direct_DYN && Lp_device_DYN ){ SNPRINTF( msg, sizeof(msg)) _(" Printer: %s - direct connection to device '%s'\n"), Printer_DYN, Lp_device_DYN ); if( Write_fd_str( 1, msg ) < 0 ) cleanup(0); return; }
void send_to_logger( int send_to_status_fd, int send_to_mail_fd, struct job *job, const char *header, char *msg_b ) { char *s, *t; char *id, *tstr; int num,pid; char out_b[4*SMALLBUFFER]; struct line_list l; if( !Is_server || Doing_cleanup ) return; Init_line_list(&l); if(DEBUGL4){ char buffer[32]; plp_snprintf(buffer,sizeof(buffer)-5, "%s", msg_b ); if( msg_b ) safestrncat( buffer,"..."); LOGDEBUG("send_to_logger: Logger_fd fd %d, send_to_status_fd %d, send_to_mail fd %d, header '%s', body '%s'", Logger_fd, send_to_status_fd, send_to_mail_fd, header, buffer ); } if( send_to_status_fd <= 0 && send_to_mail_fd <= 0 && Logger_fd <= 0 ) return; s = t = id = tstr = 0; num = 0; if( job ){ Set_str_value(&l,IDENTIFIER, (id = Find_str_value(&job->info,IDENTIFIER)) ); Set_decimal_value(&l,NUMBER, (num = Find_decimal_value(&job->info,NUMBER)) ); } Set_str_value(&l,UPDATE_TIME,(tstr=Time_str(0,0))); Set_decimal_value(&l,PROCESS,(pid=getpid())); plp_snprintf( out_b, sizeof(out_b), "%s at %s ## %s=%s %s=%d %s=%d\n", msg_b, tstr, IDENTIFIER, id, NUMBER, num, PROCESS, pid ); if( send_to_status_fd > 0 && Write_fd_str( send_to_status_fd, out_b ) < 0 ){ DEBUG4("send_to_logger: write to send_to_status_fd %d failed - %s", send_to_status_fd, Errormsg(errno) ); } if( send_to_mail_fd > 0 && Write_fd_str( send_to_mail_fd, out_b ) < 0 ){ DEBUG4("send_to_logger: write to send_to_mail_fd %d failed - %s", send_to_mail_fd, Errormsg(errno) ); } if( Logger_fd > 0 ){ Set_str_value(&l,PRINTER,Printer_DYN); Set_str_value(&l,HOST,FQDNHost_FQDN); s = Escape(msg_b,1); Set_str_value(&l,VALUE,s); if(s) free(s); s = 0; t = Join_line_list(&l,"\n"); s = Escape(t,1); if(t) free(t); t = 0; t = safestrdup4(header,"=",s,"\n",__FILE__,__LINE__); Write_fd_str( Logger_fd, t ); if( s ) free(s); s = 0; if( t ) free(t); t = 0; } Free_line_list(&l); }
int Send_auth_transfer( int *sock, int transfer_timeout, struct job *job, struct job *logjob, char *error, int errlen, char *cmd, struct security *security, struct line_list *info ) { struct stat statb; int ack, len, n, fd; /* ACME! The best... */ int status = JFAIL; /* job status */ char *secure, *destination, *from, *client, *s; char *tempfile; char buffer[SMALLBUFFER]; errno = 0; secure = 0; fd = Make_temp_fd(&tempfile); if( cmd && (s = safestrrchr(cmd,'\n')) ) *s = 0; DEBUG1("Send_auth_transfer: cmd '%s'", cmd ); if(DEBUGL1)Dump_line_list("Send_auth_transfer: info ", info ); destination = Find_str_value(info, DESTINATION, Value_sep ); from = Find_str_value(info, FROM, Value_sep ); client = Find_str_value(info, CLIENT, Value_sep ); if( safestrcmp(security->config_tag, "kerberos") ){ Put_in_auth(fd,DESTINATION,destination); if( Is_server ) Put_in_auth(fd,SERVER,from); Put_in_auth(fd,CLIENT,client); if( cmd ){ Put_in_auth(fd,INPUT,cmd); } } else { if( cmd && (Write_fd_str(fd,cmd) < 0 || Write_fd_str(fd,"\n") < 0) ){ SNPRINTF(error, errlen) "Send_auth_transfer: '%s' write failed - %s", tempfile, Errormsg(errno) ); goto error; } if( Is_server && (Write_fd_str(fd,client) < 0 || Write_fd_str(fd,"\n") < 0) ){ SNPRINTF(error, errlen) "Send_auth_transfer: '%s' write failed - %s", tempfile, Errormsg(errno) ); goto error; }
static int Do_secure_work( char *jobsize, int from_server, char *tempfile, struct line_list *header_info ) { int n, len, linecount = 0, done = 0, fd, status = 0; char *s, *t; char buffer[SMALLBUFFER]; char error[SMALLBUFFER]; struct stat statb; error[0] = 0; if( (fd = Checkread(tempfile,&statb)) < 0 ){ status = JFAIL; plp_snprintf( error, sizeof(error), "Do_secure_work: reopen of '%s' failed - %s", tempfile, Errormsg(errno)); goto error; } buffer[0] = 0; n = 0; done = 0; linecount = 0; while( !done && n < (int)sizeof(buffer)-1 && (len = Read_fd_len_timeout( Send_query_rw_timeout_DYN, fd, buffer+n, sizeof(buffer)-1-n )) > 0 ){ buffer[n+len] = 0; DEBUGF(DRECV1)("Do_secure_work: read %d - '%s'", len, buffer ); while( !done && (s = safestrchr(buffer,'\n')) ){ *s++ = 0; if( safestrlen(buffer) == 0 ){ done = 1; break; } DEBUGF(DRECV1)("Do_secure_work: line [%d] '%s'", linecount, buffer ); if( (t = strchr(buffer,'=')) ){ *t++ = 0; Unescape(t); Set_str_value(header_info, buffer, t ); } else { switch( linecount ){ case 0: if( jobsize ){ if( from_server ){ Set_str_value(header_info,CLIENT,buffer); } done = 1; } else { Set_str_value(header_info,INPUT,buffer); break; } break; case 1: Set_str_value(header_info,CLIENT,buffer); done = 1; break; } } ++linecount; memmove(buffer,s,safestrlen(s)+1); n = safestrlen(buffer); } } if( fd >= 0 ) close(fd); fd = -1; DEBUGFC(DRECV1)Dump_line_list("Do_secure_work - header", header_info ); if( (status = Check_secure_perms( header_info, from_server, error, sizeof(error))) ){ goto error; } DEBUGFC(DRECV1)Dump_line_list("Do_secure_work - header after check", header_info ); buffer[0] = 0; if( jobsize ){ if( (fd = Checkread(tempfile, &statb) ) < 0 ){ status = JFAIL; plp_snprintf( error, sizeof(error), "Do_secure_work: reopen of '%s' for read failed - %s", tempfile, Errormsg(errno)); goto error; } status = Scan_block_file( fd, error, sizeof(error), header_info ); if( (fd = Checkwrite(tempfile,&statb,O_WRONLY|O_TRUNC,1,0)) < 0 ){ status = JFAIL; plp_snprintf( error, sizeof(error), "Do_secure_work: reopen of '%s' for write failed - %s", tempfile, Errormsg(errno)); goto error; } } else { if( (fd = Checkwrite(tempfile,&statb,O_WRONLY|O_TRUNC,1,0)) < 0 ){ status = JFAIL; plp_snprintf( error, sizeof(error), "Do_secure_work: reopen of '%s' for write failed - %s", tempfile, Errormsg(errno)); goto error; } if( (s = Find_str_value(header_info,INPUT)) ){ Dispatch_input( &fd, s, "from secure link" ); } } error: if( fd >= 0 ) close(fd); fd = -1; DEBUGF(DRECV1)("Do_secure_work: status %d, tempfile '%s', error '%s'", status, tempfile, error ); if( error[0] ){ DEBUGF(DRECV1)("Do_secure_work: updating tempfile '%s', error '%s'", tempfile, error ); if( (fd = Checkwrite(tempfile,&statb,O_WRONLY|O_TRUNC,1,0)) < 0 ){ Errorcode = JFAIL; logerr_die(LOG_INFO, "Do_secure_work: reopen of '%s' for write failed", tempfile ); } Write_fd_str(fd,error); close(fd); } DEBUGF(DRECV1)("Do_secure_work: returning %d", status ); return( status ); }
static void log_backend (int kind, char *log_buf) { char stamp_buf[2*SMALLBUFFER]; int n; char *s; /* plp_block_mask omask; / **/ int err = errno; /* plp_block_all_signals (&omask); / **/ /* put the error message into the status file as well */ /* * Now build up the state info: timestamp, hostname, argv[0], pid, etc. * Don't worry about efficiency here -- it shouldn't happen very often * (unless we're debugging). */ stamp_buf[0] = 0; /* remove trailing \n */ if( (s = strrchr(log_buf, '\n')) && cval(s+1) == 0 ){ *s = 0; } if( Is_server || DEBUGL1 ){ /* log stuff */ if( (LOG_EMERG < LOG_INFO && kind <= LOG_INFO ) || ( LOG_EMERG > LOG_INFO && kind >= LOG_INFO )){ setstatus( 0, "%s", log_buf ); use_syslog(kind, log_buf); } n = safestrlen(stamp_buf); s = stamp_buf+n; n = sizeof(stamp_buf)-n; (void) plp_snprintf( s, n, "%s", Time_str(0,0) ); if (ShortHost_FQDN ) { n = safestrlen(stamp_buf); s = stamp_buf+n; n = sizeof(stamp_buf)-n; (void) plp_snprintf( s, n, " %s", ShortHost_FQDN ); } if(Debug || DbgFlag){ n = safestrlen(stamp_buf); s = stamp_buf+n; n = sizeof(stamp_buf)-n; (void) plp_snprintf(s, n, " [%ld]", (long)getpid()); n = safestrlen(stamp_buf); s = stamp_buf+n; n = sizeof(stamp_buf)-n; if(Name) (void) plp_snprintf(s, n, " %s", Name); n = safestrlen(stamp_buf); s = stamp_buf+n; n = sizeof(stamp_buf)-n; (void) plp_snprintf(s, n, " %s", putlogmsg(kind) ); } n = safestrlen(stamp_buf); s = stamp_buf+n; n = sizeof(stamp_buf)-n; (void) plp_snprintf(s, n, " %s", log_buf ); } else { (void) plp_snprintf(stamp_buf, sizeof(stamp_buf), "%s", log_buf ); } if( safestrlen(stamp_buf) > (int)sizeof(stamp_buf) - 8 ){ stamp_buf[sizeof(stamp_buf)-8] = 0; strcpy(stamp_buf+safestrlen(stamp_buf),"..."); } n = safestrlen(stamp_buf); s = stamp_buf+n; n = sizeof(stamp_buf)-n; (void) plp_snprintf(s, n, "\n" ); /* use writes here: on HP/UX, using f p rintf really screws up. */ /* if stdout or stderr is dead, you have big problems! */ Write_fd_str( 2, stamp_buf ); /* plp_unblock_all_signals ( &omask ); / **/ errno = err; }
int main(int argc, char *argv[], char *envp[]) { int i; struct line_list l, options, request_list; char msg[SMALLBUFFER], *s; Init_line_list(&l); Init_line_list(&options); Init_line_list(&request_list); /* set signal handlers */ (void) plp_signal (SIGHUP, cleanup_HUP); (void) plp_signal (SIGINT, cleanup_INT); (void) plp_signal (SIGQUIT, cleanup_QUIT); (void) plp_signal (SIGTERM, cleanup_TERM); (void) signal(SIGCHLD, SIG_DFL); (void) signal(SIGPIPE, SIG_IGN); /* * set up the user state */ Status_line_count = 1; #ifndef NODEBUG Debug = 0; #endif Displayformat = REQ_DLONG; Initialize(argc, argv, envp, 'T' ); Setup_configuration(); Get_parms(argc, argv ); /* scan input args */ if( A_flag && !getenv( "AUTH" ) ){ FPRINTF(STDERR,"lpstat: requested authenticated transfer (-A) and AUTH environment variable not set"); usage(); } /* set up configuration */ Get_printer(); Fix_Rm_Rp_info(0,0); Get_all_printcap_entries(); /* check on printing scheduler is running */ if( t_flag ){ All_printers = 1; r_flag = d_flag = p_flag = o_flag = 1; s_flag = 0; } if( s_flag ){ /* a_flag = 1; */ r_flag = 1; d_flag = 1; v_flag = 1; All_printers = 1; } if( All_printers ){ Merge_line_list( &request_list, &All_line_list,0,0,0); } Merge_line_list( &request_list, &Printer_list,0,0,0); Check_max(&options,2); if( options.count ){ for( i = options.count; i > 0 ; --i ){ options.list[i] = options.list[i-1]; } options.list[0] = safestrdup(Logname_DYN,__FILE__,__LINE__); ++options.count; } options.list[options.count] = 0; if( Found_flag == 0 ){ if( request_list.count == 0 ){ Split(&request_list,Printer_DYN,", ",1,0,1,1,0,0); } o_flag = 1; flag_count = 1; } #ifdef ORIGINAL_DEBUG//JY@1020 if(DEBUGL1)Dump_line_list("lpstat - printer request list", &request_list); if(DEBUGL1)Dump_line_list("lpstat - options", &options); #endif if( r_flag ){ Write_fd_str(1,"scheduler is running\n"); } if( d_flag ){ if( Printer_DYN == 0 ){ Write_fd_str(1,"no system default destination\n"); } else { SNPRINTF(msg,sizeof(msg)) "system default destination: %s\n", Printer_DYN); Write_fd_str(1,msg); } } if( v_flag ){ for( i = 0; i < request_list.count; ++i ){ Set_DYN(&Printer_DYN,request_list.list[i] ); Fix_Rm_Rp_info(0,0); SNPRINTF(msg,sizeof(msg)) "system for %s: %s\n", Printer_DYN, RemoteHost_DYN); Write_fd_str(1,msg); } } /* see if additional status required */ Free_line_list( &Printer_list ); for( i = 0; i < request_list.count; ++i ){ s = request_list.list[i]; Set_DYN(&Printer_DYN,s ); Show_status(options.list, 0); } Free_line_list( &Printer_list ); if( flag_count ){ for( i = 0; i < request_list.count; ++i ){ s = request_list.list[i]; Set_DYN(&Printer_DYN,s ); Show_status(options.list, 1); } } DEBUG1("lpstat: done"); Remove_tempfiles(); DEBUG1("lpstat: tempfiles removed"); Errorcode = 0; DEBUG1("lpstat: cleaning up"); return(0); }