Skip to content

Commit 632c55a

Browse files
author
endgame00
committed
Support new command-line options for vcfsd
1 parent 0264fa0 commit 632c55a

6 files changed

Lines changed: 139 additions & 68 deletions

File tree

cvs_cmds.c

Lines changed: 57 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ shifts[] = {
2929
182,128,158,208,162,132,167,209,149,241,153,251,237,236,171,195,
3030
243,233,253,240,194,250,191,155,142,137,245,235,163,242,178,152 };
3131

32-
static cvs_args *args;
32+
static cvs_session *session;
3333
int DEBUG_RESP = 0;
3434

3535
/* Taken from the cvs client code */
@@ -73,18 +73,20 @@ static struct hostent *init_sockaddr(struct sockaddr_in *name,
7373
return hostinfo;
7474
}
7575

76-
/* Set CVS session arguments */
77-
void cvs_init(char *hostname, char *root, char *module, char *user,
78-
char *password, char *dir)
76+
/* Set initial CVS session arguments */
77+
void cvs_init_session(char *hostname, char *root, char *module, char *user,
78+
char *password, char *dir, bool use_gzip, vcfs_tag tag)
7979
{
80-
args = (cvs_args *)malloc(sizeof(cvs_args));
81-
82-
args->hostname = strdup(hostname);
83-
args->root = strdup(root);
84-
args->module = strdup(module);
85-
args->user = strdup(user);
86-
args->password = scramble(password);
87-
args->dir = strdup(dir);
80+
session = (cvs_session *)malloc(sizeof(cvs_session));
81+
82+
session->hostname = strdup(hostname);
83+
session->root = strdup(root);
84+
session->module = strdup(module);
85+
session->user = strdup(user);
86+
session->password = scramble(password);
87+
session->dir = strdup(dir);
88+
session->use_gzip = use_gzip;
89+
*session->tag = *tag;
8890
}
8991

9092
/* Returned a malloc'ed cvs_buff.
@@ -191,7 +193,7 @@ cvs_buff *cvs_get_resp()
191193
struct pollfd fds;
192194
int result;
193195

194-
fds.fd = args->sock;
196+
fds.fd = session->sock;
195197
fds.events = POLLIN; /* Check if there is data waiting to be read */
196198
fds.revents = 0;
197199

@@ -219,7 +221,7 @@ cvs_buff *cvs_get_resp()
219221
}
220222

221223
memset(&temp, 0, CVS_READ_SIZE);
222-
n = recv(args->sock, &temp, CVS_READ_SIZE, 0);
224+
n = recv(session->sock, &temp, CVS_READ_SIZE, 0);
223225

224226
if (DEBUG_RESP)
225227
{
@@ -255,7 +257,7 @@ int cvs_pserver_connect()
255257
return -1;
256258
}
257259

258-
hostinfo = init_sockaddr (&client_sock, args->hostname, CVSPORT);
260+
hostinfo = init_sockaddr (&client_sock, session->hostname, CVSPORT);
259261

260262
if (connect(sock, (struct sockaddr *) &client_sock,
261263
sizeof(client_sock)) < 0)
@@ -267,15 +269,15 @@ int cvs_pserver_connect()
267269
/* Authenticate ourselves with the server */
268270
if (send (sock, begin, strlen (begin), 0) < 0)
269271
fprintf(stderr, "Can't send\n");
270-
if (send (sock, args->root, strlen(args->root), 0) < 0)
272+
if (send (sock, session->root, strlen(session->root), 0) < 0)
271273
fprintf(stderr, "Can't send\n");
272274
if (send (sock, "\012", 1, 0) < 0)
273275
fprintf(stderr, "Can't send\n");
274-
if (send (sock, args->user, strlen(args->user), 0) < 0)
276+
if (send (sock, session->user, strlen(session->user), 0) < 0)
275277
fprintf(stderr, "Can't send\n");
276278
if (send (sock, "\012", 1, 0) < 0)
277279
fprintf(stderr, "Can't send\n");
278-
if (send (sock, args->password, strlen(args->password), 0) < 0)
280+
if (send (sock, session->password, strlen(session->password), 0) < 0)
279281
fprintf(stderr, "Can't send\n");
280282
if (send (sock, "\012", 1, 0) < 0)
281283
fprintf(stderr, "Can't send\n");
@@ -291,7 +293,7 @@ int cvs_pserver_connect()
291293
return -1;
292294
}
293295

294-
args->sock = sock;
296+
session->sock = sock;
295297
return sock;
296298
}
297299

@@ -329,52 +331,55 @@ int cvs_expand_modules(cvs_buff **resp)
329331
memset(buff, 0, 1024);
330332

331333
/*
332-
if (chdir(args->dir) != 0) {
333-
fprintf(stderr, "Could not chdir to directory %s\n", args->dir);
334+
if (chdir(session->dir) != 0) {
335+
fprintf(stderr, "Could not chdir to directory %s\n", session->dir);
334336
return 0;
335337
}
336338
*/
337339

