=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/lndir/lndir.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- src/usr.bin/lndir/lndir.c 1996/08/19 14:20:18 1.4 +++ src/usr.bin/lndir/lndir.c 2000/07/20 17:47:17 1.5 @@ -1,9 +1,12 @@ -/* $OpenBSD: lndir.c,v 1.4 1996/08/19 14:20:18 niklas Exp $ */ +/* $OpenBSD: lndir.c,v 1.5 2000/07/20 17:47:17 ericj Exp $ */ /* $XConsortium: lndir.c /main/15 1995/08/30 10:56:18 gildea $ */ -/* Create shadow link tree (after X11R4 script of the same name) - Mark Reinhold (mbr@lcs.mit.edu)/3 January 1990 */ /* + * Create shadow link tree (after X11R4 script of the same name) + * Mark Reinhold (mbr@lcs.mit.edu)/3 January 1990 + */ + +/* Copyright (c) 1990, X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy @@ -49,85 +52,106 @@ #include #include #include +#include #include #include #include #include +#include +extern char *__progname; + int silent = 0; /* -silent */ int ignore_links = 0; /* -ignorelinks */ char *rcurdir; char *curdir; +int equivalent __P((char *, char *)); +void addexcept __P((char *)); +int dodir __P((char *, struct stat *, struct stat *, int)); +void usage __P((void)); + struct except { char *name; - struct except *next; }; + struct except *exceptions = (struct except *)NULL; -void -quit (int code, char * fmt, ...) +int +main (argc, argv) + int argc; + char **argv; { - va_list args; - va_start(args, fmt); - vfprintf (stderr, fmt, args); - va_end(args); - putc ('\n', stderr); - exit (code); -} + int ch; + char *fn, *tn; + struct stat fs, ts; -void -quiterr (code, s) - char *s; -{ - perror (s); - exit (code); -} + while (++argv, --argc) { + if ((strcmp(*argv, "-silent") == 0) + || (strcmp(*argv, "-s") == 0)) + silent = 1; + else if ((strcmp(*argv, "-ignorelinks") == 0) + || (strcmp(*argv, "-i") == 0)) + ignore_links = 1; + else if (strcmp(*argv, "-e") == 0) { + ++argv, --argc; -void -msg (char * fmt, ...) -{ - va_list args; - if (curdir) { - fprintf (stderr, "%s:\n", curdir); - curdir = 0; - } - va_start(args, fmt); - vfprintf (stderr, fmt, args); - va_end(args); - putc ('\n', stderr); -} + if (argc < 2) + usage(); + addexcept(*argv); + } else if (strcmp(*argv, "--") == 0) { + ++argv, --argc; + break; + } else + break; + } -void -mperror (s) - char *s; -{ - if (curdir) { - fprintf (stderr, "%s:\n", curdir); - curdir = 0; - } - perror (s); -} + + if (argc < 1 || argc > 2) + usage(); + fn = argv[0]; + if (argc == 2) + tn = argv[1]; + else + tn = "."; -int equivalent(lname, rname) + /* to directory */ + if (stat(tn, &ts) < 0) + errx(1, "%s", tn); + if (!(S_ISDIR(ts.st_mode))) + errx(2, "%s: Not a directory", tn); + if (chdir(tn) < 0) + errx(1, "%s", tn); + + /* from directory */ + if (stat(fn, &fs) < 0) + errx(1, "%s", fn); + if (!(S_ISDIR(fs.st_mode))) + errx(2, "%s: Not a directory", fn); + + exit(dodir (fn, &fs, &ts, 0)); +} + +int +equivalent(lname, rname) char *lname; char *rname; { char *s; if (!strcmp(lname, rname)) - return 1; + return(1); for (s = lname; *s && (s = strchr(s, '/')); s++) { while (s[1] == '/') strcpy(s+1, s+2); } - return !strcmp(lname, rname); + return(!strcmp(lname, rname)); } - +void addexcept(name) char *name; { @@ -135,24 +159,26 @@ new = (struct except *)malloc(sizeof(struct except)); if (new == (struct except *)NULL) - quiterr(1, "addexcept"); + errx(1, "addexcept"); new->name = strdup(name); if (new->name == (char *)NULL) - quiterr(1, "addexcept"); + errx(1, "addexcept"); new->next = exceptions; exceptions = new; } -/* Recursively create symbolic links from the current directory to the "from" - directory. Assumes that files described by fs and ts are directories. */ - -dodir (fn, fs, ts, rel) -char *fn; /* name of "from" directory, either absolute or +/* + * Recursively create symbolic links from the current directory to the "from" + * directory. Assumes that files described by fs and ts are directories. + */ +int +dodir(fn, fs, ts, rel) + char *fn; /* name of "from" directory, either absolute or relative to cwd */ -struct stat *fs, *ts; /* stats for the "from" directory and cwd */ -int rel; /* if true, prepend "../" to fn before using */ + struct stat *fs, *ts; /* stats for the "from" directory and cwd */ + int rel; /* if true, prepend "../" to fn before using */ { DIR *df; struct dirent *dp; @@ -167,25 +193,25 @@ struct except *cur; if ((fs->st_dev == ts->st_dev) && (fs->st_ino == ts->st_ino)) { - msg ("%s: From and to directories are identical!", fn); - return 1; + warn("%s: From and to directories are identical!", fn); + return(1); } if (rel) - strcpy (buf, "../"); + strcpy(buf, "../"); else buf[0] = '\0'; - strcat (buf, fn); + strcat(buf, fn); - if (!(df = opendir (buf))) { - msg ("%s: Cannot opendir", buf); - return 1; + if (!(df = opendir(buf))) { + warn("%s: Cannot opendir", buf); + return(1); } - p = buf + strlen (buf); + p = buf + strlen(buf); *p++ = '/'; n_dirs = fs->st_nlink; - while (dp = readdir (df)) { + while ((dp = readdir(df))) { if (dp->d_name[strlen(dp->d_name) - 1] == '~') continue; for (cur = exceptions; cur != (struct except *)NULL; @@ -193,68 +219,71 @@ if (!strcmp (dp->d_name, cur->name)) goto next; /* can't continue */ } - strcpy (p, dp->d_name); + strcpy(p, dp->d_name); if (n_dirs > 0) { - if (stat (buf, &sb) < 0) { - mperror (buf); + if (stat(buf, &sb) < 0) { + warn("%s", buf); continue; } - if(S_ISDIR(sb.st_mode)) { + if (S_ISDIR(sb.st_mode)) { /* directory */ n_dirs--; if (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) continue; - if (!strcmp (dp->d_name, "RCS")) + if (!strcmp(dp->d_name, "RCS")) continue; - if (!strcmp (dp->d_name, "SCCS")) + if (!strcmp(dp->d_name, "SCCS")) continue; - if (!strcmp (dp->d_name, "CVS")) + if (!strcmp(dp->d_name, "CVS")) continue; - if (!strcmp (dp->d_name, "CVS.adm")) + if (!strcmp(dp->d_name, "CVS.adm")) continue; ocurdir = rcurdir; rcurdir = buf; - curdir = silent ? buf : (char *)0; + curdir = silent ? buf : NULL; if (!silent) - printf ("%s:\n", buf); - if ((stat (dp->d_name, &sc) < 0) && (errno == ENOENT)) { - if (mkdir (dp->d_name, 0777) < 0 || - stat (dp->d_name, &sc) < 0) { - mperror (dp->d_name); + printf("%s:\n", buf); + if ((stat(dp->d_name, &sc) < 0) && (errno == ENOENT)) { + if (mkdir(dp->d_name, 0777) < 0 || + stat(dp->d_name, &sc) < 0) { + warn("%s", dp->d_name); curdir = rcurdir = ocurdir; continue; } } - if (readlink (dp->d_name, symbuf, sizeof(symbuf) - 1) >= 0) { - msg ("%s: is a link instead of a directory", dp->d_name); + if (readlink(dp->d_name, symbuf, sizeof(symbuf) - 1) >= 0) { + (void)fprintf(stderr, "%s: is a link instead of a directory\n", + dp->d_name); curdir = rcurdir = ocurdir; continue; } - if (chdir (dp->d_name) < 0) { - mperror (dp->d_name); + if (chdir(dp->d_name) < 0) { + warn("%s", dp->d_name); curdir = rcurdir = ocurdir; continue; } - dodir (buf, &sb, &sc, (buf[0] != '/')); + dodir(buf, &sb, &sc, (buf[0] != '/')); if (chdir ("..") < 0) - quiterr (1, ".."); + errx (1, ".."); curdir = rcurdir = ocurdir; continue; } } /* non-directory */ - symlen = readlink (dp->d_name, symbuf, sizeof(symbuf) - 1); + symlen = readlink(dp->d_name, symbuf, sizeof(symbuf) - 1); if (symlen >= 0) symbuf[symlen] = '\0'; - /* The option to ignore links exists mostly because - checking for them slows us down by 10-20%. - But it is off by default because this really is a useful check. */ + /* + * The option to ignore links exists mostly because + * checking for them slows us down by 10-20%. + * But it is off by default because this really is a useful check. + */ if (!ignore_links) { /* see if the file in the base tree was a symlink */ basesymlen = readlink(buf, basesym, sizeof(basesym) - 1); @@ -264,72 +293,23 @@ if (symlen >= 0) { /* Link exists in new tree. Print message if it doesn't match. */ - if (!equivalent (basesymlen>=0 ? basesym : buf, symbuf)) - msg ("%s: %s", dp->d_name, symbuf); + if (!equivalent(basesymlen>=0 ? basesym : buf, symbuf)) + (void)fprintf(stderr,"%s: %s\n", dp->d_name, symbuf); } else { - if (symlink (basesymlen>=0 ? basesym : buf, dp->d_name) < 0) - mperror (dp->d_name); + if (symlink(basesymlen>=0 ? basesym : buf, dp->d_name) < 0) + warn("%s", dp->d_name); } next: } - closedir (df); - return 0; + closedir(df); + return(0); } - -main (ac, av) -int ac; -char **av; +void +usage() { - char *prog_name = av[0]; - char *fn, *tn; - struct stat fs, ts; - - while (++av, --ac) { - if ((strcmp(*av, "-silent") == 0) || (strcmp(*av, "-s") == 0)) - silent = 1; - else if ((strcmp(*av, "-ignorelinks") == 0) || (strcmp(*av, "-i") == 0)) - ignore_links = 1; - else if (strcmp(*av, "-e") == 0) { - ++av, --ac; - - if (ac < 2) - quit (1, "usage: %s [-e except] [-s] [-i] fromdir [todir]", - prog_name); - addexcept(*av); - } - else if (strcmp(*av, "--") == 0) { - ++av, --ac; - break; - } - else - break; - } - - if (ac < 1 || ac > 2) - quit (1, "usage: %s [-e except] [-s] [-i] fromdir [todir]", - prog_name); - - fn = av[0]; - if (ac == 2) - tn = av[1]; - else - tn = "."; - - /* to directory */ - if (stat (tn, &ts) < 0) - quiterr (1, tn); - if (!(S_ISDIR(ts.st_mode))) - quit (2, "%s: Not a directory", tn); - if (chdir (tn) < 0) - quiterr (1, tn); - - /* from directory */ - if (stat (fn, &fs) < 0) - quiterr (1, fn); - if (!(S_ISDIR(fs.st_mode))) - quit (2, "%s: Not a directory", fn); - - exit (dodir (fn, &fs, &ts, 0)); + (void)fprintf(stderr, "usage: %s [-e except] [-si] fromdir todir\n", + __progname); + exit(1); }