--- /dev/null
+/*
+ Copyright (c) 2010 Frank Lahm <franklahm@gmail.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <pwd.h>
+#include <grp.h>
+#include <time.h>
+
+#include <atalk/adouble.h>
+#include <atalk/cnid.h>
+#include <atalk/volinfo.h>
+#include "ad.h"
+
+static volatile sig_atomic_t alarmed;
+
+/*
+ SIGNAL handling:
+ catch SIGINT and SIGTERM which cause clean exit. Ignore anything else.
+*/
+
+static void sig_handler(int signo)
+{
+ alarmed = 1;
+ return;
+}
+
+static void set_signal(void)
+{
+ struct sigaction sv;
+
+ sv.sa_handler = sig_handler;
+ sv.sa_flags = SA_RESTART;
+ sigemptyset(&sv.sa_mask);
+ if (sigaction(SIGTERM, &sv, NULL) < 0)
+ ERROR("error in sigaction(SIGTERM): %s", strerror(errno));
+
+ if (sigaction(SIGINT, &sv, NULL) < 0)
+ ERROR("error in sigaction(SIGINT): %s", strerror(errno));
+
+ memset(&sv, 0, sizeof(struct sigaction));
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask);
+
+ if (sigaction(SIGABRT, &sv, NULL) < 0)
+ ERROR("error in sigaction(SIGABRT): %s", strerror(errno));
+
+ if (sigaction(SIGHUP, &sv, NULL) < 0)
+ ERROR("error in sigaction(SIGHUP): %s", strerror(errno));
+
+ if (sigaction(SIGQUIT, &sv, NULL) < 0)
+ ERROR("error in sigaction(SIGQUIT): %s", strerror(errno));
+}
+
+static void usage_find(void)
+{
+ printf(
+ "Usage: ad find VOLUME_PATH NAME\n"
+ );
+}
+
+int ad_find(int argc, char **argv)
+{
+ int c;
+ afpvol_t vol;
+
+ printf("argc: %d, argv0: %s\n", argc, argv[0]);
+
+ if (argc != 4) {
+ usage_find();
+ exit(1);
+ }
+
+ set_signal();
+ cnid_init();
+
+ openvol(argv[2], &vol);
+ cnid_find(vol.volume.v_cdb, argv[3], strlen(argv[3]) + 1);
+ closevol(&vol);
+
+ return 0;
+}
-/*
+/*
* $Id: cnid.h,v 1.15 2010-03-31 09:47:32 franklahm Exp $
*
* Copyright (c) 2003 the Netatalk Team
* Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
- *
+ *
* This program is free software; you can redistribute and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation version 2 of the License or later
*
*/
-/*
- * This file contains all generic CNID related stuff
+/*
+ * This file contains all generic CNID related stuff
* declarations. Included:
- * - CNID factory, which retrieves (eventually instantiates)
+ * - CNID factory, which retrieves (eventually instantiates)
* CNID objects on demand
* - selection of CNID backends (default, detected by volume)
* - full set of CNID operations needed by server core.
#define CNID_FLAG_BLOCK 0x08 /* block signals in update. */
#define CNID_FLAG_NODEV 0x10 /* don't use device number only inode */
#define CNID_FLAG_LAZY_INIT 0x20 /* */
-#define CNID_FLAG_MEMORY 0x40 /* this is a memory only db */
-#define CNID_FLAG_INODE 0x80 /* in cnid_add the inode is authoritative */
+#define CNID_FLAG_MEMORY 0x40 /* this is a memory only db */
+#define CNID_FLAG_INODE 0x80 /* in cnid_add the inode is authoritative */
#define CNID_INVALID 0
/* first valid ID */
* This is instance of CNID database object.
*/
struct _cnid_db {
-
- u_int32_t flags; /* Flags describing some CNID backend aspects. */
- char *volpath; /* Volume path this particular CNID db refers to. */
- void *_private; /* back-end speficic data */
-
- cnid_t (*cnid_add)(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
- char *name, const size_t, cnid_t hint);
- int (*cnid_delete)(struct _cnid_db *cdb, cnid_t id);
- cnid_t (*cnid_get)(struct _cnid_db *cdb, const cnid_t did, char *name, const size_t);
- cnid_t (*cnid_lookup)(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
- char *name, const size_t);
- cnid_t (*cnid_nextid)(struct _cnid_db *cdb);
- char *(*cnid_resolve)(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len);
- int (*cnid_update)(struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
- const cnid_t did, char *name, const size_t len);
- void (*cnid_close)(struct _cnid_db *cdb);
- int (*cnid_getstamp)(struct _cnid_db *cdb, void *buffer, const size_t len);
- cnid_t (*cnid_rebuild_add)(struct _cnid_db *, const struct stat *, const cnid_t,
- char *, const size_t, cnid_t);
+ u_int32_t flags; /* Flags describing some CNID backend aspects. */
+ char *volpath; /* Volume path this particular CNID db refers to. */
+ void *_private; /* back-end speficic data */
+
+ cnid_t (*cnid_add) (struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
+ char *name, const size_t, cnid_t hint);
+ int (*cnid_delete) (struct _cnid_db *cdb, cnid_t id);
+ cnid_t (*cnid_get) (struct _cnid_db *cdb, const cnid_t did, char *name, const size_t);
+ cnid_t (*cnid_lookup) (struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
+ char *name, const size_t);
+ cnid_t (*cnid_nextid) (struct _cnid_db *cdb);
+ char * (*cnid_resolve) (struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len);
+ int (*cnid_update) (struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
+ const cnid_t did, char *name, const size_t len);
+ void (*cnid_close) (struct _cnid_db *cdb);
+ int (*cnid_getstamp) (struct _cnid_db *cdb, void *buffer, const size_t len);
+ cnid_t (*cnid_rebuild_add) (struct _cnid_db *, const struct stat *, const cnid_t,
+ char *, const size_t, cnid_t);
+ int (*cnid_find) (struct _cnid_db *cdb, const char *name, size_t len);
};
typedef struct _cnid_db cnid_db;
-/*
+/*
* Consolidation of args passedn from main cnid_open to modules cnid_XXX_open, so
* that it's easier to add aditional args as required.
*/
* CNID module - represents particular CNID implementation
*/
struct _cnid_module {
- char *name;
- struct list_head db_list; /* CNID modules are also stored on a bidirectional list. */
- struct _cnid_db *(*cnid_open)(struct cnid_open_args *args);
- u_int32_t flags; /* Flags describing some CNID backend aspects. */
+ char *name;
+ struct list_head db_list; /* CNID modules are also stored on a bidirectional list. */
+ struct _cnid_db *(*cnid_open)(struct cnid_open_args *args);
+ u_int32_t flags; /* Flags describing some CNID backend aspects. */
};
typedef struct _cnid_module cnid_module;
mode_t mask,
char *type,
int flags,
- const char *cnidsrv, /* Only for dbd */
- const char *cnidport); /* Only for dbd */
-
-cnid_t cnid_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
- const char *name, const size_t len, cnid_t hint);
-
-int cnid_delete(struct _cnid_db *cdb, cnid_t id);
-
-cnid_t cnid_get (struct _cnid_db *cdb, const cnid_t did, char *name,const size_t len);
-
-int cnid_getstamp(struct _cnid_db *cdb, void *buffer, const size_t len);
-
-cnid_t cnid_lookup(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
- char *name, const size_t len);
-
-char *cnid_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len);
-
-int cnid_update (struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
- const cnid_t did, char *name, const size_t len);
-
+ const char *cnidsrv,
+ const char *cnidport);
+cnid_t cnid_add (struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
+ const char *name, const size_t len, cnid_t hint);
+int cnid_delete (struct _cnid_db *cdb, cnid_t id);
+cnid_t cnid_get (struct _cnid_db *cdb, const cnid_t did, char *name,const size_t len);
+int cnid_getstamp (struct _cnid_db *cdb, void *buffer, const size_t len);
+cnid_t cnid_lookup (struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
+ char *name, const size_t len);
+char *cnid_resolve (struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len);
+int cnid_update (struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
+ const cnid_t did, char *name, const size_t len);
cnid_t cnid_rebuild_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
char *name, const size_t len, cnid_t hint);
-
-
-/* This function closes a CNID database and frees all resources assigned to it. */
-void cnid_close(struct _cnid_db *db);
+int cnid_find (struct _cnid_db *cdb, const char *name, size_t len);
+void cnid_close (struct _cnid_db *db);
#endif
-
-/*
- * $Log: cnid.h,v $
- * Revision 1.15 2010-03-31 09:47:32 franklahm
- * clustering support: new per volume option cnidserver
- *
- * Revision 1.14 2009/11/28 13:09:25 didg
- * guard against confused DB returning junk values
- *
- * Revision 1.13 2009/11/24 12:18:19 didg
- * add a flag parameter to cnid open functions
- *
- * Revision 1.12 2005/09/07 15:23:21 didg
- *
- * lazy init dbd database, help with pre tiger OS and a lot of volumes.
- *
- * Revision 1.11 2005/05/03 14:55:12 didg
- *
- * remove gcc warning
- *
- * Revision 1.10 2005/04/28 20:49:51 bfernhomberg
- *
- * - merge branch-netatalk-afp-3x-dev, HEAD was tagged before
- *
- * Revision 1.9.6.8 2005/04/25 22:33:24 lenneis
- * Add a new interface to the cdb and dbd backends: cnid_rebuild_add. It
- * takes dev, ino, did, name and cnid and writes these values unconditionally
- * into the cnid database. To be used in a recovery tool that writes cnids
- * cached in AppleDouble files back into the database. Not used yet by
- * any daemons or command line utilities.
- *
- * Revision 1.9.6.7 2005/02/08 11:46:59 didg
- *
- * warnings fixes from 2.0 branch
- *
- * Revision 1.9.6.6 2004/02/22 18:36:37 didg
- *
- * small clean up
- *
- * Revision 1.9.6.5 2004/01/14 23:15:19 lenneis
- * Check if we can get a DB stamp sucessfully in afs_openvol and fail
- * the open if not.
- *
- * Revision 1.9.6.4 2004/01/10 07:19:31 bfernhomberg
- * add cnid_init prototype
- *
- * Revision 1.9.6.3 2004/01/03 22:42:55 didg
- *
- * better errors handling in afpd for dbd cnid.
- *
- * Revision 1.9.6.2 2004/01/03 22:21:09 didg
- *
- * add nodev volume option (always use 0 for device number).
- *
- * Revision 1.9.6.1 2003/09/09 16:42:20 didg
- *
- * big merge for db frontend and unicode.
- *
- * Revision 1.9.4.2 2003/06/11 15:29:11 rlewczuk
- * Removed obsolete parameter from cnid_add. Spotted by Didier.
- *
- * Revision 1.9.4.1 2003/05/29 07:53:19 rlewczuk
- * Selectable CNIDs. Some refactoring. Propably needs more of refactoring, mainly
- * a well designed API (current API is just an old cnid_* API enclosed in VMT).
- *
- */
-
/*
- * $Id: cnid_dbd.h,v 1.6 2010-03-31 09:47:32 franklahm Exp $
- *
* Copyright (C) Joerg Lenneis 2003
+ * Copyright (C) Frank Lahm 2010
* All Rights Reserved. See COPYING.
*/
extern struct _cnid_module cnid_dbd_module;
extern struct _cnid_db *cnid_dbd_open (struct cnid_open_args *args);
-extern void cnid_dbd_close (struct _cnid_db *);
-extern cnid_t cnid_dbd_add (struct _cnid_db *, const struct stat *, const cnid_t,
- char *, const size_t, cnid_t);
-extern cnid_t cnid_dbd_get (struct _cnid_db *, const cnid_t, char *, const size_t);
-extern char *cnid_dbd_resolve (struct _cnid_db *, cnid_t *, void *, size_t );
-extern int cnid_dbd_getstamp (struct _cnid_db *, void *, const size_t );
-extern cnid_t cnid_dbd_lookup (struct _cnid_db *, const struct stat *, const cnid_t,
- char *, const size_t);
-extern int cnid_dbd_update (struct _cnid_db *, const cnid_t, const struct stat *,
- const cnid_t, char *, size_t);
-extern int cnid_dbd_delete (struct _cnid_db *, const cnid_t);
-extern cnid_t cnid_dbd_rebuild_add (struct _cnid_db *, const struct stat *,
- const cnid_t, char *, const size_t, cnid_t);
+extern void cnid_dbd_close (struct _cnid_db *);
+extern cnid_t cnid_dbd_add (struct _cnid_db *, const struct stat *, const cnid_t,
+ char *, const size_t, cnid_t);
+extern cnid_t cnid_dbd_get (struct _cnid_db *, const cnid_t, char *, const size_t);
+extern char *cnid_dbd_resolve (struct _cnid_db *, cnid_t *, void *, size_t );
+extern int cnid_dbd_getstamp (struct _cnid_db *, void *, const size_t );
+extern cnid_t cnid_dbd_lookup (struct _cnid_db *, const struct stat *, const cnid_t,
+ char *, const size_t);
+extern int cnid_dbd_find (struct _cnid_db *cdb, const char *name, size_t len);
+extern int cnid_dbd_update (struct _cnid_db *, const cnid_t, const struct stat *,
+ const cnid_t, char *, size_t);
+extern int cnid_dbd_delete (struct _cnid_db *, const cnid_t);
+extern cnid_t cnid_dbd_rebuild_add(struct _cnid_db *, const struct stat *,
+ const cnid_t, char *, const size_t, cnid_t);
/* FIXME: These functions could be static in cnid_dbd.c */