#include #include #include #include #include #include #include #include #include #include "fe_socket.h" #include "pfqtcp.h" #include "config.h" #include "pfqhelp.h" #include "pfqmessage.h" #include "pfregex.h" #include "pfqconfig.h" #include "pfqlib.h" #define CAT_BUF_SIZE 20*1024 #define BUF_SIZE 250 int svrs; // Server socket struct sockaddr_in svra; char *a_names[]={ "hold", "delete", "release", "requeue" }; int page_step; int pfqMSGMARK; char* cat_buf; char* regexps; struct pfql_context_t *pfql_ctx; struct msg_list_t *msg_list; /* Array of CURRENTLY SHOWN msg ids */ int msg_num; /* Number of messages in the queue */ time_t last_repaint; int half_delay_time; void version() { printf ( "spfqueue - Version %s - (C) 2004-2007 Stefano Rivoir\n", VERSION ); } int w_socket ( int s, const char* b ) { write ( s, b, strlen(b) ); printf ( b ); } void strip_nl(char* b, int l) { int i; for ( i=0; ifrom ); w_socket ( cs, buf ); } void client_send_status ( int cs, const char *id ) { char buf[BUF_SIZE]; struct msg_t *msg; msg = pfql_msg(pfql_ctx,id); if ( !msg ) { sprintf ( buf, "%s: NOMSG\n", CMD_ERROR ); w_socket ( cs, buf ); return; } pfql_retr_status(pfql_ctx,id); sprintf ( buf, "%s: %s\n", CMD_REPLY, msg->stat ); w_socket ( cs, buf ); } void client_send_path ( int cs, const char *id ) { char buf[BUF_SIZE]; struct msg_t *msg; msg = pfql_msg(pfql_ctx,id); if ( !msg ) { sprintf ( buf, "%s: NOMSG\n", CMD_ERROR ); w_socket ( cs, buf ); return; } pfql_retr_headers(pfql_ctx,id); sprintf ( buf, "%s: %s\n", CMD_REPLY, msg->path ); w_socket ( cs, buf ); } void client_send_to ( int cs, char *id ) { char buf[BUF_SIZE]; struct msg_t *msg; msg = pfql_msg(pfql_ctx,id); if ( !msg ) { sprintf ( buf, "%s: NOMSG\n", CMD_ERROR ); w_socket ( cs, buf ); return; } pfql_retr_headers(pfql_ctx,id); sprintf ( buf, "%s: %s\n", CMD_REPLY, msg->to ); w_socket ( cs, buf ); } void client_send_subj ( int cs, char *id ) { char buf[BUF_SIZE]; struct msg_t *msg; msg = pfql_msg(pfql_ctx,id); if ( !msg ) { sprintf ( buf, "%s: NOMSG\n", CMD_ERROR ); w_socket ( cs, buf ); return; } pfql_retr_headers(pfql_ctx,id); sprintf ( buf, "%s: %s\n", CMD_REPLY, msg->subj ); w_socket ( cs, buf ); } void client_send_nummsg ( int cs ) { char buf[BUF_SIZE]; sprintf ( buf, "%s: %.05d\n", CMD_REPLY, pfql_num_msg(pfql_ctx) ); w_socket(cs, buf); } void client_send_numq ( int cs ) { char buf[BUF_SIZE]; sprintf ( buf, "%s: %.05d\n", CMD_REPLY, pfql_num_queues(pfql_ctx) ); w_socket(cs, buf); } void client_send_queue_name ( int cs, int q ) { char buf[BUF_SIZE]; sprintf ( buf, "%s: %s\n", CMD_REPLY, pfql_queue_name(pfql_ctx,q) ); w_socket(cs, buf); } void client_send_id ( int cs, int n ) { struct msg_t *msg; char buf[BUF_SIZE]; msg = pfql_msg_at(pfql_ctx,n); if ( (!msg) || !strlen(msg->id) ) sprintf ( buf, "%s: NOMSG\n", CMD_ERROR ); else sprintf ( buf, "%s: %s\n", CMD_REPLY, msg->id ); w_socket ( cs, buf ); } void client_send_lastchanged ( int cs ) { char buf[BUF_SIZE]; sprintf ( buf, "%s: %d\n", CMD_REPLY, pfql_queue_last_changed(pfql_ctx) ); w_socket ( cs, buf ); } void client_set_queue ( int cs, int q ) { char buf[BUF_SIZE]; pfql_set_queue(pfql_ctx,q); sprintf ( buf, "%s: OK\n", CMD_REPLY ); w_socket ( cs, buf ); } void client_send_list ( int cs ) { char buf[2048]; int i, n; struct msg_t *msg; if ( pfql_num_msg(pfql_ctx)<0 ) { sprintf ( buf, "%s: EMPTY\n", CMD_REPLY ); w_socket ( cs, buf ); return; } n = pfql_num_msg(pfql_ctx); write ( cs, CMD_REPLY, strlen(CMD_REPLY) ); for ( i=0; iid, strlen(msg->id) ); if ( ibackends_path, pfql_getconf(pfql_ctx)->max_char, "%s", optarg ); break; case 'b': snprintf ( pfql_getconf(pfql_ctx)->backend_name, pfql_getconf(pfql_ctx)->max_char, "%s", optarg ); break; case 'q': mm = atoi ( optarg ); switch ( mm ) { case 1: mm = 0; break; case 2: mm = 3; break; case 3: mm = 2; break; case 4: mm = 1; break; default: mm = 0; } pfql_getconf(pfql_ctx)->initial_queue = mm; break; case 'h': usage(); exit(0); break; case 'v': version(); exit(0); break; case 'm': mm = atoi (optarg); if ( mm < 5 ) mm = 5; pfql_getconf(pfql_ctx)->msg_max = mm; break; case 's': half_delay_time = atoi ( optarg ); if ( half_delay_time > 300 ) half_delay_time = 300; if ( half_delay_time < 1 ) half_delay_time = 1; break; case 'l': mm = atoi ( optarg ); if ( mm > 300 ) mm = 300; if ( mm < 1 ) mm = 1; pfql_getconf(pfql_ctx)->scan_limit = mm; break; case 'e': pfql_getstatus(pfql_ctx)->use_envelope = 1; break; case 'n': pfql_getstatus(pfql_ctx)->use_colors = 0; break; case 'd': pfql_getconf(pfql_ctx)->scan_delay = atoi(optarg); break; case '?': goto do_exit; } } if ( pfql_start(pfql_ctx) != PFQL_OK ) { pfql_context_destroy(pfql_ctx); return -1; } main_loop(); do_exit: if ( pfql_ctx ) pfql_context_destroy ( pfql_ctx ); fe_close(); return 0; }