Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Merge branch 'master' of etoilebsd.net:pkgng + make lock file readable to prevent open() fail
Philippe Pepiot committed 15 years ago
commit 245fe19490b109c61a14c5a17f4b01f3e1bd4333
parent 0bf8614ccd601e1775a2c096e7cab02b18de2144
6 files changed +55 -15
modified libpkg/Makefile
@@ -10,7 +10,7 @@ SRCS= pkg.c pkgdb.c pkgdb_cache.c pkg_compat.c util.c

CFLAGS+=  -std=c99
CFLAGS+=  -I${.CURDIR} -I${.CURDIR}/../external/tinycdb -I${.CURDIR}/../external/cjson/
-
LDADD+=   -L/usr/local/lib -L${.CURDIR}/../external/tinycdb -L${.CURDIR}/../external/cjson -lcdb -lcjson -lm -larchive -lz -lbz2 -llzma
+
LDADD+=   -L${.CURDIR}/../external/tinycdb -L${.CURDIR}/../external/cjson -L/usr/local/lib -lcdb -lcjson -lm -larchive -lz -lbz2 -llzma

DEBUG_FLAGS+=  -g
.if defined(PROFILE_BUILD)
modified libpkg/pkg.h
@@ -29,6 +29,7 @@ struct pkgdb {
	size_t i;
	struct cdb db;
	unsigned char flags;
+
	int lock_fd;
};

#define PKGDB_FOREACH(pkg, db) for ((db)->i = 0, (pkg) = (db)->pkgs[0]; \
modified libpkg/pkgdb.c
@@ -4,6 +4,8 @@
#include <unistd.h>
#include <fcntl.h>
#include <sys/param.h>
+
#include <sys/stat.h>
+
#include <sys/file.h>
#include <err.h>
#include <fnmatch.h>
#include <regex.h>
@@ -225,14 +227,50 @@ pkg_match(struct pkg *pkg, const regex_t *re, const char *pattern, match_t match
	return (matched);
}

+
#define LOCK_FILE "lock"
+

+
/*
+
 * Acquire a lock to access the database.
+
 * If `writer' is set to 1, an exclusive lock is requested so it wont mess up
+
 * with other writers or readers.
+
 */
+
void
+
pkgdb_lock(struct pkgdb *db, int writer)
+
{
+
	char fname[FILENAME_MAX];
+
	int flags;
+

+
	snprintf(fname, sizeof(fname), "%s/%s", pkgdb_get_dir(), LOCK_FILE);
+
	if ((db->lock_fd = open(fname, O_RDONLY | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH)) < 0)
+
		err(EXIT_FAILURE, "open(%s)", fname);
+

+
	if (writer == 1)
+
		flags = LOCK_EX;
+
	else
+
		flags = LOCK_SH;
+

+
	if (flock(db->lock_fd, flags) < 0)
+
		errx(EXIT_FAILURE, "unable to acquire a lock to the database");
+
}
+

+
void
+
pkgdb_unlock(struct pkgdb *db)
+
{
+
	flock(db->lock_fd, LOCK_UN);
+
	close(db->lock_fd);
+
	db->lock_fd = -1;
+
}
+

void
pkgdb_init(struct pkgdb *db, const char *pattern, match_t match, unsigned char flags) {
-
	/* first check if the cache has to be rebuild */
-
	pkgdb_cache_update();
	size_t count, i;
	struct pkg *pkg;
	regex_t re;

+
	pkgdb_cache_update(db);
+

+
	pkgdb_lock(db, 0);
+

	db->count = 0;
	db->flags = flags;

@@ -289,6 +327,7 @@ pkgdb_init(struct pkgdb *db, const char *pattern, match_t match, unsigned char f
	db->pkgs[db->count] = NULL;
	qsort(db->pkgs, db->count, sizeof(struct pkg *), pkg_cmp);

+
	pkgdb_unlock(db);
	return;
}

modified libpkg/pkgdb.h
@@ -24,9 +24,11 @@ typedef enum _match_t {
	MATCH_EREGEX
} match_t;

+
void pkgdb_lock(struct pkgdb *db, int write);
+
void pkgdb_unlock(struct pkgdb *db);
+
const char * pkgdb_get_dir(void);
void pkgdb_init(struct pkgdb *, const char *pattern, match_t match, unsigned char flags);
void pkgdb_free(struct pkgdb *db);
size_t pkgdb_count(struct pkgdb *db);
-
const char * pkgdb_get_dir(void);

#endif
modified libpkg/pkgdb_cache.c
@@ -178,7 +178,7 @@ pkgdb_cache_rebuild(const char *pkg_dbdir, const char *cache_path)
}

void
-
pkgdb_cache_update()
+
pkgdb_cache_update(struct pkgdb *db)
{
	const char *pkg_dbdir;
	char cache_path[MAXPATHLEN];
@@ -200,15 +200,13 @@ pkgdb_cache_update()

	snprintf(cache_path, sizeof(cache_path), "%s/pkgdb.cache", pkg_dbdir);

-
	if (stat(cache_path, &cache_st) == -1) {
-
		if (errno == ENOENT) {
-
			pkgdb_cache_rebuild(pkg_dbdir, cache_path);
-
			return;
-
		}
-
		else
-
			err(EXIT_FAILURE, "%s:", cache_path);
-
	}
+
	errno = 0; /* Reset it in case it is set to ENOENT */
+
	if (stat(cache_path, &cache_st) == -1 && errno != ENOENT)
+
		err(EXIT_FAILURE, "%s:", cache_path);

-
	if ( dir_st.st_mtime > cache_st.st_mtime )
+
	if (errno == ENOENT || dir_st.st_mtime > cache_st.st_mtime) {
+
		pkgdb_lock(db, 1);
		pkgdb_cache_rebuild(pkg_dbdir, cache_path);
+
		pkgdb_unlock(db);
+
	}
}
modified libpkg/pkgdb_cache.h
@@ -1,6 +1,6 @@
#ifndef _PKGDB_CACHE_H
#define _PKGDB_CACHE_H

-
void pkgdb_cache_update(void);
+
void pkgdb_cache_update(struct pkgdb *db);

#endif