Newsgroups: fj.comp.misc
Path: galaxy.trc.rwcp.or.jp!jaist-news!cs.titech!nirvana.cs.titech!wnoc-tyo-news!sh.wide!wnoc-kyo!kuis!kudpc!hakata!ie.u-ryukyu.ac.jp!yas
From: yas@ocean.ie.u-ryukyu.ac.jp (Yasushi Shinjo)
Subject: Re: forking RPC program
In-Reply-To: hotta@flab.fujitsu.co.jp's message of Tue, 9 Nov 1993 00:14:05 GMT
Message-ID: <YAS.93Nov10232637@top.ie.u-ryukyu.ac.jp>
Lines: 707
Sender: news@spn.ie.u-ryukyu.ac.jp (News System Admin)
Organization: Dept. of Elect. & Info. Eng., Univ. of the Ryukyus, Okinawa,
	Japan
References: <HOTTA.93Nov2120755@mcbain.soft.flab.fujitsu.co.jp>
	<YAS.93Nov4232847@top.ie.u-ryukyu.ac.jp>
	<HOTTA.93Nov9091405@mcbain.soft.flab.fujitsu.co.jp>
Date: Wed, 10 Nov 1993 14:26:37 GMT
Xref: galaxy.trc.rwcp.or.jp fj.comp.misc:2328
X-originally-archived-at: http://galaxy.rwcp.or.jp/text/cgi-bin/newsarticle2?ng=fj.comp.misc&nb=2328&hd=a
X-reformat-date: Mon, 18 Oct 2004 15:18:22 +0900
X-reformat-comment: Tabs were expanded into 4 column tabstops by the Galaxy's archiver. See http://katsu.watanabe.name/ancientfj/galaxy-format.html for more info.

$BN05eBg3X>pJs9)3X2J$N?7>k$G$9!#$3$s$K$A$O!#(B