338-
sprintf(&cmd[0], "Root %s\012", args->root);
339-
cvs_send(args->sock, cmd);
340+
sprintf(&cmd[0], "Root %s\012", session->root);
341+
cvs_send(session->sock, cmd);
340342

341-
sprintf(&cmd[0], "Argument %s\012", args->module);
342-
cvs_send(args->sock, cmd);
343+
sprintf(&cmd[0], "Argument %s\012", session->module);
344+
cvs_send(session->sock, cmd);
343345

344-
cvs_send(args->sock, "Directory .\012");
346+
cvs_send(session->sock, "Directory .\012");
345347

346-
sprintf(&cmd[0], "%s\012", args->root); /* Unecessary?? */
347-
cvs_send(args->sock, cmd);
348+
sprintf(&cmd[0], "%s\012", session->root); /* Unecessary?? */
349+
cvs_send(session->sock, cmd);
348350

349-
cvs_send(args->sock, "expand-modules\012");
351+
cvs_send(session->sock, "expand-modules\012");
350352

351353
*resp = cvs_get_resp();
352354

353355
return 1;
354356
}
355357

356358
/* Checkout the module and get a complete dir listing. */
357-
int cvs_co(cvs_buff **resp)
359+
int cvs_co(cvs_buff **resp, vcfs_tag tag)
358360
{
359361
char cmd[1024];
360362
time_t before;
361363

362-
cvs_send(args->sock, "gzip-file-contents 3\012");
363-
364+
if (session->use_gzip)
365+
{
366+
cvs_send(session->sock, "gzip-file-contents 3\012");
367+
}
368+
364369
/* TBD - rewrite with sprintf!! */
365370
strcpy(cmd, "Argument ");
366-
strcat(cmd, args->module);
371+
strcat(cmd, session->module);
367372
strcat(cmd, "\012");
368-
cvs_send(args->sock, cmd);
373+
cvs_send(session->sock, cmd);
369374

370375
sprintf(cmd, "Directory .\012");
371-
cvs_send(args->sock, cmd);
376+
cvs_send(session->sock, cmd);
372377

373-
strcpy(cmd, args->root);
378+
strcpy(cmd, session->root);
374379
strcat(cmd, "\012");
375-
cvs_send(args->sock, cmd);
380+
cvs_send(session->sock, cmd);
376381

377-
cvs_send(args->sock, "co\012");
382+
cvs_send(session->sock, "co\012");
378383

379384
before = time(NULL);
380385

@@ -394,16 +399,16 @@ int cvs_get_file(vcfs_path name, char *ver, cvs_buff **resp)
394399
split_path(name, &parent, &entry);
395400

396401
sprintf(cmd, "Argument -r\012Argument %s\012", ver);
397-
cvs_send(args->sock, cmd);
402+
cvs_send(session->sock, cmd);
398403

399-
sprintf(cmd, "Argument -u\012Directory .\012%s/%s\012", args->root, parent);
400-
cvs_send(args->sock, cmd);
404+
sprintf(cmd, "Argument -u\012Directory .\012%s/%s\012", session->root, parent);
405+
cvs_send(session->sock, cmd);
401406

402407
sprintf(cmd, "Entry /%s/%s///\012", entry, ver);
403-
cvs_send(args->sock, cmd);
408+
cvs_send(session->sock, cmd);
404409

405410
sprintf(cmd, "Argument %s\012update\012", entry);
406-
cvs_send(args->sock, cmd);
411+
cvs_send(session->sock, cmd);
407412

408413
*resp = cvs_get_resp();
409414

@@ -422,16 +427,16 @@ int cvs_get_status(vcfs_path name, char *ver, cvs_buff **resp)
422427
split_path(name, &parent, &entry);
423428

424429
sprintf(cmd, "Argument -r%s\012", ver);
425-
cvs_send(args->sock, cmd);
430+
cvs_send(session->sock, cmd);
426431

427-
sprintf(cmd, "Directory .\012%s/%s\012", args->root, parent);
428-
cvs_send(args->sock, cmd);
432+
sprintf(cmd, "Directory .\012%s/%s\012", session->root, parent);
433+
cvs_send(session->sock, cmd);
429434

430435
sprintf(cmd, "Entry /%s/%s///\012", entry, ver);
431-
cvs_send(args->sock, cmd);
436+
cvs_send(session->sock, cmd);
432437

433438
sprintf(cmd, "Argument %s\012log\012", entry);
434-
cvs_send(args->sock, cmd);
439+
cvs_send(session->sock, cmd);
435440

436441
*resp = cvs_get_resp();
437442

@@ -447,14 +452,14 @@ int cvs_get_log(vcfs_path name, cvs_buff **resp)
447452

448453
split_path(name, &parent, &entry);
449454

450-
sprintf(cmd, "Directory .\012%s/%s\012", args->root, parent);
451-
cvs_send(args->sock, cmd);
455+
sprintf(cmd, "Directory .\012%s/%s\012", session->root, parent);
456+
cvs_send(session->sock, cmd);
452457

453458
//sprintf(cmd, "Entry /%s/%s///\012", entry, ver);
454-
//cvs_send(args->sock, cmd);
459+
//cvs_send(session->sock, cmd);
455460

456461
sprintf(cmd, "Argument %s\012log\012", entry);
457-
cvs_send(args->sock, cmd);
462+
cvs_send(session->sock, cmd);
458463

459464
*resp = cvs_get_resp();
460465

cvs_cmds.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include "vcfs.h"
88

99
#define CVSPORT 2401
10-
#define CVS_BUFF_SIZE 32768
10+
#define CVS_BUFF_SIZE (64 * 1024)
1111

1212
/* A buffer to hold a response from the CVS server */
1313
typedef struct cvs_buff {
@@ -18,15 +18,17 @@ typedef struct cvs_buff {
1818
} cvs_buff;
1919

2020
/* Information about the current CVS session */
21-
typedef struct cvs_args {
21+
typedef struct cvs_session {
2222
char *module;
2323
char *hostname;
2424
char *root;
2525
char *user;
2626
char *password;
2727
char *dir;
2828
int sock;
29-
} cvs_args;
29+
bool use_gzip;
30+
vcfs_tag tag;
31+
} cvs_session;
3032

3133
#define CVS_READ_SIZE 8192
3234

@@ -36,12 +38,12 @@ void cvs_free_buff(cvs_buff *b);
3638
void cvs_ensure_buff(cvs_buff *b, int n);
3739

3840

39-
void cvs_init(char *hostname, char *root, char *module, char *user,
40-
char *password, char *dir);
41+
void cvs_init_session(char *hostname, char *root, char *module, char *user,
42+
char *password, char *dir, bool use_gzip, vcfs_tag tag);
4143
int cvs_pserver_connect();
4244
int cvs_send(int sock, char *msg);
4345
int cvs_expand_modules(cvs_buff **resp);
44-
int cvs_co(cvs_buff **resp);
46+
int cvs_co(cvs_buff **resp, vcfs_tag tag);
4547
int cvs_buff_read_line(cvs_buff *b, char **line);
4648
int cvs_ver_extended(char *name, vcfs_path *short_name, vcfs_ver *ver);
4749
int cvs_get_file(vcfs_path name, char *ver, cvs_buff **resp);

nfs_redefines.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef __FIX_H
2-
#define __FIX_H
1+
#ifndef __NFS_REDEF_H
2+
#define __NFS_REDEF_H
33

44
//#define nfs_program_2
55
#define nfsproc_null_2_svc nfsproc_null_2

vcfs.c

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,56 @@ int main(int argc, char **argv)
3232
SVCXPRT *tp;
3333
char *pword;
3434
register SVCXPRT *transp;
35-
35+
char *module;
36+
char *root;
37+
char *hostname;
38+
char *user;
39+
bool use_gzip = TRUE;
40+
vcfs_tag tag;
41+
int opt;
42+
3643
progname = argv[0];
3744
port = VCFS_PORT;
38-
45+
memset(tag, 0, VCFS_TAG_LEN);
46+
3947
if (argc < 5) {
4048
usage(NULL);
4149
exit(1);
4250
}
4351

52+
/* Get command options */
53+
opterr = 0;
54+
while ((opt = getopt(argc, argv, "nt:")) != -1)
55+
{
56+
switch (opt)
57+
{
58+
case 'n':
59+
use_gzip = FALSE;
60+
break;
61+
62+
case 't':
63+
strncpy(&tag[0], optarg, VCFS_TAG_LEN);
64+
break;
65+
default:
66+
usage("Invalid option.");
67+
exit(1);
68+
}
69+
70+
}
71+
72+
/* Get the four required arguments */
73+
if (optind + 4 > argc)
74+
{
75+
usage(NULL);
76+
exit(1);
77+
}
78+
79+
hostname = argv[optind++];
80+
root = argv[optind++];
81+
module = argv[optind++];
82+
user = argv[optind];
83+
84+
4485
/* Get the user's cvs password */
4586
pword = getpass("Enter CVS password:");
4687

@@ -103,7 +144,8 @@ int main(int argc, char **argv)
103144
UID = getuid();
104145
GID = getgid();
105146

106-
cvs_init(argv[1], argv[2], argv[3], argv[4], pword, VCFS_ROOT);
147+
cvs_init_session(hostname, root, module, user,
148+
pword, VCFS_ROOT, use_gzip, tag);
107149

108150
if (cvs_pserver_connect() < 0) {
109151
fprintf(stderr, "Authentication on CVS server failed\n");
@@ -121,7 +163,10 @@ void usage(char *msg)
121163
if (msg != NULL) {
122164
fprintf(stderr, "%s: %s\n", progname, msg);
123165
}
124-
fprintf(stderr, "Usage: %s [hostname] [cvsroot] [project] [username]\n",
166+
167+
fprintf(stderr, "Usage: %s [OPTION] HOSTNAME CVSROOT PROJECT USERNAME\n\n",
125168
progname);
169+
fprintf(stderr, "-n\tDon't gzip file contents\n");
170+
fprintf(stderr, "-t TAG\tLoad the contents of the repository specified by TAG\n");
126171
}
127172

0 commit comments

Comments
 (0)