|
|
1.1 root 1: /* SMBACTIV.C */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6:
7: #define SMBACTIV_VER "1.01"
8:
9: typedef struct {
10: ulong read;
11: ulong firstmsg;
12: } sub_status_t;
13:
14: smb_t smb;
15:
16: ulong first_msg()
17: {
18: smbmsg_t msg;
19:
1.1.1.2 ! root 20: msg.offset=0;
! 21: msg.hdr.number=0;
! 22: if(smb_getmsgidx(&smb,&msg)) /* Get first message index */
! 23: return(0);
! 24: return(msg.idx.number);
1.1 root 25: }
26:
27: long lputs(char *str)
28: {
29: char tmp[256];
30: int i,j,k;
31:
1.1.1.2 ! root 32: j=strlen(str);
! 33: for(i=k=0;i<j;i++) /* remove CRs */
! 34: if(str[i]==CR && str[i+1]==LF)
! 35: continue;
! 36: else
! 37: tmp[k++]=str[i];
! 38: tmp[k]=0;
! 39: return(fputs(tmp,stderr));
1.1 root 40: }
41:
42: /****************************************************************************/
43: /* Performs printf() through local assembly routines */
44: /* Called from everywhere */
45: /****************************************************************************/
1.1.1.2 ! root 46: int lprintf(const char *fmat, ...)
1.1 root 47: {
48: va_list argptr;
49: char sbuf[256];
50: int chcount;
51:
1.1.1.2 ! root 52: va_start(argptr,fmat);
! 53: chcount=vsprintf(sbuf,fmat,argptr);
! 54: va_end(argptr);
! 55: lputs(sbuf);
! 56: return(chcount);
1.1 root 57: }
58:
59: void bail(int code)
60: {
1.1.1.2 ! root 61: exit(code);
1.1 root 62: }
63:
64: int main(int argc, char **argv)
65: {
66: char str[256],*p;
67: int i,j,file;
1.1.1.2 ! root 68: ulong length,max_users=0xffffffff;
! 69: uint32_t l;
1.1 root 70: sub_status_t *sub_status;
71: scfg_t cfg;
72: glob_t gl;
73:
1.1.1.2 ! root 74: fprintf(stderr,"\nSMBACTIV Version %s (%s) - Synchronet Message Base Activity "
! 75: "Monitor\n", SMBACTIV_VER, PLATFORM_DESC);
1.1 root 76:
77: if(argc>1)
78: max_users=atol(argv[1]);
79:
80: if(!max_users) {
81: lprintf("\nusage: SMBACTIV [max_users]\n\n");
82: lprintf("max_users = limit output to subs read by this many users "
83: "or less\n");
84: return(0); }
85:
86: p=getenv("SBBSCTRL");
87: if(p==NULL) {
88: printf("\nSBBSCTRL environment variable not set.\n");
89: #ifdef __unix__
90: printf("\nExample: export SBBSCTRL=/sbbs/ctrl\n");
91: #else
92: printf("\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n");
93: #endif
94: return(1);
95: }
96:
97: memset(&cfg,0,sizeof(cfg));
98: cfg.size=sizeof(cfg);
99: SAFECOPY(cfg.ctrl_dir,p);
100:
101: if(!load_cfg(&cfg,NULL,TRUE,str)) {
102: fprintf(stderr,"!ERROR loading configuration files: %s\n",str);
103: return(1);
104: }
105:
106: chdir(cfg.ctrl_dir);
107:
108: if((sub_status=(sub_status_t *)MALLOC
109: (cfg.total_subs*sizeof(sub_status_t)))==NULL) {
110: printf("ERROR Allocating memory for sub_status\r\n");
111: return(1); }
112:
113: lprintf("\nReading sub-board ");
114: for(i=0;i<cfg.total_subs;i++) {
115: lprintf("%5d of %-5d\b\b\b\b\b\b\b\b\b\b\b\b\b\b",i+1,cfg.total_subs);
116: sprintf(smb.file,"%s%s",cfg.sub[i]->data_dir,cfg.sub[i]->code);
117: if((j=smb_open(&smb))!=0) {
118: lprintf("Error %d opening %s\r\n",j,smb.file);
119: sub_status[i].read=0;
120: sub_status[i].firstmsg=0L;
121: continue; }
122: sub_status[i].read=0;
123: sub_status[i].firstmsg=first_msg();
124: smb_close(&smb); }
125:
126: sprintf(str,"%suser/ptrs/*.ixb",cfg.data_dir);
127: if(glob(str, GLOB_MARK, NULL, &gl)) {
128: lprintf("Unable to find any user pointer files.\n");
129: globfree(&gl);
130: free(sub_status);
131: return(1); }
132:
133: j=0;
134: lprintf("\nComparing user pointers ");
135: for(j=0; j<gl.gl_pathc; j++) {
136: lprintf("%-5d\b\b\b\b\b",j);
137: SAFECOPY(str,gl.gl_pathv[j]);
138: if((file=nopen(str,O_RDONLY|O_BINARY))==-1) {
139: continue; }
140: length=filelength(file);
141: for(i=0;i<cfg.total_subs;i++) {
142: if(sub_status[i].read>max_users)
143: continue;
144: if(length<(cfg.sub[i]->ptridx+1)*10L)
145: continue;
146: else {
147: lseek(file,((long)cfg.sub[i]->ptridx*10L)+4L,SEEK_SET);
148: read(file,&l,4); }
149: if(l>sub_status[i].firstmsg)
150: sub_status[i].read++; }
151: close(file); }
152: globfree(&gl);
153:
154: printf("NumUsers Sub-board\n");
155: printf("-------- -------------------------------------------------"
156: "-----------\n");
157: for(i=0;i<cfg.total_subs;i++) {
158: if(sub_status[i].read>max_users)
159: continue;
160: printf("%8lu %-*s %-*s\n"
161: ,sub_status[i].read
162: ,LEN_GSNAME,cfg.grp[cfg.sub[i]->grp]->sname
163: ,LEN_SLNAME,cfg.sub[i]->lname); }
164:
165: return(0);
166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.