Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тестовые примеры / ch12 / scan2 / scan_svc2
.C/* server program: low-level RPC APIs */
/* usage: msg_svc2 <transport> */
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <malloc.h>
#include <sys/stat.h>
#include "scan2.h"
#include "RPC.h"
extern int errno;
static RPC_svc *svcp = 0;
int scandir( SVCXPRT* xtrp )
{
DIR *dirp;
struct dirent *d;
infolist nl, *nlp;
struct stat statv;
res res;
argPtr darg = 0;
if (svcp->getargs( xtrp, (xdrproc_t)xdr_argPtr, (caddr_t)&darg)!=RPC_SUCCESS)
return -1;
cerr << "server: get dir: '" << darg->dir_name << "', lflag=" << darg->lflag << endl;
if (!(dirp = opendir(darg->dir_name))) {
res.errno = errno;
(void)svcp->reply(xtrp, (xdrproc_t)xdr_res, (caddr_t)&res);
return -2;
}
xdr_free((xdrproc_t)xdr_res, (char*)&res);
nlp = &res.res_u.list;
while (d=readdir(dirp)) {
nl = *nlp = (infolist)malloc(sizeof(struct dirinfo));
nl->name = strdup(d->d_name);
nlp = &nl->next;
if (darg->lflag) {
char pathnm[256];
sprintf(pathnm,"%s/%s",darg->dir_name,d->d_name);
if (!stat(pathnm,&statv)) {
nl->uid = statv.st_uid;
nl->modtime = statv.st_mtime;
}
}
}
*nlp = 0;
res.errno = 0;
closedir(dirp);
if (svcp->reply(xtrp, (xdrproc_t)xdr_res, (caddr_t)&res)!=RPC_SUCCESS)
return -2;
return RPC_SUCCESS;
}
int main(int argc, char* argv[])
{
svcp = new RPC_svc( SCANPROG, SCANVER, "netpath");
if (svcp->run_func( SCANDIR, scandir )) return 1;
return 0; /* shouldn't get here */
}