/* dirlist_server.c -- ディレクトリの内容を表示するRPCのプログラム(サーバ側) Created on: 2006/01/18 20:33:31 */ #include /* opendir(2) */ #include /* opendir(2) */ #include /* errno */ #include /* malloc() */ #include /* strlen() */ #include /* 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 ); } }