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