Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/cs/vcs_src/vcs_misc.c
1810 views
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 <[email protected]> *
18
* *
19
***********************************************************************/
20
#include "vcs_rscs.h"
21
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
66
int locking(fd)
67
Sfio_t* fd;
68
{
69
return (0);
70
}
71
72
73
int unlocking(fd)
74
Sfio_t* fd;
75
{
76
return (0);
77
}
78
79
int sfmark(sf)
80
{
81
return (0);
82
}
83
84
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
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
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
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
193
int getmydomain()
194
{
195
if (!NumDomain)
196
domaininit();
197
198
return (MyDomainID);
199
}
200
201
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
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
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
253