summaryrefslogtreecommitdiff
path: root/usr.bin/lndir/lndir.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2002-06-17 07:06:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2002-06-17 07:06:40 +0000
commitef41ea1998d7c91c32cf5a8dea8671253a9d8de7 (patch)
treebcd70d3088edbdc994849899ecbcaa53ac45af06 /usr.bin/lndir/lndir.c
parentf728d495ce54d8e64392f0c511d610724218a83a (diff)
KNF
Diffstat (limited to 'usr.bin/lndir/lndir.c')
-rw-r--r--usr.bin/lndir/lndir.c389
1 files changed, 193 insertions, 196 deletions
diff --git a/usr.bin/lndir/lndir.c b/usr.bin/lndir/lndir.c
index 84a9db47216..10218330093 100644
--- a/usr.bin/lndir/lndir.c
+++ b/usr.bin/lndir/lndir.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lndir.c,v 1.9 2002/05/29 18:33:39 deraadt Exp $ */
+/* $OpenBSD: lndir.c,v 1.10 2002/06/17 07:06:39 deraadt Exp $ */
/* $XConsortium: lndir.c /main/15 1995/08/30 10:56:18 gildea $ */
/*
@@ -42,9 +42,9 @@ in this Software without prior written authorization from the X Consortium.
If your master sources are located in /usr/local/src/X and you would like
your link tree to be in /usr/local/src/new-X, do the following:
- % mkdir /usr/local/src/new-X
+ % mkdir /usr/local/src/new-X
% cd /usr/local/src/new-X
- % lndir ../X
+ % lndir ../X
*/
#include <stdio.h>
@@ -80,91 +80,85 @@ struct except {
struct except *exceptions = (struct except *)NULL;
int
-main (argc, argv)
- int argc;
- char **argv;
+main(int argc, char *argv[])
{
- char *fn, *tn;
struct stat fs, ts;
+ char *fn, *tn;
+
+ 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;
+
+ if (argc < 2)
+ usage();
+ addexcept(*argv);
+ } else if (strcmp(*argv, "--") == 0) {
+ ++argv, --argc;
+ break;
+ } else
+ break;
+ }
- 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;
-
- if (argc < 2)
- usage();
- addexcept(*argv);
- } else if (strcmp(*argv, "--") == 0) {
- ++argv, --argc;
- break;
- } else
- break;
- }
-
-
- if (argc < 1 || argc > 2)
- usage();
-
- fn = argv[0];
- if (argc == 2)
- tn = argv[1];
- else
- tn = ".";
-
- /* to directory */
- if (stat(tn, &ts) < 0)
- err(1, "%s", tn);
- if (!(S_ISDIR(ts.st_mode)))
- errx(2, "%s: %s", tn, strerror(ENOTDIR));
- if (chdir(tn) < 0)
- err(1, "%s", tn);
-
- /* from directory */
- if (stat(fn, &fs) < 0)
- err(1, "%s", fn);
- if (!(S_ISDIR(fs.st_mode)))
- err(2, "%s: %s", fn, strerror(ENOTDIR));
-
- exit(dodir (fn, &fs, &ts, 0));
+ if (argc < 1 || argc > 2)
+ usage();
+
+ fn = argv[0];
+ if (argc == 2)
+ tn = argv[1];
+ else
+ tn = ".";
+
+ /* to directory */
+ if (stat(tn, &ts) < 0)
+ err(1, "%s", tn);
+ if (!(S_ISDIR(ts.st_mode)))
+ errx(2, "%s: %s", tn, strerror(ENOTDIR));
+ if (chdir(tn) < 0)
+ err(1, "%s", tn);
+
+ /* from directory */
+ if (stat(fn, &fs) < 0)
+ err(1, "%s", fn);
+ if (!(S_ISDIR(fs.st_mode)))
+ err(2, "%s: %s", fn, strerror(ENOTDIR));
+
+ exit(dodir(fn, &fs, &ts, 0));
}
int
-equivalent(lname, rname)
- char *lname;
- char *rname;
+equivalent(char *lname, char *rname)
{
- char *s;
-
- if (!strcmp(lname, rname))
- return(1);
- for (s = lname; *s && (s = strchr(s, '/')); s++) {
- while (s[1] == '/')
- strcpy(s+1, s+2);
- }
- return(!strcmp(lname, rname));
+ char *s;
+
+ if (!strcmp(lname, rname))
+ return(1);
+ for (s = lname; *s && (s = strchr(s, '/')); s++) {
+ while (s[1] == '/')
+ strcpy(s+1, s+2);
+ }
+ return(!strcmp(lname, rname));
}
void
-addexcept(name)
- char *name;
+addexcept(char *name)
{
- struct except *new;
-
- new = (struct except *)malloc(sizeof(struct except));
- if (new == (struct except *)NULL)
- err(1, "addexcept");
- new->name = strdup(name);
- if (new->name == (char *)NULL)
- err(1, "addexcept");
-
- new->next = exceptions;
- exceptions = new;
+ struct except *new;
+
+ new = (struct except *)malloc(sizeof(struct except));
+ if (new == (struct except *)NULL)
+ err(1, "addexcept");
+ new->name = strdup(name);
+ if (new->name == (char *)NULL)
+ err(1, "addexcept");
+
+ new->next = exceptions;
+ exceptions = new;
}
@@ -172,143 +166,146 @@ addexcept(name)
* 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)
+#if 0
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 */
+#endif
+int
+dodir(char *fn, struct stat *fs, struct stat *ts, int rel)
{
- DIR *df;
- struct dirent *dp;
- char buf[MAXPATHLEN + 1], *p;
- char symbuf[MAXPATHLEN + 1];
- char basesym[MAXPATHLEN + 1];
- struct stat sb, sc;
- int n_dirs;
- int symlen;
- int basesymlen = -1;
- char *ocurdir;
- struct except *cur;
-
- if ((fs->st_dev == ts->st_dev) && (fs->st_ino == ts->st_ino)) {
- warn("%s: From and to directories are identical!", fn);
- return(1);
- }
-
- if (rel)
- strcpy(buf, "../");
- else
- buf[0] = '\0';
- strlcat(buf, fn, sizeof buf);
+ char buf[MAXPATHLEN + 1], symbuf[MAXPATHLEN + 1], basesym[MAXPATHLEN + 1];
+ int n_dirs, symlen, basesymlen = -1;
+ struct stat sb, sc;
+ struct except *cur;
+ struct dirent *dp;
+ char *ocurdir, *p;
+ DIR *df;
+
+ if (fs->st_dev == ts->st_dev && fs->st_ino == ts->st_ino) {
+ warn("%s: From and to directories are identical!", fn);
+ return(1);
+ }
+
+ if (rel)
+ strlcpy(buf, "../", sizeof buf);
+ else
+ buf[0] = '\0';
+ strlcat(buf, fn, sizeof buf);
- if (!(df = opendir(buf))) {
- warn("%s: Cannot opendir", buf);
- return(1);
- }
-
- p = buf + strlen(buf);
- *p++ = '/';
- n_dirs = fs->st_nlink;
- while ((dp = readdir(df))) {
- if (dp->d_name[strlen(dp->d_name) - 1] == '~')
- continue;
- for (cur = exceptions; cur != (struct except *)NULL;
- cur = cur->next) {
- if (!strcmp (dp->d_name, cur->name))
- goto next; /* can't continue */
+ if (!(df = opendir(buf))) {
+ warn("%s: Cannot opendir", buf);
+ return(1);
}
- strcpy(p, dp->d_name);
-
- if (n_dirs > 0) {
- if (stat(buf, &sb) < 0) {
- warn("%s", buf);
- continue;
- }
-
- 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"))
- continue;
- if (!strcmp(dp->d_name, "SCCS"))
- continue;
- if (!strcmp(dp->d_name, "CVS"))
- continue;
- if (!strcmp(dp->d_name, "CVS.adm"))
- continue;
- ocurdir = rcurdir;
- rcurdir = buf;
- 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) {
- warn("%s", dp->d_name);
- curdir = rcurdir = ocurdir;
+
+ p = buf + strlen(buf);
+ *p++ = '/';
+ n_dirs = fs->st_nlink;
+ while ((dp = readdir(df))) {
+ if (dp->d_name[strlen(dp->d_name) - 1] == '~')
continue;
- }
+ for (cur = exceptions; cur != (struct except *)NULL;
+ cur = cur->next) {
+ if (!strcmp (dp->d_name, cur->name))
+ goto next; /* can't continue */
}
- 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;
+ strcpy(p, dp->d_name);
+
+ if (n_dirs > 0) {
+ if (stat(buf, &sb) < 0) {
+ warn("%s", buf);
+ continue;
+ }
+
+ 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"))
+ continue;
+ if (!strcmp(dp->d_name, "SCCS"))
+ continue;
+ if (!strcmp(dp->d_name, "CVS"))
+ continue;
+ if (!strcmp(dp->d_name, "CVS.adm"))
+ continue;
+ ocurdir = rcurdir;
+ rcurdir = buf;
+ 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) {
+ warn("%s", dp->d_name);
+ curdir = rcurdir = ocurdir;
+ continue;
+ }
+ }
+ if (readlink(dp->d_name, symbuf,
+ sizeof(symbuf) - 1) >= 0) {
+ fprintf(stderr,
+ "%s: is a link instead of a directory\n",
+ dp->d_name);
+ curdir = rcurdir = ocurdir;
+ continue;
+ }
+ if (chdir(dp->d_name) < 0) {
+ warn("%s", dp->d_name);
+ curdir = rcurdir = ocurdir;
+ continue;
+ }
+ dodir(buf, &sb, &sc, (buf[0] != '/'));
+ if (chdir("..") < 0)
+ err(1, "..");
+ curdir = rcurdir = ocurdir;
+ continue;
+ }
}
- if (chdir(dp->d_name) < 0) {
- warn("%s", dp->d_name);
- curdir = rcurdir = ocurdir;
- continue;
- }
- dodir(buf, &sb, &sc, (buf[0] != '/'));
- if (chdir ("..") < 0)
- err (1, "..");
- curdir = rcurdir = ocurdir;
- continue;
- }
- }
- /* non-directory */
- 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.
- */
- if (!ignore_links) {
- /* see if the file in the base tree was a symlink */
- basesymlen = readlink(buf, basesym, sizeof(basesym) - 1);
- if (basesymlen >= 0)
- basesym[basesymlen] = '\0';
- }
+ /* non-directory */
+ 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.
+ */
+ if (!ignore_links) {
+ /* see if the file in the base tree was a symlink */
+ basesymlen = readlink(buf, basesym, sizeof(basesym) - 1);
+ if (basesymlen >= 0)
+ basesym[basesymlen] = '\0';
+ }
- if (symlen >= 0) {
- /* Link exists in new tree. Print message if it doesn't match. */
- 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)
- warn("%s", dp->d_name);
- }
+ if (symlen >= 0) {
+ /*
+ * Link exists in new tree. Print message if
+ * it doesn't match.
+ */
+ if (!equivalent(basesymlen>=0 ? basesym : buf, symbuf))
+ fprintf(stderr,"%s: %s\n", dp->d_name, symbuf);
+ } else {
+ if (symlink(basesymlen>=0 ? basesym : buf, dp->d_name) < 0)
+ warn("%s", dp->d_name);
+ }
next:
- }
+ }
- closedir(df);
- return(0);
+ closedir(df);
+ return(0);
}
void
-usage()
+usage(void)
{
(void)fprintf(stderr, "usage: %s [-e except] [-si] fromdir todir\n",
- __progname);
+ __progname);
exit(1);
}