In article <HOTTA.93Nov9091405@mcbain.soft.flab.fujitsu.co.jp> 
hotta@flab.fujitsu.co.jp (Yuuji Hotta) writes:
> $BIY;NDL8&$NKYED$G$9(B.

>> $B$?$@!"$[$C(B
>> $B$F$*$/$H!"(Bfork() $B$N?F%W%m%;%9$b;R%W%m%;%9$bN>J}$H$b(B RPC $B$N1~(B
>> $BEz$rJV$=$&$H$9$k$G$7$g$&!#$=$&$J$i$J$$$h$&$K$9$k$K$O!"$^$:(B 
>> main() $B$NCf$G!"(Bsetjmp() $B$G$b$7$F$*$$$F!";R$I$b$,(B longjmp() 
>> $B$9$k$H$$$$$s$8$c$J$$$G$7$g$&$+!#(B
> 
> $B$3$&$9$k$H;R%W%m%;%9$@$1$,DL>o$N(B RPC $B$N$h$&$K7k2L$rJV$9$3$H$,=PMh$k(B, 
> $B$H$$$&$3$H$G$7$g$&$+(B? ($B$=$l$,K>$_$NF0:n$J$s$G$9$,(B)

$B$O$$!#$A$g$C$H%G%b%W%m%0%i%`$r:n$C$F$_$^$7$?!#$*;n$7$/$@$5$$!#(B

main() $B$G(B setjmp() $B$9$k$N$G$O$J$/$F!"(BRPC $B$N<jB3$-$r8F$S=P$9(B
$B$b$N!J%W%m%0%i%`L>!2%P!<%8%g%sL>$H$$$&L>A0$N4X?t!"(Brpcgen$B$G<+(B
$BF0@8@.$5$l$k!K$G$d$k$3$H$K$7$^$7$?!#$=$l$+$i!";R%W%m%;%9$NJ}(B
$B$O!"(BRPC $B$N7k2L$rJV$7$?8e$G(B exit() $B$9$k$h$&$K$7$^$7$?!#(B

rpcgen $B$N(B -I $B%*%W%7%g%s$O;H$C$?$3$H$,$"$j$^$;$s!#$*$=$i$/!"(B
$B@8@.$5$l$?%W%m%0%i%`$N2~B$$NJ}K!$O!"$=$l$[$IJQ$o$i$J$$$N$G$O(B
$B$J$$$+$H;W$$$^$9!#$&$^$/$$$C$?$i!"65$($F2<$5$$!#(B

$B!@!@!!?7>k!!Lw!!!J$7$s$8$g$&!!$d$9$7!K!!!@!@(B
$B!@!@!!N05eBg3X!!>pJs9)3X!!!!!!!!!!!!!!!!!@!@(B

----------------------------------------------------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#"End of shell archive."
# Contents:  README Makefile dir.x dir_clnt.c dir_proc.c dir_proc_f.c
#   dir_svc_f.c rls.c
# Wrapped by yas@top on Wed Nov 10 23:25:17 1993
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(6298 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X1993/11/10 16:25:42
X
XSunRPC/demo/dir-fork
X
X$BN05eBg3X>pJs9)3X2J(B
X$B?7>k!!Lw(B
X<yas@ie.u-ryukyu.ac.jp>
X
X$B#1!!$O$8$a$K(B
X
X$B$3$l$O!"(BSun RPC $B$GJ#?t$N%/%i%$%"%s%H$+$i$N=hM}$rF1;~$K=hM}$9$k$?$a$N%G(B
X$B%b%W%m%0%i%`$G$9!#$b$H$b$H$O!"(BSun RPC v3.9 $B$N%=!<%9$N(B demo/dir/ $B$K4^$^(B
X$B$l$F$$$?4^$^$l$F$$$k%G%b%W%m%0%i%`$r2~B$$7$?$b$N$G$9!#$3$l$O!"1s3V%[%9(B
X$B%H>e$N%G%#%l%/%H%j$NFbMF$rJV$91s3V<jB3$-8F=P$7$N%5!<%P$H!"$=$l$r2hLL$K(B
X$BI=<($9$k1s3V<jB3$-8F=P$7$N%/%i%$%"%s%H$+$i9=@.$5$l$F$$$^$9!#(B
X
X$B=q$-49$($?%W%m%0%i%`$O!"0J2<$N#2$D$G$9!#(B
X
Xdir_proc_f.c -- $B%5!<%PB&$G8F$S=P$5$l$k<jB3$-!#(Bdir_proc.c $B$r=q$-49$((B
X$B$?$b$N!#(B
Xdir_svc_f.c  -- $B%5!<%PB&$N(B main() $B%W%m%0%i%`!#(Bdir.x $B$h$j(B rpcgen $B%3%^%s(B
X$B%I$K$h$C$F@8@.$5$l$?(B dir_svc.c $B$r=q$-49$($?$b$N!#(B
X
Xdemo/dir/ $B0J2<$N%W%m%0%i%`$N@bL@$O!"#S#u#n$N%^%K%e%"%k!V(BNetwork
XProgrammin$B!W$K$"$j$^$9!##S#u#n0J30$N%7%9%F%`$G$b!"(Brpcgen $B$N;H$$J}$N%^(B
X$B%K%e%"%k$K=P$F$$$k$G$H;W$$$^$9!#$"$k$$$O!"(BSun RPC v3.9 $B$N%=!<%9$N(B 
Xdoc/rpcgen.ms $B$r$4Mw2<$5$$!#(B
X
XSun RPC $B$N%=!<%9$O!"$@$$$VA0$K(B USENET $B$KN.$l$^$7$?!#(Banonymous ftp $B$G$b(B
X$BF~<j2DG=$G$9!#(B"rpc3" $B$H$$$&%-!<%o!<%I$G(B archie -s $B$7$F$_$F2<$5$$!#$J$*!"(B
Xv4.0 $B$H$$$&$b$N$b=P$F$$$k$h$&$G$9!#(B
X
X$B#2!!MW5a$4$H$N%W%m%;%9@8@.(B
X
X$BJ#?t$N%/%i%$%"%s%H$+$i$N=hM}$rF1;~$K=hM}$9$k$?$a$K!"$3$3$G$O%/%i%$%"%s(B
X$B%H$+$i$NMW5a$r<u$1$D$1$F%W%m%;%9$r@8@.$7$F$$$^$9!#6qBNE*$K$O!"(B
Xdir_proc_f.c $B$N(B readdir_1() $B$NCf$G!"(Bfork() $B$7$F$$$^$9!#(B
X
Xfork() $B$9$k$3$H$GLdBj$H$J$k$N$O!"?F%W%m%;%9$H;R%W%m%;%9$I$b$,N>J}$H$b(B 
X$B1s3V<jB3$-8F=P$7$N1~Ez$r9T$J$C$F$7$^$&$3$H$G$9!#$3$l$r;R$I$b$@$1$K$d$i(B
X$B$;$k$?$a$K!"<!$N$h$&$J$3$H$r$7$F$$$^$9!#(B
X
X----------------------------------------------------------------------
X(1) dir_svc_f.c:dirprog_1() $B$NCf$G!"(Bsetjmp() $B$r<B9T$7$F$*$-$^$9!#(B
X
X(2) dir_proc_f.c:readdir_1() $B$NCf$G!"(Bfork() $B$r<B9T$7$^$9!#(B
X
X(3) $B?F%W%m%;%9$NJ}$O!"(B(1) $B$N(B setjump() $B$N0LCV$K$b$I$j$^$9!#$=$7$F!"(B
Xdirprog_1() $B4X?t$+$i$J$K$b$7$J$$$G8F$S=P$7B&!J$*$=$i$/!"%i%$%V%i%j4X?t(B 
Xsvc_getreqset()$B!K$K$b$I$j$^$9!#?F%W%m%;%9$O!"0zB3$-B>$N%/%i%$%"%s%H$+(B
X$B$i$NMW5a$rBT$A$^$9!#(B
X
X(4) $B;R%W%m%;%9$O!"K\Mh$N(B readdir_1() $B$NK\BN$N<B9T$r9T$J$$$^$9!#(B
X
X(4) $B:G8e$K!"7k2L$r%/%i%$%"%s%H$KJV$9$?$a$K!"(Bsvc_sendreply() $B$r8F$S=P$7(B
X$B$^$9!#$3$3$G$O!"4JC1$N$?$a$K(B dirprog_1() $B$K$b$I$C$F8F$S=P$9$h$&$K$7$F(B
X$B$$$^$9!#(Bdirprog_1() $B$K$b$I$k$?$a$K$O!"(Blongjmp() $B$r;H$C$F$$$^$9!#(B
X
X(5) $B;R%W%m%;%9$G$O!"(Bdirprog_1() $B$N8F$S=P$7B&!J(Bsvc_getreqset()$B!K$K%j%?!<%s(B
X$B$9$k$N$G$O$J$/!"$=$N%W%m%;%9$r=*N;$7$^$9!#(B
X
X(6) $B;R%W%m%;%9$,=*N;$9$k$H!"?F%W%m%;%9$K3d$j9~$_$,$+$+$j$^$9!#?F%W%m%;(B
X$B%9$O(B wait() $B%7%9%F%`!&%3!<%k$rH/9T$7$F%>%s%S$r>C$7$^$9!#(B
X----------------------------------------------------------------------
X
X$B#3!!(Bdir_svc_f $B$N<B9T(B
X
X$B<B9T$9$k$K$O!"%&%#%s%I%&$r#2Kg3+$/$H$$$$$G$7$g$&!#0lJ}$N%&%$%s%I%&$G%5!<(B
X$B%P$r!"$b$&0lJ}$G%/%i%$%"%s%H$r<B9T$7$^$9!#(B
X
X$B$^$:!"%5!<%P$r<B9T$7$^$9!#(B
X
X$B%5!<%PB&!'(B
X----------------------------------------------------------------------
Xhost1% ./dir_svc_f
X----------------------------------------------------------------------
X
X$B$3$3$G!"%/%i%$%"%s%H$,$o$G(B rls $B$r<B9T$7$^$9!#!JF1$8%[%9%H$G<B9T$7$F$b(B
X$B$b$+$^$$$^$;$s!#!K(B
X
X$B%/%i%$%"%s%HB&!'(B
X----------------------------------------------------------------------
Xhost2% rls host1 /
X----------------------------------------------------------------------
X
X$B$9$k$H!"%/%i%$%"%s%HB&$N2hLL$K!"(Bhost1 $B$N(B / $B%G%#%l%/%H%j$NFbMF$,I=<($5(B
X$B$l$k$G$7$g$&!#(B
X
X----------------------------------------------------------------------
Xhost2% rls host1 /
X.
X..
Xlost+found
Xusr
Xpcfs
Xexport
Xetc
Xtmp
Xvar
X....
X----------------------------------------------------------------------
X
X$B$3$N;~!"%5!<%PB&$K!"%G%P%C%0$h$&$N<!$N$h$&$J%a%C%;!<%8$,I=<($5$l$k$G$7$g$&!#(B
X
X$B%5!<%PB&!'(B
X----------------------------------------------------------------------
Xhost1% ./dir_svc_f
Xchild:readdir_1() body
Xparent:readdir_1() longjump(,1)
Xparent:dirprog_1() return from longjmp(,1), return
Xchild:readdir_1() longjmp(,&res)
Xchild:dirprog_1() return from longjmp(,1), reply
Xchild:dirprog_1() exit()
X----------------------------------------------------------------------
X
X$B?F$H;R$I$bI=<($O!"%0%A%c%0%A%c$K$J$k2DG=@-$,9b$$$G$9!#$=$l$O!"?F;R4V$G(B
X$BF14|$r$H$C$F$$$J$$$+$i$G$9!#6&M-%a%b%j7?%^%k%A%W%m%;%C%5$G$O!"K\Ev$KJB(B
X$BNs$K<B9T$5$l$k2DG=@-$b$"$j$^$9!#(B
X
X$B$3$l$+$i!"?F$O$G$O!"(Breaddir_1() $B$+$i2?$b$7$J$$$G(B longjmp() $B$G(B 
Xdirprog_1() $B$K$b$I$C$F$$$k$3$H$,$o$+$j$^$9!#$5$i$K!"?F$O!"(Bdirprog_1() 
X$B$+$i$b$J$K$b$7$J$$$G8F$S=P$7B&$K$b$I$C$F$$$^$9!#;R$I$b$O!"(Breaddir_1() 
X$B$NK\BN$r<B9T$7$?$"$H!"(Bdirprog_1() $B$K(B longjmp() $B$G$b$I$C$F$$$^$9!#$=$7$F!"(B
X$B1s3V<jB3$-8F=P$7$N(B reply $B$r$7$F=*N;$7$F$$$^$9!#(B
X
X
X$B#4!!$=$NB>$N%R%s%H(B
X
X$B$3$NNc$G$O!"<jB3$-$4$H$K(B fork() $B$9$k$N$+$7$J$$$N$+$rA*$Y$k$h$&$K$H$$$&(B
X$B$3$H$G!"$=$N$J$+$G(B fork() $B$r8F$S=P$7$F$$$^$9!#$b$7!"$9$Y$F$N<jB3$-$G(B 
Xfork() $B$7$F$b$$$$$H$$$&$3$H$J$i$P!"(Bdir_svc_f.c:dirprog_1() $B$NF~8}$G(B 
Xfork() $B$7$F!"?F$O$=$N$^$^%j%?!<%s$9$k$h$&$K$9$l$P!"$$$$$H;W$$$^$9!#(B
X
X$B$9$Y$F$N<jB3$-$G(B fork() $B$7$F$b$+$^$o$J$$>l9g!"(Bdirprog_1() $B$N$h$&$K8D!9(B
X$B$N%W%m%0%i%`$K<j$rF~$l$k$N$G$O$J$/!"(Bsvc_run(), svc_getreqset() $B$J$I$N(B
X$B%i%$%V%i%j4X?t$K<j$rF~$l$kJ}K!$b$"$j$^$9!#$=$&$9$k$H!"$b$H$b$H$N(B RPC 
X$B$N%W%m%0%i%`$r=q$-49$($kI,MW$O$J$/$J$k$H;W$$$^$9!#(B
X
Xfork() $B$7$?%W%m%;%9F1;N$GF14|$r<h$C$?$j%G!<%?$r8r49$7$?$j$9$kI,MW$,=P(B
X$B$F$/$k$+$b$7$l$^$;$s!#$=$N;~$O!"%W%m%;%94V$NF14|!&DL?.$,I,MW$K$J$j$^$9!#(B
X$B#S#u#n$N>l9g!"(B/dev/zero $B$r(B mmap(2) $B$9$k$3$H$G!"%W%m%;%94V6&M-%a%b%j$r(B
X$B:n$k$3$H$,$G$-$^$9!#$=$l$rMxMQ$7$F!"%W%m%;%94V$NF14|!&DL?.$r9T$J$&$3$H(B
X$B$b$G$-$k$G$7$g$&!#(B
X
X
X$B#5!!Cm0U(B
X
X$BLdBjE@$H$7$F$O!"(Brpcgen $B$G@8@.$7$?%W%m%0%i%`$rJQ99$7$J$1$l$P$J$i$J$$$3(B
X$B$H$,$"$j$^$9!#5$$r$D$1$F2<$5$$!#(B
X
X$B$=$l$G$O!"$*3Z$7$_$/$@$5$$!#(B
X
X$B!@!@!!?7>k!!Lw!!!J$7$s$8$g$&!!$d$9$7!K!!!@!@(B
X$B!@!@!!N05eBg3X!!>pJs9)3X!!!!!!!!!!!!!!!!!@!@(B
END_OF_FILE
if test 6298 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(685 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X#
X# @(#)Makefile1.3 87/11/30 3.9 RPCSRC
X#
XBIN = dir_svc rls dir_svc_f
XGEN = dir_clnt.c dir_svc.c dir_xdr.c dir.h
X#LIB = -lrpclib
XLIB =
XRPCCOM = rpcgen
X
Xall: $(BIN)
X
X$(GEN): dir.x
X$(RPCCOM) dir.x
X
Xdir_svc: dir_proc.o dir_svc.o dir_xdr.o
X$(CC) -o $@ dir_proc.o dir_svc.o dir_xdr.o $(LIB)
X
Xdir_svc_f: dir_proc_f.o dir_svc_f.o dir_xdr.o
X$(CC) -o $@ dir_proc_f.o dir_svc_f.o dir_xdr.o $(LIB)
X
Xrls: rls.o dir_clnt.o dir_xdr.o
X$(CC) -o $@ rls.o dir_clnt.o dir_xdr.o $(LIB)
X
Xrls.o: rls.c dir.h
X
Xdir_proc.o: dir_proc.c dir.h
X
Xclean cleanup:
Xrm -f $(GEN) *.o $(BIN)
X
Xsrcs = dir.x dir_clnt.c dir_proc.c dir_proc_f.c dir_svc_f.c rls.c
Xshar:
Xshar README Makefile $(srcs) > rpc-dir-fork.shar
END_OF_FILE
if test 685 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'dir.x' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dir.x'\"
else
echo shar: Extracting \"'dir.x'\" \(780 characters\)
sed "s/^X//" >'dir.x' <<'END_OF_FILE'
X/* @(#)dir.x1.1 87/11/04 3.9 RPCSRC */
X/*
X * dir.x: Remote directory listing protocol
X */
Xconst MAXNAMELEN = 255;/* maximum length of a directory entry */
X
Xtypedef string nametype<MAXNAMELEN>;/* a directory entry */
X
Xtypedef struct namenode *namelist;/* a link in the listing */
X
X/*
X * A node in the directory listing
X */
Xstruct namenode {
Xnametype name;/* name of directory entry */
Xnamelist next;/* next entry */
X};
X
X/*
X * The result of a READDIR operation.
X */
Xunion readdir_res switch (int errno) {
Xcase 0:
Xnamelist list;/* no error: return directory listing */
Xdefault:
Xvoid;/* error occurred: nothing else to return */
X};
X
X/*
X * The directory program definition
X */
Xprogram DIRPROG {
Xversion DIRVERS {
Xreaddir_res
XREADDIR(nametype) = 1;
X} = 1;
X} = 76;
END_OF_FILE
if test 780 -ne `wc -c <'dir.x'`; then
    echo shar: \"'dir.x'\" unpacked with wrong size!
fi
# end of 'dir.x'
fi
if test -f 'dir_clnt.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dir_clnt.c'\"
else
echo shar: Extracting \"'dir_clnt.c'\" \(485 characters\)
sed "s/^X//" >'dir_clnt.c' <<'END_OF_FILE'
X/*
X * Please do not edit this file.
X * It was generated using rpcgen.
X */
X
X#include <rpc/rpc.h>
X#include "dir.h"
X
X/* Default timeout can be changed using clnt_control() */
Xstatic struct timeval TIMEOUT = { 25, 0 };
X
Xreaddir_res *
Xreaddir_1(argp, clnt)
Xnametype *argp;
XCLIENT *clnt;
X{
Xstatic readdir_res res;
X
Xbzero((char *)&res, sizeof(res));
Xif (clnt_call(clnt, READDIR, xdr_nametype, argp, xdr_readdir_res, &res, TIMEOUT) != RPC_SUCCESS) {
Xreturn (NULL);
X}
Xreturn (&res);
X}
END_OF_FILE
if test 485 -ne `wc -c <'dir_clnt.c'`; then
    echo shar: \"'dir_clnt.c'\" unpacked with wrong size!
fi
# end of 'dir_clnt.c'
fi
if test -f 'dir_proc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dir_proc.c'\"
else
echo shar: Extracting \"'dir_proc.c'\" \(919 characters\)
sed "s/^X//" >'dir_proc.c' <<'END_OF_FILE'
X/* @(#)dir_proc.c1.3 87/11/16 3.9 RPCSRC */
X/*
X * dir_proc.c: remote readdir implementation
X */
X#include <rpc/rpc.h>
X#include <sys/dir.h>
X#include "dir.h"
X
Xextern int errno;
Xextern char *malloc();
Xextern char *strcpy();
X
Xreaddir_res *
Xreaddir_1(dirname)
Xnametype *dirname;
X{
XDIR *dirp;
Xstruct direct *d;
Xnamelist nl;
Xnamelist *nlp;
Xstatic readdir_res res; /* must be static! */
X
X/*
X * Open directory
X */
Xdirp = opendir(*dirname);
Xif (dirp == NULL) {
Xres.errno = errno;
Xreturn (&res);
X}
X
X/*
X * Free previous result
X */
Xxdr_free(xdr_readdir_res, &res);
X
X/*
X * Collect directory entries
X */
Xnlp = &res.readdir_res_u.list;
Xwhile (d = readdir(dirp)) {
Xnl = *nlp = (namenode *) malloc(sizeof(namenode));
Xnl->name = malloc(strlen(d->d_name)+1);
Xstrcpy(nl->name, d->d_name);
Xnlp = &nl->next;
X}
X*nlp = NULL;
X
X/*
X * Return the result
X */
Xres.errno = 0;
Xclosedir(dirp);
Xreturn (&res);
X}
END_OF_FILE
if test 919 -ne `wc -c <'dir_proc.c'`; then
    echo shar: \"'dir_proc.c'\" unpacked with wrong size!
fi
# end of 'dir_proc.c'
fi
if test -f 'dir_proc_f.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dir_proc_f.c'\"
else
echo shar: Extracting \"'dir_proc_f.c'\" \(1460 characters\)
sed "s/^X//" >'dir_proc_f.c' <<'END_OF_FILE'
X/* @(#)dir_proc.c1.3 87/11/16 3.9 RPCSRC */
X/*
X * dir_proc_f.c: remote readdir implementation with fork()
X */
X#include <rpc/rpc.h>
X#include <sys/dir.h>
X#include "dir.h"
X
X#include <setjmp.h>
X
Xexternjmp_bufdirprog_1_env ;/* dir_svc_f.c */
X
Xextern int errno;
Xextern char *malloc();
Xextern char *strcpy();
X
Xreaddir_res *
Xreaddir_1(dirname)
Xnametype *dirname;
X{
XDIR *dirp;
Xstruct direct *d;
Xnamelist nl;
Xnamelist *nlp;
Xstatic readdir_res res; /* must be static! */
X
Xswitch( fork() )
X{
Xcase -1:  /* error */
X    res.errno = errno ;
X    return( &res );
Xdefault: /* parent */
X    printf("parent:readdir_1() longjump(,1)\n");
X    longjmp( &dirprog_1_env,1 );
X    printf("parent:return from longjump(,1)\n");
X    exit( 1 );
X    /* not reached */
Xcase 0:  /* child */
X    printf("child:readdir_1() body\n");
X    break;
X}
X
X/*
X * Open directory
X */
Xdirp = opendir(*dirname);
Xif (dirp == NULL) {
Xres.errno = errno;
Xreturn (&res);
X}
X
X/*
X * Free previous result
X */
Xxdr_free(xdr_readdir_res, &res);
X
X/*
X * Collect directory entries
X */
Xnlp = &res.readdir_res_u.list;
Xwhile (d = readdir(dirp)) {
Xnl = *nlp = (namenode *) malloc(sizeof(namenode));
Xnl->name = malloc(strlen(d->d_name)+1);
Xstrcpy(nl->name, d->d_name);
Xnlp = &nl->next;
X}
X*nlp = NULL;
X
X/*
X * Return the result
X */
Xres.errno = 0;
Xclosedir(dirp);
X/*return (&res);*/
X        printf("child:readdir_1() longjmp(,&res)\n");
Xlongjmp( &dirprog_1_env,&res );
X}
END_OF_FILE
if test 1460 -ne `wc -c <'dir_proc_f.c'`; then
    echo shar: \"'dir_proc_f.c'\" unpacked with wrong size!
fi
# end of 'dir_proc_f.c'
fi
if test -f 'dir_svc_f.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dir_svc_f.c'\"
else
echo shar: Extracting \"'dir_svc_f.c'\" \(2502 characters\)
sed "s/^X//" >'dir_svc_f.c' <<'END_OF_FILE'
X
X#include <stdio.h>
X#include <rpc/rpc.h>
X#include <signal.h>
X#include "dir.h"
X
Xstatic void dirprog_1();
Xstatic void intr_child();
X
Xmain()
X{
Xregister SVCXPRT *transp;
X
X(void) pmap_unset(DIRPROG, DIRVERS);
X
Xtransp = svcudp_create(RPC_ANYSOCK);
Xif (transp == NULL) {
Xfprintf(stderr, "cannot create udp service.");
Xexit(1);
X}
Xif (!svc_register(transp, DIRPROG, DIRVERS, dirprog_1, IPPROTO_UDP)) {
Xfprintf(stderr, "unable to register (DIRPROG, DIRVERS, udp).");
Xexit(1);
X}
X
Xtransp = svctcp_create(RPC_ANYSOCK, 0, 0);
Xif (transp == NULL) {
Xfprintf(stderr, "cannot create tcp service.");
Xexit(1);
X}
Xif (!svc_register(transp, DIRPROG, DIRVERS, dirprog_1, IPPROTO_TCP)) {
Xfprintf(stderr, "unable to register (DIRPROG, DIRVERS, tcp).");
Xexit(1);
X}
X
Xsignal( SIGCHLD,intr_child );
X
Xsvc_run();
Xfprintf(stderr, "svc_run returned");
Xexit(1);
X/* NOTREACHED */
X}
X
X#include <setjmp.h>
X
Xjmp_bufdirprog_1_env ;
X
Xstatic void
Xdirprog_1(rqstp, transp)
Xstruct svc_req *rqstp;
Xregister SVCXPRT *transp;
X{
Xunion {
Xnametype readdir_1_arg;
X} argument;
Xchar *result;
Xbool_t (*xdr_argument)(), (*xdr_result)();
Xchar *(*local)();
X
Xresult = (char *)setjmp( &dirprog_1_env );
Xswitch( (int) result )
X{
Xcase 0:/* normal call */
X    break;
Xcase 1: /* return from parent */
X    printf("parent:dirprog_1() return from longjmp(,1), return\n");
X    return;
Xdefault: /* return from child */
X    printf("child:dirprog_1() return from longjmp(,1), reply\n");
X    if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
X    svcerr_systemerr(transp);
X    }
X    if (!svc_freeargs(transp, xdr_argument, &argument)) {
X    fprintf(stderr, "unable to free arguments");
X    exit(1);
X    }
X    printf("child:dirprog_1() exit()\n");
X    exit( 0 );
X}
X
Xswitch (rqstp->rq_proc) {
Xcase NULLPROC:
X(void) svc_sendreply(transp, xdr_void, (char *)NULL);
Xreturn;
X
Xcase READDIR:
Xxdr_argument = xdr_nametype;
Xxdr_result = xdr_readdir_res;
Xlocal = (char *(*)()) readdir_1;
Xbreak;
X
Xdefault:
Xsvcerr_noproc(transp);
Xreturn;
X}
Xbzero((char *)&argument, sizeof(argument));
Xif (!svc_getargs(transp, xdr_argument, &argument)) {
Xsvcerr_decode(transp);
Xreturn;
X}
Xresult = (*local)(&argument, rqstp);
Xif (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
Xsvcerr_systemerr(transp);
X}
Xif (!svc_freeargs(transp, xdr_argument, &argument)) {
Xfprintf(stderr, "unable to free arguments");
Xexit(1);
X}
Xreturn;
X}
X
Xstatic void intr_child()
X{
Xwait( 0 );
X}
END_OF_FILE
if test 2502 -ne `wc -c <'dir_svc_f.c'`; then
    echo shar: \"'dir_svc_f.c'\" unpacked with wrong size!
fi
# end of 'dir_svc_f.c'
fi
if test -f 'rls.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rls.c'\"
else
echo shar: Extracting \"'rls.c'\" \(1611 characters\)
sed "s/^X//" >'rls.c' <<'END_OF_FILE'
X/* @(#)rls.c1.1 87/11/04 3.9 RPCSRC */
X/*
X * rls.c: Remote directory listing client
X */
X#include <stdio.h>
X#include <rpc/rpc.h>/* always need this */
X#include "dir.h"/* need this too: will be generated by rpcgen*/
X
Xextern int errno;
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
XCLIENT *cl;
Xchar *server;
Xchar *dir;
Xreaddir_res *result;
Xnamelist nl;
X
X
Xif (argc != 3) {
Xfprintf(stderr, "usage: %s host directory\n", argv[0]);
Xexit(1);
X}
X
X/*
X * Remember what our command line arguments refer to
X */
Xserver = argv[1];
Xdir = argv[2];
X
X/*
X * Create client "handle" used for calling MESSAGEPROG on the
X * server designated on the command line. We tell the rpc package
X * to use the "tcp" protocol when contacting the server.
X */
Xcl = clnt_create(server, DIRPROG, DIRVERS, "tcp");
Xif (cl == NULL) {
X/*
X * Couldn't establish connection with server.
X * Print error message and die.
X */
Xclnt_pcreateerror(server);
Xexit(1);
X}
X
X/*
X * Call the remote procedure "readdir" on the server
X */
Xresult = readdir_1(&dir, cl);
Xif (result == NULL) {
X/*
X * An error occurred while calling the server. 
X  * Print error message and die.
X */
Xclnt_perror(cl, server);
Xexit(1);
X}
X
X/*
X * Okay, we successfully called the remote procedure.
X */
Xif (result->errno != 0) {
X/*
X * A remote system error occurred.
X * Print error message and die.
X */
Xerrno = result->errno;
Xperror(dir);
Xexit(1);
X}
X
X/*
X * Successfuly got a directory listing.
X * Print it out.
X */
Xfor (nl = result->readdir_res_u.list; nl != NULL; nl = nl->next) {
Xprintf("%s\n", nl->name);
X}
X}
END_OF_FILE
if test 1611 -ne `wc -c <'rls.c'`; then
    echo shar: \"'rls.c'\" unpacked with wrong size!
fi
# end of 'rls.c'
fi
echo shar: End of shell archive.
exit 0
