/*
	dirlist_server.c -- ディレクトリの内容を表示するRPCのプログラム(サーバ側)
	Created on: 2006/01/18 20:33:31
*/

#include <sys/types.h>		/* opendir(2) */
#include <dirent.h>		/* opendir(2) */
#include <errno.h>		/* errno */
#include <stdlib.h>		/* malloc() */
#include <string.h>		/* strlen() */
#include <stdio.h>		/* snprintf() */

#include "dirlist.h"
static struct delist *make_delist( DIR *dirp );

dirlist_res *
dirlist_1_svc(char **argp, struct svc_req *rqstp)
{
    static dirlist_res  result;
    DIR *dirp ;
    char *dirname ;

	xdr_free((xdrproc_t)xdr_dirlist_res, (char *)&result);

	dirname = *argp ;
	dirp = opendir( dirname );
	if( dirp == 0 )
	{
	    result.dlr_errno = errno ;
	    return( &result );
	}
	result.dlr_errno = 0;
	result.dirlist_res_u.dlr_head = make_delist( dirp );
	closedir( dirp );
	return( &result );
}

static struct delist *
make_delist( DIR *dirp )
{
    struct dirent *dp ;
    struct delist *del ;
    int namelen;
	if( (dp = readdir(dirp)) == NULL )
	{
	    return( 0 );
	}
	else
	{
	    del = malloc(sizeof(struct delist));
	    namelen = strlen( dp->d_name );
	    del->del_name = malloc( namelen+1 );
	    snprintf(del->del_name,namelen+1,"%s",dp->d_name );
	    del->del_next = make_delist( dirp );
	    return( del );
	}
}
