|
|
researchv10 Norman
/*
* main program for server called by setup
*/
#include <stdio.h>
#include <signal.h>
#include "rf.h"
#define CFD 0 /* filesystem connection */
int fserrno;
/*
* setup handshake:
* receive 16-byte message with initial parameters
* send 1
* receive maxsize bytes: uid map
* user : means list is incomplete;
* send 012 and read another maxsize bytes
* send 2
* receive maxsize bytes: gid map
* group : means list is incomplete;
* send 013 and read another maxsize bytes
* send 3
*/
#define MSG1LEN 16
extern char *_rfwhocalled();
char *malloc();
char *rfclient;
int rfdebug;
main(argc, argv)
int argc;
char **argv;
{
char *inbuf;
char msg[MSG1LEN];
int n;
int maxsize;
umask(0);
signal(SIGHUP, SIG_IGN);
if ((rfclient = _rfwhocalled(CFD)) == NULL)
rfclient = "";
/*
* setup message 1
*/
if ((n = _rfgread(CFD, msg, MSG1LEN, MSG1LEN)) != MSG1LEN)
rfpanic("setup 1: %d\n", n);
maxsize = msg[0] * 1024;
rfdebug = msg[3];
if (_rfinit(argc, argv) == 0)
rfpanic("can't init\n");
if ((inbuf = malloc(maxsize)) == NULL)
rfpanic("can't alloc %d bytes\n", maxsize);
if (write(CFD, "\1", 1) != 1)
rfpanic("setup 1: write error\n");
/*
* setup message 2
*/
for (;;) {
if ((n = _rfgread(CFD, inbuf, maxsize, maxsize)) != maxsize)
rfpanic("setup 2: %d\n", n);
inbuf[n-1] = 0; /* safety */
if (_rfmapuid(inbuf) != 0)
break;
if (write(CFD, "\012", 1) != 1)
rfpanic("setup 2 (12): write error\n");
}
if (write(CFD, "\2", 1) != 1)
rfpanic("setup 2: write error\n");
/*
* setup message 3
*/
for (;;) {
if ((n = _rfgread(CFD, inbuf, maxsize, maxsize)) != maxsize)
rfpanic("setup 3: %d\n", n);
inbuf[n-1] = 0; /* safety */
if (_rfmapgid(inbuf) != 0)
break;
if (write(CFD, "\013", 1) != 1)
rfpanic("setup 3 (13): write error\n");
}
if (write(CFD, "\3", 1) != 1)
rfpanic("setup 3: write error\n");
rflog("ok; buf %d\n", maxsize);
_rfscan(CFD, inbuf, maxsize);
rflog("eof\n");
exit(0);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.