This is dbase.c in view mode; [Download] [Up]
/* $Id: dbase.c,v 1.1 1995/12/19 19:30:47 eilts Exp eilts $ */ #include "bbs.h" #ifdef NNTPNEWS int updatenewsgroupsdb(bbsddbtyp *bbsddb, newsstattyp *newsstat, const confrecordtyp *confrecord) { int n; SIZE_T len, anz, duplicate_entries; char dbfile[PATH_MAX+1], *statfile, *bufp, *sp1, *sp2, *sp3, c; #ifdef NO_DBOPEN char dbfile_pag[PATH_MAX+1]; #endif boolean bbsddbinit = FALSE; struct stat stats; DBASE_DB *db; DBASE_DBT dbkey, dbdata; static TIME_T db_mtime = (TIME_T)0; TIME_T lastupdate; strcpy(dbfile,confrecord->vardir); #ifndef NO_DBOPEN strmaxcat(dbfile,"/newsgroups.db",PATH_MAX); statfile = dbfile; #else strmaxcat(dbfile,"/newsgroups",PATH_MAX-4); strcpy(dbfile_pag,dbfile); strcat(dbfile_pag,".pag"); statfile = dbfile_pag; #endif if (db_mtime == (TIME_T)0) { bbsddbinit = TRUE; n = stat(statfile,&stats); if (n == 0) { db_mtime = stats.st_mtime; } else if (n < 0 && errno != ENOENT) { bgerror("updatenewsgroupsdb","stat %s: %m",statfile); return -1; } } lastupdate = time((TIME_T)0) - (TIME_T) NEWSGROUP_UPDATE_INTERVALL; if (stat(confrecord->usersfile,&stats) < 0) { bgerror("updatenewsgroupsdb","stat %s: %m",confrecord->usersfile); return -1; } if (bbsddbinit && db_mtime >= lastupdate) { if ((bbsddb->newsgrp_db=dbopen(dbfile,O_RDWR,0600,DB_HASH,NULL)) == NULL) { bgerror("updatenewsgroupsdb","dbopen %s: %m",dbfile); db_mtime = (TIME_T)0; DBASE_UNLINK(dbfile); return -1; } return 0; } if (db_mtime >= lastupdate) return 0; if (! newsstat->is_connected) { if (nntp_connect(newsstat,confrecord) < 0) return -1; } if (bbsddb->newsgrp_db != NULL) { if (bbsddb->newsgrp_db->close(bbsddb->newsgrp_db) < 0) { bgerror("updatenewsgroupsdb","dbclose %m"); nntp_close(newsstat); return -1; } } if ((db=dbopen(dbfile,O_CREAT|O_TRUNC|O_RDWR,0600,DB_HASH,NULL)) == NULL) { bgerror("updatenewsgroupsdb","dbopen %s: %m",dbfile); DBASE_UNLINK(dbfile); nntp_close(newsstat); return -1; } if ((n=nntp_ask(NULL,newsstat,"LIST")) != OK_GROUPS) { bgerror("updatenewsgroupsdb","nntp_ask: %d",n); DBASE_UNLINK(dbfile); nntp_close(newsstat); return -1; } if ((bufp=nntp_copytext(&len,newsstat)) == NULL) { bgerror("updatenewsgroupsdb","nntp_copytext failed"); DBASE_UNLINK(dbfile); nntp_close(newsstat); return -1; } nntp_close(newsstat); anz = 0; duplicate_entries = 0; sp1 = bufp; lowercases(sp1); while (*sp1) { for (sp2=sp1; *sp2 && *sp2!='\n' && *sp2!=' ' && *sp2!='\t'; sp2++) ; c = *sp2; if (c) { *sp2++ = '\0'; for (sp3=sp2; *sp3 && *sp3!='\n'; sp3++) ; c = *sp3; *sp3 = '\0'; DBASE_DATA(dbkey) = sp1; DBASE_SIZE(dbkey) = strlen(sp1) + 1; DBASE_DATA(dbdata) = sp2; DBASE_SIZE(dbdata) = strlen(sp2) + 1; n = db->put(db,&dbkey,&dbdata,R_NOOVERWRITE); anz++; if (n > 0) { duplicate_entries++; /* bgerror("updatenewsgroupsdb","duplicate key %s", (char *)DBASE_DATA(dbkey)); */ } else if (n < 0) { bgerror("updatenewsgroupsdb","error at key %s: %m", (char *)DBASE_DATA(dbkey)); } } if (c == '\0') break; sp1 = sp3 + 1; } free(bufp); #ifdef DEBUG bgerror("updatenewsgroupsdb","Newsgroups-DB: %d group entries (%d doubles)", anz,duplicate_entries); #endif if (db->sync(db,0) < 0) { bgerror("updatenewsgroupsdb","dbsync %s: %m",dbfile); DBASE_UNLINK(dbfile); return -1; } bbsddb->newsgrp_db = db; db_mtime = lastupdate + (TIME_T) NEWSGROUP_UPDATE_INTERVALL; return 0; } #endif int updatebbsddb(bbsddbtyp *bbsddb, const confrecordtyp *confrecord) { int z, n; char zeile[STRLEN+1], dbfile[PATH_MAX+1], emailpath[PATH_MAX+1], user[S_STRLEN+1], *key, *arg, *statfile; #ifdef NO_DBOPEN char dbfile_pag[PATH_MAX+1]; #endif boolean realnamefound, bbsddbinit = FALSE; FILE *fd, *emailfd = NULL; struct stat stats; DBASE_DB *db; DBASE_DBT dbkey, dbdata; static TIME_T db_mtime = (TIME_T)0; strcpy(dbfile,confrecord->vardir); #ifndef NO_DBOPEN strmaxcat(dbfile,"/users.db",PATH_MAX); statfile = dbfile; #else strmaxcat(dbfile,"/users",PATH_MAX-4); strcpy(dbfile_pag,dbfile); strcat(dbfile_pag,".pag"); statfile = dbfile_pag; #endif if (db_mtime == (TIME_T)0) { bbsddbinit = TRUE; n = stat(statfile,&stats); if (n == 0) { db_mtime = stats.st_mtime; } else if (n < 0 && errno != ENOENT) { bgerror("updatebbsddb","stat %s: %m",statfile); return -1; } } if (stat(confrecord->usersfile,&stats) < 0) { bgerror("updatebbsddb","stat %s: %m",confrecord->usersfile); return -1; } if (bbsddbinit && db_mtime >= stats.st_mtime) { if ((bbsddb->u_db=dbopen(dbfile,O_RDWR,0600,DB_HASH,NULL)) == NULL) { bgerror("updatebbsddb","dbopen %s: %m",dbfile); db_mtime = (TIME_T)0; DBASE_UNLINK(dbfile); return -1; } return 0; } if (db_mtime >= stats.st_mtime) return 0; if ((fd=fopen(confrecord->usersfile,"r")) == NULL) { bgerror("updatebbsddb","fopen %s: %m",confrecord->usersfile); return -1; } if (bbsddb->u_db != NULL) { if (bbsddb->u_db->close(bbsddb->u_db) < 0) { bgerror("updatebbsddb","dbclose %m"); return -1; } } strcpy(emailpath,confrecord->vardir); strmaxcat(emailpath,"/bbsusernames",PATH_MAX); if (access(emailpath,W_OK) == 0 || access(emailpath,F_OK) < 0) { if ((emailfd=fopen(emailpath,"w")) == NULL) { bgerror("updatebbsddb","fopen %s: %m",emailpath); return -1; } chmod(emailpath,0644); } if ((db=dbopen(dbfile,O_CREAT|O_TRUNC|O_RDWR,0600,DB_HASH,NULL)) == NULL) { bgerror("updatebbsddb","dbopen %s: %m",dbfile); DBASE_UNLINK(dbfile); return -1; } do { z = fgetnln(zeile,S_STRLEN,fd); if (z > 0 && zeile[0] != '#') { split2key_arg(zeile,&key,&arg); lowercases(key); if (strncmp("user",key,4) != 0) { bgerror("updatebbsddb","'User:' must be first entry in any record"); DBASE_UNLINK(dbfile); return -1; } strmaxcpy(user,arg,S_STRLEN); DBASE_DATA(dbkey) = user; DBASE_SIZE(dbkey) = strlen(user) + 1; if (emailfd != NULL) fprintf(emailfd,"%s\n",arg); realnamefound = FALSE; do { z = fgetnln(zeile,STRLEN,fd); if (z > 0 && z < STRLEN) { split2key_arg(zeile,&key,&arg); lowercases(key); if (strncmp("real",key,4) == 0) { DBASE_DATA(dbdata) = arg; DBASE_SIZE(dbdata) = strlen(arg) + 1; n = db->put(db,&dbkey,&dbdata,R_NOOVERWRITE); realnamefound = TRUE; break; } } } while (z >= 0 && zeile[0] != '$'); while (z >= 0 && zeile[0] != '$') { z = fgetnln(zeile,2,fd); } if (! realnamefound) { DBASE_DATA(dbdata) = ""; DBASE_SIZE(dbdata) = 1; n = db->put(db,&dbkey,&dbdata,R_NOOVERWRITE); } if (n > 0) { bgerror("updatebbsddb","duplicate key %s",(char *)DBASE_DATA(dbkey)); } else if (n < 0) { bgerror("updatebbsddb","error at key %s: %m",(char *)DBASE_DATA(dbkey)); } } } while (z >= 0); if (emailfd != NULL) fclose(emailfd); fclose(fd); if (db->sync(db,0) < 0) { bgerror("updatebbsddb","dbsync %s: %m",dbfile); DBASE_UNLINK(dbfile); return -1; } bbsddb->u_db = db; db_mtime = stats.st_mtime; return 0; } int lookupbbsddb(const bbsddbtyp *bbsddb, const void *key, const SIZE_T keysize, const int keytyp, void *data, SIZE_T *datasize, const confrecordtyp *confrecord) { int n; DBASE_DB *db; DBASE_DBT dbkey, dbval; DBASE_SIZE(dbkey) = keysize; if (keysize == 0) { DBASE_SIZE(dbkey) = strlen((char *)key) + 1; } if ((DBASE_DATA(dbkey) = malloc(DBASE_SIZE(dbkey))) == NULL) { bgerror("lookupbbsddb","malloc: %m"); return -1; } memcpy(DBASE_DATA(dbkey),key,DBASE_SIZE(dbkey)); if (data != NULL) { *datasize = 0; BZERO(data,1); } switch (keytyp) { case USERNAME_DB: db = bbsddb->u_db; n = db->get(db,&dbkey,&dbval,0); if (n > 0) { bgerror("lookupbbsddb","user %s not found",(char *)key); } else if (n < 0) { bgerror("lookupbbsddb","user %s: %m",(char *)key); } else if (n == 0 && data != NULL) { *datasize = DBASE_SIZE(dbval); memcpy(data,DBASE_DATA(dbval),*datasize); } break; case NEWSGROUPS_DB: db = bbsddb->newsgrp_db; n = db->get(db,&dbkey,&dbval,0); if (n > 0) { /* */ } else if (n < 0) { bgerror("lookupbbsddb","group %s: %m",(char *)key); } else if (n == 0 && data != NULL) { *datasize = DBASE_SIZE(dbval); memcpy(data,DBASE_DATA(dbval),*datasize); } break; default: bgerror("lookupbbsddb","unknown keytyp"); n = -1; break; } free(DBASE_DATA(dbkey)); return n; } int getkeysbbsddb(const bbsddbtyp *bbsddb, const int keytyp, void *key, SIZE_T *keysize, void *data, SIZE_T *datasize, const confrecordtyp *confrecord) { int n; static boolean start = TRUE; DBASE_DB *db; DBASE_DBT dbkey, dbdata; switch (keytyp) { case USERNAME_DB: db = bbsddb->u_db; break; case NEWSGROUPS_DB: db = bbsddb->newsgrp_db; break; default: bgerror("getkeysbbsddb","unknown keytyp"); return -1; } n = db->seq(db,&dbkey,&dbdata,start ? R_FIRST : R_NEXT); if (n == 0) { start = FALSE; memcpy(key,DBASE_DATA(dbkey),DBASE_SIZE(dbkey)); *keysize = DBASE_SIZE(dbkey); memcpy(data,DBASE_DATA(dbdata),DBASE_SIZE(dbdata)); *datasize = DBASE_SIZE(dbdata); } else if (n == 1) { start = TRUE; } else { bgerror("getkeysbbsddb","seq: %m"); } return n; } int closebbsddb(const bbsddbtyp *bbsddb) { if (bbsddb->u_db->close(bbsddb->u_db) < 0) { bgerror("closebbsddb","dbclose: %m"); return -1; } return 0; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.