1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1990-2011 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                                                                      *
19 ***********************************************************************/
20 #include "vcs_rscs.h"
21 
stamp2version(list,t)22 char* stamp2version(list, t)
23 	rdirent_t*	list;
24 	time_t		t;
25 {
26 	char			buf[15];
27 	register char*		s;
28 	register int		len;
29 	register rdirent_t*	et;
30 	int			seq = -1;
31 	int			num;
32 
33 	/* mm.dd.yy:nn 		*/
34 	(void)tmform(buf, "%x", &t);
35 	buf[2] = buf[5] = '.';
36 
37 	if (list == NULL)
38 		return (memdup(buf, strlen(buf)+1));
39 
40 	len = 8;
41 
42 	for (et =list; et; et = et->next)
43 	{
44 		if (strncmp(et->tag->version, buf, 8) == 0)
45 		{
46 			if (strlen(et->tag->version) > 8)
47 			{
48 				s = et->tag->version + 9;
49 				num = (int)strtol(s, (char**)0, 0);
50 				if (num && num > seq)
51 					seq = num;
52 			}
53 			else
54 				seq = 0;
55 		}
56 	}
57 	seq++;
58 	if (seq)
59 	{
60 		s = buf + len;
61 		sfsprintf(s, sizeof(buf) - len, ":%d", seq);
62 	}
63 	return (memdup(buf, strlen(buf)+1));
64 }
65 
locking(fd)66 int locking(fd)
67 	Sfio_t*	fd;
68 {
69 	return (0);
70 }
71 
72 
unlocking(fd)73 int unlocking(fd)
74 	Sfio_t*	fd;
75 {
76 	return (0);
77 }
78 
sfmark(sf)79 int sfmark(sf)
80 {
81 	return (0);
82 }
83 
84 
rollback(sf)85 int rollback(sf)
86 {
87 	return (0);
88 }
89 
90 /*  chop(s,w,n,c) - break string into fields
91  *  a common usage:
92  *		elist[num=chop(s, elist, MAXDEPTH, '/')] = NULL;
93  *  s is modified in place with '\0' replacing occurrences of separator char c.
94  *  w is an array of n char pointers to receive addresses of the fields.  The
95  *  return value gives the number of fields actually found; additional entries
96  *  in w are given the address of a null string.
97  */
98 
chop(s,w,n,c)99 int chop(s,w,n,c)
100 	register char *s;
101 	char *w[];
102 	int n;
103 	char c;
104 {
105 	register int i;
106 
107 	for (i = 0; i < n && *s;)
108 	{
109 		w[i++] = s;
110 		while (*s && *s != c)
111 			s++;
112 		if (!*s)
113 	    		break;
114 		*s++ = '\0';
115 	}
116 	while (i < n)
117 		w[--n] = s;
118     	return i;
119 }
120 
121 
122 /*
123  * skip(w,n)
124  *	skip empty string in w;
125  *
126  */
127 
skip(w,n)128 int skip(w, n)
129 	char *w[];
130 	register int n;
131 {
132 	register int i;
133 	register int j;
134 
135 	for (i = 0, j = 0; i < n; i++)
136 		if (w[i][0]) w[j++] = w[i];
137 	return (j);
138 }
139 
140 
141 
142 
143 /*
144  *	maintain domain table
145  */
146 
147 static char*	DomainTbl[MAXVCSDOMAIN+1];
148 static int	NumDomain = 0;
149 static char	MyDomain[20];
150 static int	MyDomainID = 0;
151 
domaininit()152 static void domaininit()
153 {
154 	register char*		s;
155 	register int		i;
156 
157 	s = (char *)malloc(strlen(DOMAINS) + 1);
158 	strcpy(s, DOMAINS);
159 	DomainTbl[NumDomain = chop(s, DomainTbl, MAXVCSDOMAIN, ' ')] = NULL;
160 	/* first entry is reserved */
161 	for (i = NumDomain; i ; i--)
162 		DomainTbl[i] = DomainTbl[i-1];
163 	NumDomain++;
164 	DomainTbl[0] = DomainTbl[NumDomain] = NULL;
165 
166 #if 0
167 	(void) getdomainname(MyDomain, sizeof(MyDomain));
168 #else
169 	if ((s = csfull(0)) && (s = strchr(s, '.')))
170 	{
171 		register char*	t = MyDomain;
172 		register char*	e = MyDomain + sizeof(MyDomain) - 1;
173 
174 		while (t < e && (*t = *++s) && *t != '.')
175 			t++;
176 		*t = 0;
177 	}
178 
179 #endif
180 	for (i = 1; i < NumDomain; i++)
181 	{
182 		if (strcmp(MyDomain, DomainTbl[i]) == 0)
183 		{
184 			MyDomainID = i;
185 			return;
186 		}
187 	}
188 	message((0, "current domain %s is not registered", MyDomain));
189 	MyDomainID = 0;
190 	return;
191 }
192 
getmydomain()193 int getmydomain()
194 {
195 	if (!NumDomain)
196 		domaininit();
197 
198 	return (MyDomainID);
199 }
200 
201 
getdomainbyname(s)202 int getdomainbyname(s)
203 	register char*	s;
204 {
205 	register int	i;
206 
207 	if (!NumDomain)
208 		domaininit();
209 	for (i = 0; i < NumDomain; i++)
210 	{
211 		if (strcmp(s, DomainTbl[i]) == 0)
212 			return i;
213 	}
214 	return (-1);
215 }
216 
217 
getdomainbyid(i)218 char* getdomainbyid(i)
219 	register int i;
220 {
221 	if (!NumDomain)
222 		domaininit();
223 	if (i >= NumDomain)
224 		return (NULL);
225 
226 	return (DomainTbl[i]);
227 }
228 
229 
230 /*
231  *	return permission for access the version marked by a marker
232  *		0 : warnning
233  *		1 : warnning & check_out file is read-ony
234  *		2 : checkout is prohibited
235  */
236 
permission(st,uid,gid)237 int permission(st, uid, gid)
238 	register struct stat* 	st;
239 	register uid_t		uid;
240 	register uid_t		gid;
241 {
242 	if (uid == st->st_uid)
243 		return (st->st_mode & S_IWUSR ? 0 :
244 			st->st_mode & S_IRUSR ? 1 : 2);
245 	else if (gid == st->st_gid)
246 		return (st->st_mode & S_IWGRP ? 0 :
247 			st->st_mode & S_IRGRP ? 1 : 2);
248 	else
249 		return (st->st_mode & S_IWOTH ? 0 :
250 			st->st_mode & S_IROTH ? 1 : 2);
251 }
252