home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 2 BBS
/
02-BBS.zip
/
XGRP_000.SZH
/
ASSHOLES.C
next >
Wrap
C/C++ Source or Header
|
1991-08-21
|
4KB
|
173 lines
#include "xgroup.h"
/* external var references */
extern char buffer[1024];
extern GROUP *group;
extern CONTROLS control;
extern ADDR *myaddr;
extern ECHOREC *echos;
extern ASSHOLE *assholes;
extern char *groupin;
extern char *groupout;
extern char *grouphold;
extern char *msgdir;
extern char *outbound;
extern char *inbound;
extern char *archive;
extern char *unarchive;
extern word packsize;
extern word netarea;
/* local-only functions */
static void _fastcall turn_uls_to_spaces (char *s);
static void _fastcall turn_spaces_to_uls (char *s);
/* asshole manager module for XGroup. an asshole is, in the context of
this code, someone whose messages you don't want to see. */
void _fastcall free_assholes (void) { /* free all area's assholes */
ASSHOLE *anass,*nextass;
anass = assholes;
while(anass) {
my_free(anass->name);
nextass = anass->next;
my_free(anass);
anass = nextass;
}
assholes = NULL;
}
void _fastcall load_assholes (word areano) { /* load area asshole file */
ASSHOLE *anass,*lastass;
char s[257],*p,*pp;
int handle,rewrite = 0;
time_t t1;
if(assholes) free_assholes();
sprintf(s,"%s/assholes.%03x",msgdir,areano);
handle = sopen(s,O_RDONLY | O_BINARY,SH_DENYNO);
if(handle == -1) return;
while(!eof(handle)) {
if(!fgetsx(s,132,handle)) break;
p = strchr(s,' ');
if(!p) continue;
*p = 0;
p++;
while(*p && *p == ' ') p++;
if(!*p || (!strchr(p,'F') && !strchr(p,'T'))) continue;
pp = strchr(p,' ');
if(pp) {
while(*pp && *pp == ' ') pp++;
if(*pp) {
t1 = atol(pp);
if(t1 != 0L) {
if(t1 < time(NULL)) { /* assholes expired */
rewrite = 1;
continue;
}
}
}
else t1 = 0L;
}
else t1 = 0L;
anass = (ASSHOLE *)malloc(sizeof(ASSHOLE));
if(!anass) {
close(handle);
return;
}
memset(anass,0,sizeof(ASSHOLE));
anass->name=strdup(s);
if(!anass->name) {
my_free(anass);
close(handle);
return;
}
turn_uls_to_spaces(anass->name);
if(strchr(p,'F')) anass->from = 1;
if(strchr(p,'T')) anass->to = 1;
if(strchr(p,'K')) anass->del = 1;
if(strchr(p,'N')) anass->noin = 1;
anass->expire = t1;
if(!assholes) {
assholes = anass;
}
else {
lastass->next = anass;
}
lastass = anass;
anass->next = NULL;
}
close(handle);
if(rewrite) rewrite_assholes(areano);
}
void _fastcall rewrite_assholes (word areano) { /* rewrite area asshole file */
ASSHOLE *anass;
char s[257];
int handle;
sprintf(s,"%s/assholes.%03x",msgdir,areano);
unlink(s);
if(!assholes) {
return;
}
handle = sopen(s,O_RDWR | O_BINARY | O_CREAT,SH_DENYWR,S_IWRITE);
if(handle == -1) {
return;
}
anass = assholes;
while(anass && anass->name) {
turn_spaces_to_uls(anass->name);
ffprintf(handle,"%s ",anass->name);
turn_uls_to_spaces(anass->name);
if(anass->from) write(handle,"F",1);
if(anass->to) write(handle,"T",1);
if(anass->del) write(handle,"K",1);
if(anass->noin) write(handle,"N",1);
ffprintf(handle," %lu\r\n",anass->expire);
anass = anass->next;
}
if(tell(handle) == 0L) {
close(handle);
unlink(s);
}
else close(handle);
}
static void _fastcall turn_uls_to_spaces (char *s) {
while(s && *s) {
if(*s == '_') *s = ' ';
s++;
}
}
static void _fastcall turn_spaces_to_uls (char *s) {
while(s && *s) {
if(*s == ' ') *s = '_';
s++;
}
}