xref: /original-bsd/usr.bin/uucp/libuu/subdir.c (revision e74403ba)
1 #ifndef lint
2 static char sccsid[] = "@(#)subdir.c	5.1 (Berkeley) 07/02/83";
3 #endif
4 
5 #include "uucp.h"
6 #ifdef	UUDIR
7 /*
8  * By Tom Truscott, March 1983
9  * THIS VERSION OF SYSKLUDGE IS FOR USE ONLY
10  * WITH THE 'UUDIR' VERSION OF UUCP.
11  *
12  * There once was a separate 'uudir' package to retrofit
13  * versions of uucp, but that is no longer recommended.
14  *
15  * Prefix table.
16  * If a prefix is "abc", for example,
17  * then any file Spool/abc... is mapped to Spool/abc/abc... .
18  * The first prefix found is used, so D.foo should preceed D. in table.
19  *
20  * Each prefix must be a subdirectory of Spool, owned by uucp!
21  * Remember: use cron to uuclean these directories daily,
22  * and check them manual every now and then.  Beware complacency!
23  */
24 
25 static char *prefix[] = {
26 	DLocalX,	/* Outbound 'xqt' request files */
27 	DLocal,		/* Outbound data files */
28 	"D.",		/* Other "D." files (remember the "."!) */
29 	"C.",		/* "C." subdirectory */
30 	"X.",		/* "X." subdirectory */
31 	"TM.",		/* Temporaries for inbound files */
32 	0
33 };
34 
35 /*
36  * filename mapping kludges to put uucp work files in other directories.
37  */
38 
39 #define	BUFLEN	50
40 /* assert(strlen(Spool)+1+14+1+14 <= BUFLEN) */
41 
42 static	char fn1[BUFLEN], fn2[BUFLEN];	/* remapped filename areas */
43 static	int	inspool;		/* true iff working dir is Spool */
44 
45 /*
46  * return (possibly) remapped string s
47  */
48 char *
49 SubFile(as)
50 char *as;
51 {
52 	register char *s, **p;
53 	register int n;
54 	static char *tptr = NULL;
55 
56 	/* Alternate buffers so "link(subfile(a), subfile(b))" works */
57 	if (tptr != fn1)
58 		tptr = fn1;
59 	else
60 		tptr = fn2;
61 
62 	s = as;
63 	tptr[0] = '\0';
64 
65 	/* if s begins with Spool/, copy that to tptr and advance s */
66 	if (strncmp(s, Spool, n = strlen(Spool)) == 0 && s[n] == '/') {
67 		if (!inspool) {
68 			strcpy(tptr, Spool);
69 			strcat(tptr, "/");
70 		}
71 		s += n + 1;
72 	}
73 	else
74 		if (!inspool)
75 			return(as);
76 
77 	/* look for first prefix which matches, and make subdirectory */
78 	for (p = &prefix[0]; *p; p++) {
79 		if (strncmp(s, *p, n = strlen(*p))==0 && s[n] && s[n] != '/') {
80 			strcat(tptr, *p);
81 			strcat(tptr, "/");
82 			strcat(tptr, s);
83 			return(tptr);
84 		}
85 	}
86 	return(as);
87 }
88 
89 /*
90  * save away filename
91  */
92 SubChDir(s)
93 register char *s;
94 {
95 	inspool = (strcmp(s, Spool) == 0);
96 	return(chdir(s));
97 }
98 
99 /*
100  * return possibly corrected directory for searching
101  */
102 char *
103 SubDir(d, pre)
104 register char *d, pre;
105 {
106 	if (strcmp(d, Spool) == 0)
107 		if (pre == CMDPRE)
108 			return("/usr/spool/uucp/C.");
109 		else if (pre == XQTPRE)
110 			return("/usr/spool/uucp/X.");
111 	return(d);
112 }
113 #else
114 static int subdir_here;		/* quiet 'ranlib' command */
115 #endif
116