Annotation of sbbs/sbbs2/smbactiv/smbactiv.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.