Annotation of sbbs/src/sbbs3/allusers.c, revision 1.1.1.1

1.1       root        1: /* ALLUSERS.C */
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: /****************************************************************************/
                      6: /* Makes global changes to Synchronet user database (USER.DAT)                         */
                      7: /* Compatible with Version 2.1 of Synchronet BBS Software                                      */
                      8: /****************************************************************************/
                      9: 
                     10: #include <stdio.h>
                     11: #include <fcntl.h>
                     12: #include <errno.h>
                     13: #include <stdlib.h>
                     14: #include <sys/stat.h>
                     15: 
                     16: #include "dirwrap.h"
                     17: 
                     18: #include "sbbsdefs.h"
                     19: 
                     20: int  min=0,max=99;
                     21: long reqflags[4]={0},reqrest=0,reqexempt=0;
                     22: 
                     23: char *usage=
                     24: "\nusage: allusers [data\\user path] [[-require] [...]] "
                     25:        "/modify [[/modify] [...]]\n"
                     26: "\nwhere require is one of:\n"
                     27: "       L#                  set minimum level to # (default=0)\n"
                     28: "       M#                  set maximum level to # (default=99)\n"
                     29: "       F#<flags>           set required flags from flag set #\n"
                     30: "       E<flags>            set required exemptions\n"
                     31: "       R<flags>            set required restrictions\n"
                     32: "\nwhere modify is one of:\n"
                     33: "       L#                  change security level to #\n"
                     34: "       F#[+|-]<flags>      add or remove flags from flag set #\n"
                     35: "       E[+|-]<flags>       add or remove exemption flags\n"
                     36: "       R[+|-]<flags>       add or remove restriction flags\n"
                     37: "\nExamples:\n"
                     38: "       ALLUSERS -L30 /FA   add 'A' to flag set #1 for all level 30+ users\n"
                     39: "       ALLUSERS /F3-G      remove 'G' from flag set #3 for all users\n"
                     40: "       ALLUSERS -F2B /E-P  remove 'P' exemption for all users with FLAG '2B'\n"
                     41: "       ALLUSERS /R+W       add 'W' restriction for all users\n"
                     42: ;
                     43: 
                     44: /****************************************************************************/
                     45: /* Attempts to lock a user record, retries for up to 10 seconds                        */
                     46: /* Returns 0 on success, -1 on failure                                                                         */
                     47: /****************************************************************************/
                     48: int lockuser(FILE *stream, ulong offset)
                     49: {
                     50:        time_t start;
                     51: 
                     52: if(lock(fileno(stream),offset,U_LEN)==0)
                     53:        return(0);
                     54: start=time(NULL);
                     55: while(1) {
                     56:        if(lock(fileno(stream),offset,U_LEN)==0)
                     57:                return(0);
                     58:        if(time(NULL)-start>=10L)
                     59:                break; }
                     60: return(-1);
                     61: }
                     62: 
                     63: /****************************************************************************/
                     64: /* Returns bytes offset into user record for flag set # 'set'               */
                     65: /****************************************************************************/
                     66: long getflagoff(int set)
                     67: {
                     68: switch(set) {
                     69:        default:
                     70:                return(U_FLAGS1);
                     71:        case 2:
                     72:                return(U_FLAGS2);
                     73:        case 3:
                     74:                return(U_FLAGS3);
                     75:        case 4:
                     76:                return(U_FLAGS4); }
                     77: }
                     78: 
                     79: /****************************************************************************/
                     80: /* Checks a user record against the requirements set on the command line       */
                     81: /* Returns 1 if the user meets the requirements (or no requirements were       */
                     82: /* specified) or 0 if the user does not meet any of the requirements.          */
                     83: /****************************************************************************/
                     84: int chkuser(FILE *stream, long offset)
                     85: {
                     86:        char str[128];
                     87:        int i;
                     88: 
                     89: if(min || max!=99) {                   /* Check security level */
                     90:        fseek(stream,offset+U_LEVEL,SEEK_SET);
                     91:        if(!fread(str,2,1,stream))
                     92:                return(0);
                     93:        str[2]=0;
                     94:        i=atoi(str);
                     95:        if(i<min || i>max)                      /* not within range */
                     96:                return(0); }                    /* so skip this user */
                     97: 
                     98: for(i=0;i<4;i++)
                     99:        if(reqflags[i]) {
                    100:                fseek(stream,offset+getflagoff(i+1),SEEK_SET);
                    101:                if(!fread(str,8,1,stream))
                    102:                        return(0);
                    103:                str[8]=0;
                    104:                truncsp(str);
                    105:                if((ahtoul(str)&reqflags[i])!=reqflags[i])
                    106:                        return(0); }    /* doesn't have 'em all */
                    107: 
                    108: if(reqrest) {
                    109:        fseek(stream,offset+U_REST,SEEK_SET);
                    110:        if(!fread(str,8,1,stream))
                    111:                return(0);
                    112:        str[8]=0;
                    113:        truncsp(str);
                    114:        if((ahtoul(str)&reqrest)!=reqrest)
                    115:                return(0); }
                    116: 
                    117: if(reqexempt) {
                    118:        fseek(stream,offset+U_REST,SEEK_SET);
                    119:        if(!fread(str,8,1,stream))
                    120:                return(0);
                    121:        str[8]=0;
                    122:        truncsp(str);
                    123:        if((ahtoul(str)&reqexempt)!=reqexempt)
                    124:         return(0); }
                    125: 
                    126: return(1);
                    127: }
                    128: 
                    129: int main(int argc, char **argv)
                    130: {
                    131:        char    dir[128],str[128];
                    132:        int     i,j,k,file,set,sub,mod;
                    133:        long    l,f,flags,flagoff,length,offset;
                    134:        FILE    *stream;
                    135: 
                    136: printf("\nALLUSERS v2.10 - Bulk User Editor for Synchronet User Database\n");
                    137: 
                    138: if(argc<2) {
                    139:        printf(usage);
                    140:        exit(1); }
                    141: dir[0]=0;
                    142: for(i=1;i<argc;i++) {
                    143:        flags=flagoff=sub=mod=0;
                    144:        if(argv[i][0]=='-')
                    145:                switch(toupper(argv[i][1])) {
                    146:                        case 'L':                       /* Set minimum sec level */
                    147:                                min=atoi(argv[i]+2);
                    148:                                break;
                    149:                        case 'M':                       /* Set maximum sec level */
                    150:                                max=atoi(argv[i]+2);
                    151:                                break;
                    152:                        case 'F':                       /* Set required flags */
                    153:                                j=3;
                    154:                                set=1;
                    155:                                if(isdigit(argv[i][2]))
                    156:                                        set=argv[i][2]&0xf;
                    157:                                else
                    158:                                        j=2;
                    159:                                for(;argv[i][j];j++)
                    160:                     if(isalpha(argv[i][j]))
                    161:                                                reqflags[set-1]|=FLAG(toupper(argv[i][j]));
                    162:                                break;
                    163:                        case 'R':                       /* Set required restrictions */
                    164:                                for(j=2;argv[i][j];j++)
                    165:                     if(isalpha(argv[i][j]))
                    166:                                                reqrest|=FLAG(toupper(argv[i][j]));
                    167:                                break;
                    168:                        case 'E':                       /* Set required exemptions */
                    169:                                for(j=2;argv[i][j];j++)
                    170:                     if(isalpha(argv[i][j]))
                    171:                                                reqexempt|=FLAG(toupper(argv[i][j]));
                    172:                 break;
                    173:                        default:                                                /* Unrecognized include */
                    174:                                printf(usage);
                    175:                 exit(1); }
                    176: 
                    177:        else if(argv[i][0]=='/')
                    178:                switch(toupper(argv[i][1])) {
                    179:                        case 'F':   /* flags */
                    180:                                j=3;
                    181:                                set=1;
                    182:                                if(isdigit(argv[i][2]))
                    183:                                        set=argv[i][2]&0xf;
                    184:                                else
                    185:                                        j=2;
                    186:                                if(argv[i][j]=='+')
                    187:                                        j++;
                    188:                                else if(argv[i][j]=='-') {
                    189:                                        j++;
                    190:                                        sub=1; }
                    191:                                for(;argv[i][j];j++)
                    192:                     if(isalpha(argv[i][j]))
                    193:                         flags|=FLAG(toupper(argv[i][j]));
                    194:                                sprintf(str,"%suser.dat",dir);
                    195:                                if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) {
                    196:                                        printf("Error opening %s\n",str);
                    197:                                        exit(1); }
                    198:                                if((stream=fdopen(file,"w+b"))==NULL) {
                    199:                                        printf("Error opening %s\n",str);
                    200:                                        exit(1); }
                    201:                                setvbuf(stream,NULL,_IOFBF,2048);
                    202:                                length=filelength(file);
                    203:                                printf("\n%s Flags %s Set #%d\n",sub ? "Removing":"Adding"
                    204:                                        ,sub ? "from":"to",set);
                    205:                                for(offset=0;offset<length;offset+=U_LEN) {
                    206:                                        printf("%lu of %lu (%u modified)\r"
                    207:                                                ,(offset/U_LEN)+1,length/U_LEN,mod);
                    208:                                        if(lockuser(stream,offset)) {
                    209:                                                printf("Error locking offset %lu\n",offset);
                    210:                                                continue; }
                    211:                                        if(!chkuser(stream,offset)) {
                    212:                                                unlock(fileno(stream),offset,U_LEN);
                    213:                                                continue; }
                    214:                                        flagoff=getflagoff(set);
                    215:                                        fseek(stream,offset+flagoff,SEEK_SET);
                    216:                                        fread(str,8,1,stream);
                    217:                                        str[8]=0;
                    218:                                        truncsp(str);
                    219:                                        l=f=ahtoul(str);
                    220:                                        if(sub)
                    221:                                                l&=~flags;
                    222:                                        else
                    223:                                                l|=flags;
                    224:                                        if(l==f) {      /* no change */
                    225:                                                unlock(fileno(stream),offset,U_LEN);
                    226:                                                continue; }
                    227:                                        mod++;
                    228:                                        sprintf(str,"%lx",l);
                    229:                                        while(strlen(str)<8)
                    230:                                                strcat(str,"\3");
                    231:                                        fseek(stream,offset+flagoff,SEEK_SET);
                    232:                                        fwrite(str,8,1,stream);
                    233:                                        unlock(fileno(stream),offset,U_LEN); }
                    234:                                fclose(stream);
                    235:                                printf("\n");
                    236:                                break;
                    237:                   case 'E':    /* Exemptions */
                    238:                                flagoff=U_EXEMPT;
                    239:                   case 'R':    /* Restrictions */
                    240:                                if(!flagoff)
                    241:                                        flagoff=U_REST;
                    242:                                j=2;
                    243:                                if(argv[i][j]=='+')
                    244:                                        j++;
                    245:                                else if(argv[i][j]=='-') {
                    246:                                        j++;
                    247:                                        sub=1; }
                    248:                                for(;argv[i][j];j++)
                    249:                     if(isalpha(argv[i][j]))
                    250:                         flags|=FLAG(toupper(argv[i][j]));
                    251:                                sprintf(str,"%suser.dat",dir);
                    252:                                if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) {
                    253:                                        printf("Error opening %s\n",str);
                    254:                                        exit(1); }
                    255:                                if((stream=fdopen(file,"w+b"))==NULL) {
                    256:                                        printf("Error opening %s\n",str);
                    257:                                        exit(1); }
                    258:                                setvbuf(stream,NULL,_IOFBF,2048);
                    259:                                length=filelength(file);
                    260:                                printf("\n%s %s\n"
                    261:                                        ,sub ? "Removing":"Adding"
                    262:                                        ,flagoff==U_REST ? "Restrictions":"Exemptions");
                    263:                                for(offset=0;offset<length;offset+=U_LEN) {
                    264:                                        printf("%lu of %lu (%u modified)\r"
                    265:                                                ,(offset/U_LEN)+1,length/U_LEN,mod);
                    266:                                        if(lockuser(stream,offset)) {
                    267:                                                printf("Error locking offset %lu\n",offset);
                    268:                         continue; }
                    269:                                        if(!chkuser(stream,offset)) {
                    270:                                                unlock(fileno(stream),offset,U_LEN);
                    271:                                                continue; }
                    272:                                        fseek(stream,offset+flagoff,SEEK_SET);
                    273:                                        fread(str,8,1,stream);
                    274:                                        str[8]=0;
                    275:                                        truncsp(str);
                    276:                                        l=f=ahtoul(str);
                    277:                                        if(sub)
                    278:                                                l&=~flags;
                    279:                                        else
                    280:                                                l|=flags;
                    281:                                        if(l==f) {      /* no change */
                    282:                                                unlock(fileno(stream),offset,U_LEN);
                    283:                                                continue; }
                    284:                                        mod++;
                    285:                                        sprintf(str,"%lx",l);
                    286:                                        while(strlen(str)<8)
                    287:                                                strcat(str,"\3");
                    288:                                        fseek(stream,offset+flagoff,SEEK_SET);
                    289:                                        fwrite(str,8,1,stream);
                    290:                                        unlock(fileno(stream),offset,U_LEN); }
                    291:                                fclose(stream);
                    292:                                printf("\n");
                    293:                 break;
                    294:                   case 'L':    /* Level */
                    295:                                j=atoi(argv[i]+2);
                    296:                                if(j>99)
                    297:                                        j=99;
                    298:                                if(j<0)
                    299:                                        j=0;
                    300:                                sprintf(str,"%suser.dat",dir);
                    301:                                if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) {
                    302:                                        printf("Error opening %s\n",str);
                    303:                                        exit(1); }
                    304:                                if((stream=fdopen(file,"w+b"))==NULL) {
                    305:                                        printf("Error opening %s\n",str);
                    306:                                        exit(1); }
                    307:                                setvbuf(stream,NULL,_IOFBF,2048);
                    308:                                length=filelength(file);
                    309:                                printf("\nChanging Levels\n");
                    310:                                for(offset=0;offset<length;offset+=U_LEN) {
                    311:                                        printf("%lu of %lu (%u modified)\r"
                    312:                                                ,(offset/U_LEN)+1,length/U_LEN,mod);
                    313:                                        if(lockuser(stream,offset)) {
                    314:                                                printf("Error locking offset %lu\n",offset);
                    315:                         continue; }
                    316:                                        if(!chkuser(stream,offset)) {
                    317:                                                unlock(fileno(stream),offset,U_LEN);
                    318:                                                continue; }
                    319:                                        fseek(stream,offset+U_LEVEL,SEEK_SET);
                    320:                                        fread(str,2,1,stream);
                    321:                                        str[2]=0;
                    322:                                        truncsp(str);
                    323:                                        if(atoi(str)==j) {              /* no change */
                    324:                                                unlock(fileno(stream),offset,U_LEN);
                    325:                                                continue; }
                    326:                                        sprintf(str,"%02u",j);
                    327:                                        fseek(stream,offset+U_LEVEL,SEEK_SET);
                    328:                                        fwrite(str,2,1,stream);
                    329:                                        unlock(fileno(stream),offset,U_LEN);
                    330:                                        mod++; }
                    331:                                fclose(stream);
                    332:                                printf("\n");
                    333:                 break;
                    334:                        default:
                    335:                                printf(usage);
                    336:                                exit(1); }
                    337:        else {
                    338:                strcpy(dir,argv[i]);
                    339:                backslash(dir); } }
                    340: return(0);
                    341: }

unix.superglobalmegacorp.com

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