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