static int build_db(const char *shared, struct dbobj *obj) { char *dummy=malloc(strlen(shared)+sizeof("/cur")); DIR *dirp; struct dirent *de; if (!dummy) { perror("malloc"); return (-1); } strcat(strcpy(dummy, shared), "/cur"); dirp=opendir(dummy); while (dirp && (de=readdir(dirp)) != 0) { char *a, *b; char *c; if (de->d_name[0] == '.') continue; if ((a=malloc(strlen(de->d_name)+1)) == 0) { perror("malloc"); closedir(dirp); free(dummy); return (-1); } if ((b=malloc(strlen(de->d_name)+1)) == 0) { perror("malloc"); closedir(dirp); free(dummy); free(a); return (-1); } strcpy(a, de->d_name); strcpy(b, de->d_name); c=strrchr(a, MDIRSEP[0]); if (c) *c=0; if (dbobj_store(obj, a, strlen(a), b, strlen(b), "R")) { perror("dbobj_store"); free(a); free(b); closedir(dirp); free(dummy); return (-1); } free(a); free(b); } if (dirp) closedir(dirp); free(dummy); return (0); }
static void check_db() { char *dbname; char *lockname; int lockfd; struct dbobj db; time_t now; char *sender_key, *p; size_t val_len; char *val; if (!dbfile || !*dbfile) return; sender_key=strdup(sender); dbname=malloc(strlen(dbfile)+ sizeof( "." DBNAME)); lockname=malloc(strlen(dbfile)+ sizeof(".lock")); for (p=sender_key; *p; p++) *p=tolower((int)(unsigned char)*p); if (!dbname || !lockname || !sender) { perror("malloc"); exit(EX_TEMPFAIL); } strcat(strcpy(dbname, dbfile), "." DBNAME); strcat(strcpy(lockname, dbfile), ".lock"); lockfd=open(lockname, O_RDWR|O_CREAT, 0666); if (lockfd < 0 || ll_lock_ex(lockfd)) { perror(lockname); exit(EX_TEMPFAIL); } dbobj_init(&db); if (dbobj_open(&db, dbname, "C") < 0) { perror(dbname); exit(EX_TEMPFAIL); } time(&now); val=dbobj_fetch(&db, sender_key, strlen(sender_key), &val_len, ""); if (val) { time_t t; if (val_len >= sizeof(t)) { memcpy(&t, val, sizeof(t)); if (t >= now - interval * 60 * 60 * 24) { free(val); dbobj_close(&db); close(lockfd); exit(0); } } free(val); } dbobj_store(&db, sender_key, strlen(sender_key), (void *)&now, sizeof(now), "R"); dbobj_close(&db); close(lockfd); }