Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
01.05.2014
Размер:
1.74 Кб
Скачать
/* 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 */
}

    

Соседние файлы в папке scan2