/*************************************************************************** * File: qctl.c * command-line qico control tool * Created at Sun Aug 27 21:24:09 2000 by pqr@yasp.com * $Id: qctl.c,v 1.21 2003/03/19 18:43:31 cyrilm Exp $ ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qcconst.h" #include "ver.h" #include "replace.h" #include "xstr.h" extern time_t gmtoff(time_t tt); int qipc_msg; char qflgs[Q_MAXBIT]=Q_CHARS; void usage(char *ex) { printf("qctl-%s copyright (c) pavel kurnosoff, 1999-2000\n" "usage: %s [] [] []\n" " must be in ftn-style (i.e. zone:net/node[.point])!\n" "-h this help screen\n" "-q stop daemon\n" "-Q force queue rescan\n" "-R reread config\n" "-K kill outbound of [ ]\n" "-f query info about \n" "-o query queue (outbound)\n" "-p[n|c|d|h|i] poll [ ] with specified flavor\n" " flavors: ormal, rash, irect, old, mm\n" "-r freq from files \n" "-s[n|c|d|h|i] attach files to with specified flavor\n" " flavors: ormal, rash, irect, old, mm\n" "-k kill attached files after transmission (for -s)\n" "-x[UuWwIi] set[UWI]/reset[uwi] state(s)\n" " < u>ndialable, mmediate, ait\n" "\n", version, ex); } void timeout(int sig) { signal(SIGALRM, SIG_DFL); fprintf(stderr,"got timeout\n"); } int getanswer() { char buf[MSG_BUFFER]; int rc; signal(SIGALRM, timeout); alarm(1); rc=msgrcv(qipc_msg, buf, MSG_BUFFER-1, getpid(), 0); if(rc<4) return 1; if(buf[4]) fprintf(stderr, "%s\n", buf+5); signal(SIGALRM, SIG_DFL); alarm(0); return buf[4]; } void print_worktime(char *flags) { char *p; time_t tm=time(NULL); long tz=gmtoff(tm)/3600; while((p=strsep(&flags, ","))) { if(!strcmp(p,"CM")) { printf(" WkTime: 00:00-24:00\n"); break; } if(p[0]=='T' && p[3]==0) { printf(" WkTime: %02ld:%02d-%02ld:%02d\n", (toupper(p[1])-'A'+tz)%24, islower((int)p[1]) ? 30:0, (toupper(p[2])-'A'+tz)%24, islower((int)p[2]) ? 30:0); break; } } } char *infostrs[]={ "Address: %s\n", "Station: %s\n", " Place: %s\n", " Sysop: %s\n", " Phone: %s\n", " Flags: %s\n", " Speed: %s\n", }; int getnodeinfo() { char buf[MSG_BUFFER], *p, *u; int rc; signal(SIGALRM, timeout); alarm(5); rc=msgrcv(qipc_msg, buf, MSG_BUFFER-1, getpid(), 0); if(rc<4) return 1; if(buf[4]) { fprintf(stderr, "%s\n", buf+5); } else { for(p=buf+5,rc=0;strlen(p);rc++) { printf(infostrs[rc], p); u=p;p+=strlen(p)+1; if(rc==5) print_worktime(u); } } signal(SIGALRM, SIG_DFL); alarm(0); return buf[4]; } int getqueueinfo() { char buf[MSG_BUFFER], *p; char cflags[Q_MAXBIT+1]; int rc; char *a, *m, *f, *t; long flags; int k; printf("%-20s %10s %10s %10s %10s\n","Address","Mail","Files","Trys","Flags"); printf("----------------------------------------------------------------\n"); do { signal(SIGALRM, timeout); alarm(5); rc=msgrcv(qipc_msg, buf, MSG_BUFFER-1, getpid(), 0); alarm(0); if(rc<4) return 1; if(buf[4]) { fprintf(stderr, "%s\n", buf+5); } else if(buf[5]) { a = buf + 6; m = a + strlen(a) + 1; f = m + strlen(m) + 1; t = f + strlen(f) + 1; p = t + strlen(t) + 1; sscanf(p,"%ld",&flags); for(k=0;k