示例#1
0
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);
}
示例#2
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);
}