Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/cs/vcs_src/vcs.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
/*
21
* File: server.c
22
*/
23
24
static char id[] = "\n@(#)$Id: vcs+ifs (AT&T Research) 1996-02-29 $\0\n";
25
26
#include "ifs_agent.h"
27
#include "ifs_errno.h"
28
#include <cs.h>
29
#include <error.h>
30
#include <fs3d.h>
31
32
#define CST ( (State_t *) handle )
33
34
/*
35
* replies
36
* I ... information
37
* W ... warning message
38
* E ... error message
39
*/
40
41
typedef struct
42
{
43
time_t uptime;
44
char* where;
45
int out_static;
46
int dormant;
47
int who;
48
int userid[ FD_SETSIZE ];
49
Sfio_t* logfd;
50
char* logfile;
51
} State_t;
52
53
int cserrno;
54
char csusrmsg[ STRLEN ];
55
56
char command_help[] = "\
57
help; kill; quit; version; \t\t\t\
58
record [logfile]; \t\t\t\
59
out pathname [version [pathname]] \t\t\t\
60
instances pathname \t\t\t\
61
mount url(pro:/usr:pw@host:pt/path) lpath time \t\t\t\
62
connect protocol server user-info; \t\t\t\
63
disconnect protocol server; \t\t\t\
64
listdents local-path \t\t\t\
65
getfile local-path \t\t\t\
66
putfile [source] local-path \t\t\t\
67
userdef protocol arguments\n";
68
69
void*
70
svc_init( handle, fdmax )
71
void* handle;
72
int fdmax;
73
{
74
char pidfile[ 80 ];
75
char pid[ 80 ];
76
77
(void) fs3d(FS3D_OP_OFF);
78
(void) memset( CST, 0, sizeof(State_t) );
79
CST->uptime = cs.time;
80
CST->who = getuid();
81
sfsprintf( pid, sizeof(pid), "%d", getpid() );
82
GetUserFile( pidfile, "vcs.pid" );
83
unlink( pidfile );
84
symlink( pid, pidfile );
85
IfsInitial();
86
return( handle );
87
}
88
89
static int
90
svc_connect( handle, fd, id, clone, args )
91
void* handle;
92
int fd;
93
Cs_id_t* id;
94
int clone;
95
char** args;
96
{
97
if ( CST->logfd ) {
98
sfprintf( CST->logfd,
99
"\n-- connect( fd=%d hid=%s pid=%d uid=%d gid=%d )\n",
100
fd, csntoa(id->hid), id->pid, id->uid, id->gid );
101
sfsync( CST->logfd );
102
}
103
if( fd < FD_SETSIZE )
104
CST->userid[ fd ] = id->uid;
105
return (0);
106
}
107
108
static int
109
svc_done( handle, sig )
110
void* handle;
111
int sig;
112
{
113
if ( CST->logfd ) {
114
sfprintf( CST->logfd, "-- svc_done( %d )\n", sig );
115
sfsync( CST->logfd );
116
}
117
return (0);
118
}
119
120
static int
121
version_info( buf, size, uid, own, uptm )
122
char *buf;
123
int size;
124
int uid;
125
int own;
126
time_t uptm;
127
{
128
return sfsprintf( buf, size, "I Hi! %s, vcs[%d] by %s@%s at %s [%s]\n",
129
fmtuid(uid), getpid(), fmtuid(own), csname(0), fmttime(NiL, uptm), id + 10 );
130
}
131
132
static int
133
svc_read( handle, fd )
134
void* handle;
135
int fd;
136
{
137
char msgbuf[ 4 * PATH_MAX ];
138
char ret[ 4 * PATH_MAX ];
139
char *msg = msgbuf;
140
char *argv[16], *ptr;
141
int uid, n, argc;
142
143
(void) fs3d(FS3D_OP_OFF);
144
csusrmsg[0] = '\0';
145
uid = CST->userid[fd];
146
if( (n = csread( fd, msg, sizeof(msgbuf), CS_LINE )) <= 0 )
147
return -1;
148
msg[ n - 1 ] = '\0';
149
if( CST->logfd ) {
150
time_t t;
151
152
t = cs.time;
153
(void) tmform(ret, "%i", &t);
154
sfprintf( CST->logfd, "[%s]\n%s\n", ret, msg );
155
}
156
while ((argc = tokscan( msg, &msg, " %v ", argv, elementsof(argv))) > 0) {
157
n = sizeof(ret);
158
switch ( argv[0][0] ) {
159
case 'c':
160
n = IfsConnect( ret, n, uid, argc, argv );
161
break;
162
case 'd':
163
n = IfsDisconnect( ret, n, uid, argc, argv );
164
break;
165
case 'g':
166
n = IfsGetFile( ret, n, uid, argc, argv );
167
break;
168
case 'h':
169
n = sfsprintf(ret, n, command_help );
170
break;
171
case 'i':
172
n = rscs_instances( argc, argv, ret, &n );
173
break;
174
case 'k':
175
exit( 1 );
176
break;
177
case 'l':
178
n = IfsListDEnts( ret, n, uid, argc, argv );
179
break;
180
case 'm':
181
n = IfsMount( ret, n, uid, argc, argv );
182
break;
183
case 'o':
184
switch (argv[0][1]) {
185
case 'p':
186
n = IfsReal(ret, n, uid, argc, argv);
187
break;
188
default:
189
n = rscs_out( argc, argv, ret, &n );
190
break;
191
}
192
break;
193
case 'p':
194
n = IfsPutFile( ret, n, uid, argc, argv );
195
break;
196
case 'q':
197
n = sfsprintf(ret, n, "I bye\n");
198
break;
199
case 'r':
200
ptr = (argc < 2 ? "/tmp/jvcs.log" : argv[1]);
201
if ( CST->logfd ) {
202
sfclose( CST->logfd );
203
n = sfsprintf(ret, n, "I stop log %s (%d)\n",
204
CST->logfile, CST->logfd );
205
CST->logfd = 0;
206
} else if( (CST->logfd = sfopen(NULL,ptr,"a")) == NULL ) {
207
n = sfsprintf(ret, n, "E cannot open %s\n", ptr );
208
} else {
209
CST->logfile = strdup( ptr );
210
sfprintf( CST->logfd, "\n" );
211
n = sfsprintf(ret, n, "I record %s\n", ptr );
212
}
213
break;
214
case 's':
215
n = IfsReal(ret, n, uid, argc, argv);
216
break;
217
case 'v':
218
n = version_info( ret, sizeof(ret), uid, CST->who, CST->uptime );
219
break;
220
case 'u':
221
n = IfsUserDef( ret, n, uid, argc, argv );
222
break;
223
case 'D':
224
error_info.trace = -(int)strtol(argv[1], (char**)0, 0);
225
n = sfsprintf(ret, n, "I debug level %d\n", -error_info.trace );
226
break;
227
default:
228
n = sfsprintf(ret, n, "E invalid command %s\n", argv[0] );
229
break;
230
}
231
if (write(fd, ret, n) != n || *argv[0] == 'q')
232
return -1;
233
}
234
if ( CST->logfd ) {
235
if( ret[n-1] == '\n' )
236
ret[n-1] = '\0';
237
sfprintf( CST->logfd, "\t%s\n", ret );
238
sfsync( CST->logfd );
239
}
240
return (0);
241
}
242
243
static int
244
svc_timeout( handle )
245
void* handle;
246
{
247
return (0);
248
}
249
250
int
251
main( argc, argv )
252
int argc;
253
char** argv;
254
{
255
static State_t state;
256
257
NoP(argc);
258
csserve( &state, argv[1], svc_init, svc_done, svc_connect,
259
svc_read, NULL, svc_timeout);
260
exit(1);
261
}
262
263
264