X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fcnid_dbd%2Fmain.c;fp=etc%2Fcnid_dbd%2Fmain.c;h=e2f8e98e8fca82e400e39a0cb3ceb61af54df628;hb=f76a2375b3a0401320f9257f47954d20bcc3b688;hp=64734396d34f6d7d8cfd1758c68d1b663db8455e;hpb=c3cfd44a4fae2e700d07aa52166aa3609c8e9660;p=netatalk.git diff --git a/etc/cnid_dbd/main.c b/etc/cnid_dbd/main.c index 64734396..e2f8e98e 100644 --- a/etc/cnid_dbd/main.c +++ b/etc/cnid_dbd/main.c @@ -282,25 +282,27 @@ static void set_signal(void) int main(int argc, char *argv[]) { struct db_param *dbp; - int err = 0; + int err = 0, ret, delete_bdb = 0; int ctrlfd, clntfd; char *logconfig; set_processname("cnid_dbd"); - /* FIXME: implement -d from cnid_metad */ - if (argc != 5) { - LOG(log_error, logtype_cnid, "main: not enough arguments"); - exit(1); + while (( ret = getopt( argc, argv, "d")) != -1 ) { + switch (ret) { + case 'd': + delete_bdb = 1; + break; + } } - ctrlfd = atoi(argv[2]); - clntfd = atoi(argv[3]); - logconfig = strdup(argv[4]); - setuplog(logconfig); + if (argc - optind != 4) { + LOG(log_error, logtype_cnid, "main: not enough arguments"); + exit(EXIT_FAILURE); + } /* Load .volinfo file */ - if (loadvolinfo(argv[1], &volinfo) == -1) { + if (loadvolinfo(argv[optind], &volinfo) == -1) { LOG(log_error, logtype_cnid, "Cant load volinfo for \"%s\"", argv[1]); exit(EXIT_FAILURE); } @@ -313,6 +315,11 @@ int main(int argc, char *argv[]) strncpy(dbpath, volinfo.v_dbpath, MAXPATHLEN - strlen("/.AppleDB")); strcat(dbpath, "/.AppleDB"); + ctrlfd = atoi(argv[optind + 1]); + clntfd = atoi(argv[optind + 2]); + logconfig = strdup(argv[optind + 3]); + setuplog(logconfig); + if (vol_load_charsets(&volinfo) == -1) { LOG(log_error, logtype_cnid, "Error loading charsets!"); exit(EXIT_FAILURE); @@ -334,6 +341,16 @@ int main(int argc, char *argv[]) } } + if (delete_bdb && (db_locked == LOCK_EXCL)) { + LOG(log_warning, logtype_cnid, "main: too many CNID db opening attempts, wiping the slate clean"); + chdir(dbpath); + system("rm -f cnid2.db lock log.* __db.*"); + if ((db_locked = get_lock(LOCK_EXCL, dbpath)) != LOCK_EXCL) { + LOG(log_error, logtype_cnid, "main: fatal db lock error"); + exit(EXIT_FAILURE); + } + } + set_signal(); /* SIGINT and SIGTERM are always off, unless we are in pselect */