2 * $Id: adv1tov2.c,v 1.5 2009-10-14 01:38:28 didg Exp $
3 * v1tov2: given a root directory, run down and convert all the
4 * files/directories into appledouble v2.
9 #endif /* HAVE_CONFIG_H */
11 #include <atalk/adouble.h>
17 #endif /* HAVE_FCNTL_H */
20 #endif /* HAVE_UNISTD_H */
22 #include <sys/types.h>
24 #include <sys/param.h>
28 #include <atalk/util.h>
30 #if AD_VERSION == AD_VERSION2
32 /* translate characters */
33 static void xlate(char *name, int flags) {
34 static const char hexdig[] = "0123456789abcdef";
35 char upath[MAXPATHLEN + 1];
42 if (isascii(*m) && !isprint(*m)) {
45 *u++ = hexdig[(*m & 0xf0) >> 4];
46 *u++ = hexdig[*m & 0x0f];
55 if ((flags & ADFLAGS_DIR) == 0)
56 rename(ad_path(name, flags), ad_path(upath, flags)); /* rename rfork */
61 /* ----------------------------- */
62 char *fullpathname(const char *name)
64 static char wd[ MAXPATHLEN + 1];
66 if ( getcwd( wd , MAXPATHLEN) ) {
67 strlcat(wd, "/", MAXPATHLEN);
68 strlcat(wd, name, MAXPATHLEN);
71 strlcpy(wd, name, MAXPATHLEN);
76 #define MAXDESCEND 0xFFFF
77 /* recursively descend subdirectories.
78 * oh the stack space we use up! */
79 static void descend(DIR *dp)
88 ad_init(&ad, AD_VERSION2, 0);
89 if (count++ > MAXDESCEND) {
90 fprintf(stderr, "FAILURE: too many subdirectories! possible infinite recursion.");
95 for (de = readdir(dp); de; de = readdir(dp)) {
96 if (de->d_name[0] == '.')
99 if (stat(de->d_name, &st) < 0) {
100 fprintf(stderr, "FAILURE: can't stat %s\n", de->d_name);
104 /* go down subdirectory */
106 if (S_ISDIR(st.st_mode) && (dpnew = opendir(de->d_name))) {
111 flags |= ADFLAGS_DIR;
114 if (ad_open(de->d_name, flags, O_RDWR, 0, &ad) < 0) {
116 fprintf(stderr, "\nFAILURE: can't convert %s, %s\n", fullpathname(de->d_name), strerror(errno));
119 ad_close(&ad, ADFLAGS_HF);
126 int main(int argc, char **argv)
131 ad_init(&ad, AD_VERSION2, 0);
133 fprintf(stderr, "%s <directory>\n", *argv);
137 /* convert main directory */
138 if (ad_open(argv[1], ADFLAGS_HF | ADFLAGS_DIR, O_RDWR, 0,
140 fprintf(stderr, "FAILURE: can't convert %s\n", argv[1]);
144 ad_close(&ad, ADFLAGS_HF);
145 if ((dp = opendir(argv[1])) == NULL) {
146 fprintf(stderr, "%s: unable to open %s\n", *argv, argv[1]);
159 #else /* AD_VERSION == AD_VERSION2 */
160 int main(int argc, char **argv)
162 fprintf(stderr, "%s not built for v2 AppleDouble files.\n", *argv);
165 #endif /* AD_VERSION == AD_VERSION2 */