#include <signal.h>
#include <string.h>
#include <errno.h>
+#include <pwd.h>
#include <atalk/logger.h>
#include <atalk/globals.h>
static void usage (void)
{
- printf("Usage: dbd [-cfFstvV] <path to netatalk volume>\n\n"
+ printf("Usage: dbd [-cfFstuvV] <path to netatalk volume>\n\n"
"dbd scans all file and directories of AFP volumes, updating the\n"
"CNID database of the volume. dbd must be run with appropiate\n"
"permissions i.e. as root.\n\n"
" -F location of the afp.conf config file\n"
" -f delete and recreate CNID database\n"
" -t show statistics while running\n"
+ " -u username for use with AFP volumes using user variable $u\n"
" -v verbose\n"
" -V show version info\n\n"
);
AFPObj obj = { 0 };
struct vol *vol = NULL;
const char *volpath = NULL;
-
+ char *username = NULL;
int c;
- while ((c = getopt(argc, argv, ":cfF:rstvV")) != -1) {
+ while ((c = getopt(argc, argv, ":cfF:rstu:vV")) != -1) {
switch(c) {
case 'c':
flags |= DBD_FLAGS_V2TOEA;
case 't':
flags |= DBD_FLAGS_STATS;
break;
+ case 'u':
+ username = strdup(optarg);
+ break;
case 'v':
flags |= DBD_FLAGS_VERBOSE;
break;
exit(EXIT_FAILURE);
}
+
/* Initialize CNID subsystem */
cnid_init();
else
setuplog("default:note", "/dev/tty");
+ /* Set username */
+ if (username) {
+ strncpy(obj.username, username, MAXUSERLEN);
+ struct passwd *pwd;
+ pwd = getpwnam(obj.username);
+ if (!pwd) {
+ dbd_log( LOGSTD, "unknown user");
+ exit(EXIT_FAILURE);
+ }
+ obj.uid = pwd->pw_uid;
+ }
+
if (load_volumes(&obj, lv_all) != 0) {
dbd_log( LOGSTD, "Couldn't load volumes");
exit(EXIT_FAILURE);
dbd_log(LOGSTD, "\"%s\" isn't a \"dbd\" CNID volume", vol->v_path);
exit(EXIT_FAILURE);
}
- if ((vol->v_cdb = cnid_open(vol->v_path,
- 0000,
- vol->v_cnidscheme,
- vol->v_flags & AFPVOL_NODEV ? CNID_FLAG_NODEV : 0,
- vol->v_cnidserver,
- vol->v_cnidport,
- &obj,
- vol->v_uuid)) == NULL) {
+ vol->v_cdb = cnid_open(vol, vol->v_cnidscheme,
+ vol->v_flags & AFPVOL_NODEV ? CNID_FLAG_NODEV : 0);
+ if (vol->v_cdb == NULL) {
dbd_log(LOGSTD, "Cant initialize CNID database connection for %s", vol->v_path);
exit(EXIT_FAILURE);
}