|
|
1.1 root 1: /* SMBACTIV.C */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include <share.h>
6: #include "sbbs.h"
7:
8: #define SMBACTIV_VER "1.01"
9:
10: typedef struct {
11: ulong read;
12: ulong firstmsg;
13: } sub_status_t;
14:
15: smb_t smb;
16:
17: ulong first_msg()
18: {
19: smbmsg_t msg;
20:
21: msg.offset=0;
22: msg.hdr.number=0;
23: if(smb_getmsgidx(&smb,&msg)) /* Get first message index */
24: return(0);
25: return(msg.idx.number);
26: }
27: /****************************************************************************/
28: /* Puts a backslash on path strings */
29: /****************************************************************************/
30: void backslash(char *str)
31: {
32: int i;
33:
34: i=strlen(str);
35: if(i && str[i-1]!='\\') {
36: str[i]='\\'; str[i+1]=0; }
37: }
38: long lputs(char FAR16 *str)
39: {
40: char tmp[256];
41: int i,j,k;
42:
43: j=strlen(str);
44: for(i=k=0;i<j;i++) /* remove CRs */
45: if(str[i]==CR && str[i+1]==LF)
46: continue;
47: else
48: tmp[k++]=str[i];
49: tmp[k]=0;
50: return(fputs(tmp,stderr));
51: }
52: /****************************************************************************/
53: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */
54: /* number of times if the attempted file is already open or denying access */
55: /* for some other reason. All files are opened in BINARY mode. */
56: /****************************************************************************/
57: int nopen(char *str, int access)
58: {
59: char logstr[256];
60: int file,share,count=0;
61:
62: if(access==O_RDONLY) share=SH_DENYWR;
63: else share=SH_DENYRW;
64: while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1)
65: && errno==EACCES && count++<LOOP_NOPEN);
66: if(file==-1 && errno==EACCES)
67: lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7");
68: return(file);
69: }
70:
71: /****************************************************************************/
72: /* This function performs an nopen, but returns a file stream with a buffer */
73: /* allocated. */
74: /****************************************************************************/
75: FILE *fnopen(int *file, char *str, int access)
76: {
77: char mode[128];
78: FILE *stream;
79:
80: if(access&O_WRONLY) access|=O_RDWR; /* fdopen can't open WRONLY */
81:
82: if(((*file)=nopen(str,access))==-1)
83: return(NULL);
84:
85: if(access&O_APPEND) {
86: if(access&(O_RDONLY|O_RDWR))
87: strcpy(mode,"a+");
88: else
89: strcpy(mode,"a"); }
90: else {
91: if(access&(O_WRONLY|O_RDWR))
92: strcpy(mode,"r+");
93: else
94: strcpy(mode,"r"); }
95: stream=fdopen((*file),mode);
96: if(stream==NULL) {
97: close(*file);
98: return(NULL); }
99: setvbuf(stream,NULL,_IOFBF,16*1024);
100: return(stream);
101: }
102:
103: /****************************************************************************/
104: /* Truncates white-space chars off end of 'str' and terminates at first tab */
105: /****************************************************************************/
106: void truncsp(char *str)
107: {
108: char c;
109:
110: str[strcspn(str,"\t")]=0;
111: c=strlen(str);
112: while(c && str[c-1]<=SP) c--;
113: str[c]=0;
114: }
115:
116: /****************************************************************************/
117: /* Performs printf() through local assembly routines */
118: /* Called from everywhere */
119: /****************************************************************************/
120: int lprintf(char *fmat, ...)
121: {
122: va_list argptr;
123: char sbuf[256];
124: int chcount;
125:
126: va_start(argptr,fmat);
127: chcount=vsprintf(sbuf,fmat,argptr);
128: va_end(argptr);
129: lputs(sbuf);
130: return(chcount);
131: }
132: void bail(int code)
133: {
134: exit(code);
135: }
136:
137: void main(int argc, char **argv)
138: {
139: char str[256],*p;
140: int i,j,file;
141: ulong l,length,max_users=0xffffffff;
142: sub_status_t *sub_status;
143: read_cfg_text_t txt;
144: struct find_t f;
145: FILE *stream;
146:
147: _fmode=O_BINARY;
148: txt.openerr="\7\r\nError opening %s for read.\r\n";
149: txt.reading="\r\nReading %s...";
150: txt.readit="\rRead %s ";
151: txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n";
152: txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n";
153:
154: fprintf(stderr,"\nSMBACTIV Version %s (%s) - Synchronet Message Base Activity "
155: "Monitor\n"
156: ,SMBACTIV_VER
157: #if defined(__OS2__)
158: ,"OS/2"
159: #elif defined(__NT__)
160: ,"Win32"
161: #elif defined(__DOS4G__)
162: ,"DOS4G"
163: #elif defined(__FLAT__)
164: ,"DOS32"
165: #else
166: ,"DOS16"
167: #endif
168: );
169:
170: if(argc>1 && (!stricmp(argv[1],"/?") || !stricmp(argv[1],"?"))) {
171: lprintf("\nusage: SMBACTIV [max_users]\n\n");
172: lprintf("max_users = limit output to subs read by this many users "
173: "or less\n");
174: exit(0); }
175:
176: if(argc>1)
177: max_users=atol(argv[1]);
178:
179: if(!node_dir[0]) {
180: p=getenv("SBBSNODE");
181: if(p==NULL) {
182: printf("\7\nSBBSNODE environment variable not set.\n");
183: exit(1); }
184: strcpy(node_dir,p); }
185:
186: strupr(node_dir);
187:
188: if(node_dir[strlen(node_dir)-1]!='\\')
189: strcat(node_dir,"\\");
190:
191: read_node_cfg(txt);
192: if(ctrl_dir[0]=='.') { /* Relative path */
193: strcpy(str,ctrl_dir);
194: sprintf(ctrl_dir,"%s%s",node_dir,str);
195: if(_fullpath(str,ctrl_dir,40))
196: strcpy(ctrl_dir,str); }
197: backslash(ctrl_dir);
198:
199: read_main_cfg(txt);
200: if(data_dir[0]=='.') { /* Relative path */
201: strcpy(str,data_dir);
202: sprintf(data_dir,"%s%s",node_dir,str);
203: if(_fullpath(str,data_dir,40))
204: strcpy(data_dir,str); }
205: backslash(data_dir);
206: if(text_dir[0]=='.') { /* Relative path */
207: strcpy(str,text_dir);
208: sprintf(text_dir,"%s%s",node_dir,str);
209: if(_fullpath(str,text_dir,40))
210: strcpy(text_dir,str); }
211: backslash(text_dir);
212: read_msgs_cfg(txt);
213:
214: if((sub_status=(sub_status_t *)MALLOC
215: (total_subs*sizeof(sub_status_t)))==NULL) {
216: printf("ERROR Allocating memory for sub_status\r\n");
217: exit(1); }
218:
219: lprintf("\nReading sub-board ");
220: for(i=0;i<total_subs;i++) {
221: lprintf("%5d of %-5d\b\b\b\b\b\b\b\b\b\b\b\b\b\b",i+1,total_subs);
222: sprintf(smb.file,"%s%s",sub[i]->data_dir,sub[i]->code);
223: if((j=smb_open(&smb))!=0) {
224: lprintf("Error %d opening %s\r\n",j,smb.file);
225: sub_status[i].read=0;
226: sub_status[i].firstmsg=0L;
227: continue; }
228: sub_status[i].read=0;
229: sub_status[i].firstmsg=first_msg();
230: smb_close(&smb); }
231:
232: sprintf(str,"%sUSER\\PTRS\\*.IXB",data_dir);
233: if(_dos_findfirst(str,0,&f)) {
234: lprintf("Unable to find any user pointer files.\n");
235: FREE(sub_status);
236: exit(1); }
237:
238: j=0;
239: lprintf("\nComparing user pointers ");
240: while(1) {
241: lprintf("%-5d\b\b\b\b\b",++j);
242: sprintf(str,"%sUSER\\PTRS\\%s",data_dir,f.name);
243: if((file=nopen(str,O_RDONLY))==-1) {
244: if(_dos_findnext(&f))
245: break;
246: continue; }
247: length=filelength(file);
248: for(i=0;i<total_subs;i++) {
249: if(sub_status[i].read>max_users)
250: continue;
251: if(length<(sub[i]->ptridx+1)*10L)
252: continue;
253: else {
254: lseek(file,((long)sub[i]->ptridx*10L)+4L,SEEK_SET);
255: read(file,&l,4); }
256: if(l>sub_status[i].firstmsg)
257: sub_status[i].read++; }
258: close(file);
259: if(_dos_findnext(&f))
260: break; }
261:
262: printf("NumUsers Sub-board\n");
263: printf("-------- -------------------------------------------------"
264: "-----------\n");
265: for(i=0;i<total_subs;i++) {
266: if(sub_status[i].read>max_users)
267: continue;
268: printf("%8lu %-*s %-*s\n"
269: ,sub_status[i].read
270: ,LEN_GSNAME,grp[sub[i]->grp]->sname
271: ,LEN_SLNAME,sub[i]->lname); }
272:
273: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.