#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/cnid_dbd_private.h>
#include <atalk/volinfo.h>
+#include <atalk/bstrlib.h>
+#include <atalk/bstradd.h>
+#include <atalk/directory.h>
+#include <atalk/util.h>
+#include <atalk/unicode.h>
#include "ad.h"
static volatile sig_atomic_t alarmed;
static void usage_find(void)
{
printf(
- "Usage: ad find VOLUME_PATH NAME\n"
+ "Usage: ad find [-v VOLUME_PATH] NAME\n"
);
}
int ad_find(int argc, char **argv)
{
- int c;
+ int c, ret;
afpvol_t vol;
+ const char *srchvol = getcwdpath();
+
+ while ((c = getopt(argc-1, &argv[1], ":v:")) != -1) {
+ switch(c) {
+ case 'v':
+ srchvol = strdup(optarg);
+ break;
+ case ':':
+ case '?':
+ usage_find();
+ return -1;
+ break;
+ }
- printf("argc: %d, argv0: %s\n", argc, argv[0]);
+ }
+ optind++;
- if (argc != 4) {
+ if ((argc - optind) != 1) {
usage_find();
exit(1);
}
set_signal();
cnid_init();
- openvol(argv[2], &vol);
- cnid_find(vol.volume.v_cdb, argv[3], strlen(argv[3]) + 1);
+ if (openvol(srchvol, &vol) != 0)
+ ERROR("Cant open volume \"%s\"", srchvol);
+
+ uint16_t flags = CONV_TOLOWER;
+ char namebuf[MAXPATHLEN + 1];
+ if (convert_charset(vol.volinfo.v_volcharset,
+ vol.volinfo.v_volcharset,
+ vol.volinfo.v_maccharset,
+ argv[optind],
+ strlen(argv[optind]),
+ namebuf,
+ MAXPATHLEN,
+ &flags) == (size_t)-1) {
+ ERROR("conversion error");
+ }
+
+ int count;
+ char resbuf[DBD_MAX_SRCH_RSLTS * sizeof(cnid_t)];
+ if ((count = cnid_find(vol.volume.v_cdb,
+ namebuf,
+ strlen(namebuf),
+ resbuf,
+ sizeof(resbuf))) < 1) {
+ ret = 1;
+ } else {
+ ret = 0;
+ cnid_t cnid;
+ char *bufp = resbuf;
+ bstring sep = bfromcstr("/");
+ while (count--) {
+ memcpy(&cnid, bufp, sizeof(cnid_t));
+ bufp += sizeof(cnid_t);
+
+ bstring path = NULL;
+ bstring volpath = bfromcstr(vol.volinfo.v_path);
+ BSTRING_STRIP_SLASH(volpath);
+ char buffer[12 + MAXPATHLEN + 1];
+ int buflen = 12 + MAXPATHLEN + 1;
+ char *name;
+ cnid_t did = cnid;
+ struct bstrList *pathlist = bstrListCreateMin(32);
+
+ while (did != DIRDID_ROOT) {
+ if ((name = cnid_resolve(vol.volume.v_cdb, &did, buffer, buflen)) == NULL)
+ goto next;
+ bstrListPush(pathlist, bfromcstr(name));
+ }
+ bstrListPush(pathlist, volpath);
+ path = bjoinInv(pathlist, sep);
+
+ printf("%s\n", cfrombstr(path));
+
+ next:
+ bstrListDestroy(pathlist);
+ bdestroy(path);
+ }
+ bdestroy(sep);
+ }
+
closevol(&vol);
- return 0;
+ return ret;
}