|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 3500 (0xdac) Types: TextFile Names: »find.c«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen └─⟦this⟧ »cph85dist/rman/daemon/find.c«
#ifndef lint static char RCSid[] = "$Header: find.c,v 1.4 85/08/27 15:16:36 broome Exp $"; #endif /* * $Log: find.c,v $ * Revision 1.4 85/08/27 15:16:36 broome * Last cleanup before release. * * Revision 1.3 85/08/04 16:32:15 broome * Increased efficiency by checking for directory existence before stat'ing * each possible file name. * * Revision 1.2 85/07/06 16:56:18 broome * * Revision 1.1 85/07/05 18:19:13 broome * Initial revision */ #include <sys/file.h> #include "defs.h" /* * Take the name/section argument and try to * find the corresponding files. */ struct where * find (argc, argv) int argc; char *argv[]; { static struct where wp; SEC *sec; DIR *dir; int d; bzero ((char *)&wp, sizeof (wp)); if (argc == 2) { /* section specified */ wp.section = strsave (argv[0]); wp.name = strsave (argv[1]); if (strlen (*argv) == 2) /* subsection kludge */ wp.subsec = (*argv)[1]; if (sec = find_section (*argv++)) { for (d = 0; sec->dirs[d]; d++) /* check each dir pointed to */ if (checkpath (sec->dirs[d], *argv, &wp)) break; } } else { wp.name = strsave (*argv); /* * Default action is to check all known * directories and suffixes. */ for (dir = dirs; dir; dir = dir->next) if (checkpath (dir, *argv, &wp)) break; } return (&wp); } /* * Return a pointer to the section structure for the named section, * Null pointer if not found. */ SEC * find_section (name) char *name; { register SEC *sec; register int len = strlen (name); for (sec = sections; sec; sec = sec->next) { if (eq (name, sec->name)) return (sec); if (len == 2 && strlen (sec->name) == 1) /* kludge for `man 3x foo' */ if (*name == *sec->name) return (sec); } return ((SEC *) 0); } /* * Given a filename and DIR pointer, see if a file exists whose name * is the concatenation of the dir, name, and suffix. */ checkpath (dir, name, wp) DIR *dir; char *name; struct where *wp; { char *suff; int i; if (wp->subsec) { /* forced subsection, don't search list */ char suf[10]; sprintf (suf, ".%s", wp->section); return (docheck (dir, name, suf, wp)); } if (access (dir->man, 0) == -1) { /* test for dir existence */ if (debug) printf ("%s: No such directory.\n", dir->man); return (0); } for (i = 0; suff = dir->suff[i]; i++) /* test each possible suffix */ if (docheck (dir, name, suff, wp)) return (1); return (0); } /* * Common code to check on one file. */ static docheck (dir, name, suff, wp) DIR *dir; char *name; char *suff; struct where *wp; { char buf[256]; sprintf (buf, "%s/%s%s", dir->man, name, suff); /* full name of file */ if (debug) /* show file we are checking */ printf ("Checking %s\t", buf); if (access (buf, R_OK) == -1) { /* doesn't exist */ if (debug) printf ("not found.\n"); return (0); } if (debug) printf ("found.\n"); wp->man = strsave (buf); sprintf (buf, "%s/%s%s", dir->cat, name, suff); /* name of cat file */ wp->cat = strsave (buf); wp->found = 1; return (1); }