diff --git a/src/sbbs3/allusers.c b/src/sbbs3/allusers.c index d052bc4decd1209758706a1bbc71e624a1db5eb2..9d9b32c40f77cd2daf9e78eae891184c8a2039f3 100644 --- a/src/sbbs3/allusers.c +++ b/src/sbbs3/allusers.c @@ -1,11 +1,35 @@ -/* ALLUSERS.C */ +/* $Id$ */ -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************************************************/ -/* Makes global changes to Synchronet user database (USER.DAT) */ -/* Compatible with Version 2.1 of Synchronet BBS Software */ -/****************************************************************************/ +/**************************************************************************** + * @format.tab-size 4 (Plain Text/Source Code File Header) * + * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * + * * + * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * See the GNU General Public License for more details: gpl.txt or * + * http://www.fsf.org/copyleft/gpl.html * + * * + * Anonymous FTP access to the most recent released source is available at * + * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * + * * + * Anonymous CVS access to the development source and modification history * + * is available at cvs.synchro.net:/cvsroot/sbbs, example: * + * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * + * (just hit return, no password is necessary) * + * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * + * * + * For Synchronet coding style and modification guidelines, see * + * http://www.synchro.net/source.html * + * * + * You are encouraged to submit any modifications (preferably in Unix diff * + * format) via e-mail to mods@synchro.net * + * * + * Note: If this box doesn't appear square, then you need to fix your tabs. * + ****************************************************************************/ #include <stdio.h> #include <fcntl.h> @@ -15,7 +39,7 @@ #include "dirwrap.h" -#include "sbbsdefs.h" +#include "sbbs.h" int min=0,max=99; long reqflags[4]={0},reqrest=0,reqexempt=0; @@ -49,15 +73,16 @@ int lockuser(FILE *stream, ulong offset) { time_t start; -if(lock(fileno(stream),offset,U_LEN)==0) - return(0); -start=time(NULL); -while(1) { if(lock(fileno(stream),offset,U_LEN)==0) return(0); - if(time(NULL)-start>=10L) - break; } -return(-1); + start=time(NULL); + while(1) { + if(lock(fileno(stream),offset,U_LEN)==0) + return(0); + if(time(NULL)-start>=10L) + break; + } + return(-1); } /****************************************************************************/ @@ -65,15 +90,16 @@ return(-1); /****************************************************************************/ long getflagoff(int set) { -switch(set) { - default: - return(U_FLAGS1); - case 2: - return(U_FLAGS2); - case 3: - return(U_FLAGS3); - case 4: - return(U_FLAGS4); } + switch(set) { + default: + return(U_FLAGS1); + case 2: + return(U_FLAGS2); + case 3: + return(U_FLAGS3); + case 4: + return(U_FLAGS4); + } } /****************************************************************************/ @@ -86,256 +112,286 @@ int chkuser(FILE *stream, long offset) char str[128]; int i; -if(min || max!=99) { /* Check security level */ - fseek(stream,offset+U_LEVEL,SEEK_SET); - if(!fread(str,2,1,stream)) - return(0); - str[2]=0; - i=atoi(str); - if(i<min || i>max) /* not within range */ - return(0); } /* so skip this user */ + if(min || max!=99) { /* Check security level */ + fseek(stream,offset+U_LEVEL,SEEK_SET); + if(!fread(str,2,1,stream)) + return(0); + str[2]=0; + i=atoi(str); + if(i<min || i>max) /* not within range */ + return(0); /* so skip this user */ + } -for(i=0;i<4;i++) - if(reqflags[i]) { - fseek(stream,offset+getflagoff(i+1),SEEK_SET); + for(i=0;i<4;i++) + if(reqflags[i]) { + fseek(stream,offset+getflagoff(i+1),SEEK_SET); + if(!fread(str,8,1,stream)) + return(0); + str[8]=0; + truncsp(str); + if((ahtoul(str)&reqflags[i])!=reqflags[i]) + return(0); /* doesn't have 'em all */ + + } + + if(reqrest) { + fseek(stream,offset+U_REST,SEEK_SET); if(!fread(str,8,1,stream)) return(0); str[8]=0; truncsp(str); - if((ahtoul(str)&reqflags[i])!=reqflags[i]) - return(0); } /* doesn't have 'em all */ - -if(reqrest) { - fseek(stream,offset+U_REST,SEEK_SET); - if(!fread(str,8,1,stream)) - return(0); - str[8]=0; - truncsp(str); - if((ahtoul(str)&reqrest)!=reqrest) - return(0); } + if((ahtoul(str)&reqrest)!=reqrest) + return(0); + } -if(reqexempt) { - fseek(stream,offset+U_REST,SEEK_SET); - if(!fread(str,8,1,stream)) - return(0); - str[8]=0; - truncsp(str); - if((ahtoul(str)&reqexempt)!=reqexempt) - return(0); } + if(reqexempt) { + fseek(stream,offset+U_REST,SEEK_SET); + if(!fread(str,8,1,stream)) + return(0); + str[8]=0; + truncsp(str); + if((ahtoul(str)&reqexempt)!=reqexempt) + return(0); + } -return(1); + return(1); } int main(int argc, char **argv) { char dir[128],str[128]; - int i,j,k,file,set,sub,mod; + int i,j,file,set,sub,mod; long l,f,flags,flagoff,length,offset; FILE *stream; -printf("\nALLUSERS v2.10 - Bulk User Editor for Synchronet User Database\n"); - -if(argc<2) { - printf(usage); - exit(1); } -dir[0]=0; -for(i=1;i<argc;i++) { - flags=flagoff=sub=mod=0; - if(argv[i][0]=='-') - switch(toupper(argv[i][1])) { - case 'L': /* Set minimum sec level */ - min=atoi(argv[i]+2); - break; - case 'M': /* Set maximum sec level */ - max=atoi(argv[i]+2); - break; - case 'F': /* Set required flags */ - j=3; - set=1; - if(isdigit(argv[i][2])) - set=argv[i][2]&0xf; - else - j=2; - for(;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqflags[set-1]|=FLAG(toupper(argv[i][j])); - break; - case 'R': /* Set required restrictions */ - for(j=2;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqrest|=FLAG(toupper(argv[i][j])); - break; - case 'E': /* Set required exemptions */ - for(j=2;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqexempt|=FLAG(toupper(argv[i][j])); - break; - default: /* Unrecognized include */ - printf(usage); - exit(1); } + printf("\nALLUSERS v2.10 - Bulk User Editor for Synchronet User Database\n"); - else if(argv[i][0]=='/') - switch(toupper(argv[i][1])) { - case 'F': /* flags */ - j=3; - set=1; - if(isdigit(argv[i][2])) - set=argv[i][2]&0xf; - else - j=2; - if(argv[i][j]=='+') - j++; - else if(argv[i][j]=='-') { - j++; - sub=1; } - for(;argv[i][j];j++) - if(isalpha(argv[i][j])) - flags|=FLAG(toupper(argv[i][j])); - sprintf(str,"%suser.dat",dir); - if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { - printf("Error opening %s\n",str); - exit(1); } - if((stream=fdopen(file,"w+b"))==NULL) { - printf("Error opening %s\n",str); - exit(1); } - setvbuf(stream,NULL,_IOFBF,2048); - length=filelength(file); - printf("\n%s Flags %s Set #%d\n",sub ? "Removing":"Adding" - ,sub ? "from":"to",set); - for(offset=0;offset<length;offset+=U_LEN) { - printf("%lu of %lu (%u modified)\r" - ,(offset/U_LEN)+1,length/U_LEN,mod); - if(lockuser(stream,offset)) { - printf("Error locking offset %lu\n",offset); - continue; } - if(!chkuser(stream,offset)) { - unlock(fileno(stream),offset,U_LEN); - continue; } - flagoff=getflagoff(set); - fseek(stream,offset+flagoff,SEEK_SET); - fread(str,8,1,stream); - str[8]=0; - truncsp(str); - l=f=ahtoul(str); - if(sub) - l&=~flags; + if(argc<2) { + printf(usage); + exit(1); + } + dir[0]=0; + for(i=1;i<argc;i++) { + flags=flagoff=sub=mod=0; + if(argv[i][0]=='-') + switch(toupper(argv[i][1])) { + case 'L': /* Set minimum sec level */ + min=atoi(argv[i]+2); + break; + case 'M': /* Set maximum sec level */ + max=atoi(argv[i]+2); + break; + case 'F': /* Set required flags */ + j=3; + set=1; + if(isdigit(argv[i][2])) + set=argv[i][2]&0xf; else - l|=flags; - if(l==f) { /* no change */ - unlock(fileno(stream),offset,U_LEN); - continue; } - mod++; - sprintf(str,"%lx",l); - while(strlen(str)<8) - strcat(str,"\3"); - fseek(stream,offset+flagoff,SEEK_SET); - fwrite(str,8,1,stream); - unlock(fileno(stream),offset,U_LEN); } - fclose(stream); - printf("\n"); - break; - case 'E': /* Exemptions */ - flagoff=U_EXEMPT; - case 'R': /* Restrictions */ - if(!flagoff) - flagoff=U_REST; - j=2; - if(argv[i][j]=='+') - j++; - else if(argv[i][j]=='-') { - j++; - sub=1; } - for(;argv[i][j];j++) - if(isalpha(argv[i][j])) - flags|=FLAG(toupper(argv[i][j])); - sprintf(str,"%suser.dat",dir); - if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { - printf("Error opening %s\n",str); - exit(1); } - if((stream=fdopen(file,"w+b"))==NULL) { - printf("Error opening %s\n",str); - exit(1); } - setvbuf(stream,NULL,_IOFBF,2048); - length=filelength(file); - printf("\n%s %s\n" - ,sub ? "Removing":"Adding" - ,flagoff==U_REST ? "Restrictions":"Exemptions"); - for(offset=0;offset<length;offset+=U_LEN) { - printf("%lu of %lu (%u modified)\r" - ,(offset/U_LEN)+1,length/U_LEN,mod); - if(lockuser(stream,offset)) { - printf("Error locking offset %lu\n",offset); - continue; } - if(!chkuser(stream,offset)) { - unlock(fileno(stream),offset,U_LEN); - continue; } - fseek(stream,offset+flagoff,SEEK_SET); - fread(str,8,1,stream); - str[8]=0; - truncsp(str); - l=f=ahtoul(str); - if(sub) - l&=~flags; + j=2; + for(;argv[i][j];j++) + if(isalpha(argv[i][j])) + reqflags[set-1]|=FLAG(toupper(argv[i][j])); + break; + case 'R': /* Set required restrictions */ + for(j=2;argv[i][j];j++) + if(isalpha(argv[i][j])) + reqrest|=FLAG(toupper(argv[i][j])); + break; + case 'E': /* Set required exemptions */ + for(j=2;argv[i][j];j++) + if(isalpha(argv[i][j])) + reqexempt|=FLAG(toupper(argv[i][j])); + break; + default: /* Unrecognized include */ + printf(usage); + exit(1); + } + + else if(argv[i][0]=='/') + switch(toupper(argv[i][1])) { + case 'F': /* flags */ + j=3; + set=1; + if(isdigit(argv[i][2])) + set=argv[i][2]&0xf; else - l|=flags; - if(l==f) { /* no change */ - unlock(fileno(stream),offset,U_LEN); - continue; } - mod++; - sprintf(str,"%lx",l); - while(strlen(str)<8) - strcat(str,"\3"); - fseek(stream,offset+flagoff,SEEK_SET); - fwrite(str,8,1,stream); - unlock(fileno(stream),offset,U_LEN); } - fclose(stream); - printf("\n"); - break; - case 'L': /* Level */ - j=atoi(argv[i]+2); - if(j>99) - j=99; - if(j<0) - j=0; - sprintf(str,"%suser.dat",dir); - if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { - printf("Error opening %s\n",str); - exit(1); } - if((stream=fdopen(file,"w+b"))==NULL) { - printf("Error opening %s\n",str); - exit(1); } - setvbuf(stream,NULL,_IOFBF,2048); - length=filelength(file); - printf("\nChanging Levels\n"); - for(offset=0;offset<length;offset+=U_LEN) { - printf("%lu of %lu (%u modified)\r" - ,(offset/U_LEN)+1,length/U_LEN,mod); - if(lockuser(stream,offset)) { - printf("Error locking offset %lu\n",offset); - continue; } - if(!chkuser(stream,offset)) { - unlock(fileno(stream),offset,U_LEN); - continue; } - fseek(stream,offset+U_LEVEL,SEEK_SET); - fread(str,2,1,stream); - str[2]=0; - truncsp(str); - if(atoi(str)==j) { /* no change */ + j=2; + if(argv[i][j]=='+') + j++; + else if(argv[i][j]=='-') { + j++; + sub=1; + } + for(;argv[i][j];j++) + if(isalpha(argv[i][j])) + flags|=FLAG(toupper(argv[i][j])); + sprintf(str,"%suser.dat",dir); + if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { + printf("Error opening %s\n",str); + exit(1); + } + if((stream=fdopen(file,"w+b"))==NULL) { + printf("Error opening %s\n",str); + exit(1); + } + setvbuf(stream,NULL,_IOFBF,2048); + length=filelength(file); + printf("\n%s Flags %s Set #%d\n",sub ? "Removing":"Adding" + ,sub ? "from":"to",set); + for(offset=0;offset<length;offset+=U_LEN) { + printf("%lu of %lu (%u modified)\r" + ,(offset/U_LEN)+1,length/U_LEN,mod); + if(lockuser(stream,offset)) { + printf("Error locking offset %lu\n",offset); + continue; + } + if(!chkuser(stream,offset)) { + unlock(fileno(stream),offset,U_LEN); + continue; + } + flagoff=getflagoff(set); + fseek(stream,offset+flagoff,SEEK_SET); + fread(str,8,1,stream); + str[8]=0; + truncsp(str); + l=f=ahtoul(str); + if(sub) + l&=~flags; + else + l|=flags; + if(l==f) { /* no change */ + unlock(fileno(stream),offset,U_LEN); + continue; + } + mod++; + sprintf(str,"%lx",l); + while(strlen(str)<8) + strcat(str,"\3"); + fseek(stream,offset+flagoff,SEEK_SET); + fwrite(str,8,1,stream); + unlock(fileno(stream),offset,U_LEN); + } + fclose(stream); + printf("\n"); + break; + case 'E': /* Exemptions */ + flagoff=U_EXEMPT; + case 'R': /* Restrictions */ + if(!flagoff) + flagoff=U_REST; + j=2; + if(argv[i][j]=='+') + j++; + else if(argv[i][j]=='-') { + j++; + sub=1; + } + for(;argv[i][j];j++) + if(isalpha(argv[i][j])) + flags|=FLAG(toupper(argv[i][j])); + sprintf(str,"%suser.dat",dir); + if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { + printf("Error opening %s\n",str); + exit(1); + } + if((stream=fdopen(file,"w+b"))==NULL) { + printf("Error opening %s\n",str); + exit(1); + } + setvbuf(stream,NULL,_IOFBF,2048); + length=filelength(file); + printf("\n%s %s\n" + ,sub ? "Removing":"Adding" + ,flagoff==U_REST ? "Restrictions":"Exemptions"); + for(offset=0;offset<length;offset+=U_LEN) { + printf("%lu of %lu (%u modified)\r" + ,(offset/U_LEN)+1,length/U_LEN,mod); + if(lockuser(stream,offset)) { + printf("Error locking offset %lu\n",offset); + continue; + } + if(!chkuser(stream,offset)) { + unlock(fileno(stream),offset,U_LEN); + continue; + } + fseek(stream,offset+flagoff,SEEK_SET); + fread(str,8,1,stream); + str[8]=0; + truncsp(str); + l=f=ahtoul(str); + if(sub) + l&=~flags; + else + l|=flags; + if(l==f) { /* no change */ + unlock(fileno(stream),offset,U_LEN); + continue; + } + mod++; + sprintf(str,"%lx",l); + while(strlen(str)<8) + strcat(str,"\3"); + fseek(stream,offset+flagoff,SEEK_SET); + fwrite(str,8,1,stream); + unlock(fileno(stream),offset,U_LEN); + } + fclose(stream); + printf("\n"); + break; + case 'L': /* Level */ + j=atoi(argv[i]+2); + if(j>99) + j=99; + if(j<0) + j=0; + sprintf(str,"%suser.dat",dir); + if(!fexistcase(str) || (file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { + printf("Error opening %s\n",str); + exit(1); + } + if((stream=fdopen(file,"w+b"))==NULL) { + printf("Error opening %s\n",str); + exit(1); + } + setvbuf(stream,NULL,_IOFBF,2048); + length=filelength(file); + printf("\nChanging Levels\n"); + for(offset=0;offset<length;offset+=U_LEN) { + printf("%lu of %lu (%u modified)\r" + ,(offset/U_LEN)+1,length/U_LEN,mod); + if(lockuser(stream,offset)) { + printf("Error locking offset %lu\n",offset); + continue; + } + if(!chkuser(stream,offset)) { + unlock(fileno(stream),offset,U_LEN); + continue; + } + fseek(stream,offset+U_LEVEL,SEEK_SET); + fread(str,2,1,stream); + str[2]=0; + truncsp(str); + if(atoi(str)==j) { /* no change */ + unlock(fileno(stream),offset,U_LEN); + continue; + } + sprintf(str,"%02u",j); + fseek(stream,offset+U_LEVEL,SEEK_SET); + fwrite(str,2,1,stream); unlock(fileno(stream),offset,U_LEN); - continue; } - sprintf(str,"%02u",j); - fseek(stream,offset+U_LEVEL,SEEK_SET); - fwrite(str,2,1,stream); - unlock(fileno(stream),offset,U_LEN); - mod++; } - fclose(stream); - printf("\n"); - break; - default: - printf(usage); - exit(1); } - else { - strcpy(dir,argv[i]); - backslash(dir); } } -return(0); + mod++; + } + fclose(stream); + printf("\n"); + break; + default: + printf(usage); + exit(1); + } + else { + strcpy(dir,argv[i]); + backslash(dir); + } + } + return(0); }