home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume41 / wwfs / part16 < prev    next >
Text File  |  1994-01-17  |  91KB  |  3,586 lines

  1. Newsgroups: comp.sources.misc
  2. From: youki-k@is.aist-nara.ac.jp (Youki Kadobayashi)
  3. Subject: v41i101:  wwfs - WorldWide File System, Part16/22
  4. Message-ID: <1994Jan17.202441.20352@sparky.sterling.com>
  5. X-Md4-Signature: 73dde9757a235b3572248fd7a4c8f345
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Nara Institute of Science and Technology, Japan
  8. Date: Mon, 17 Jan 1994 20:24:41 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: youki-k@is.aist-nara.ac.jp (Youki Kadobayashi)
  12. Posting-number: Volume 41, Issue 101
  13. Archive-name: wwfs/part16
  14. Environment: UNIX, inet
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then feed it
  18. # into a shell via "sh file" or similar.  To overwrite existing files,
  19. # type "sh file -c".
  20. # Contents:  config/misc_rpc.c config/os-aix3.h config/os-bsd386.h
  21. #   csd/acc.c csd/bfs.c csd/callout.c csd/cs.c csd/icmp.c csd/log.c
  22. #   libmm/libmm.pl mosaic/dirutil.pl rpc/cs_prot.x rpc/nfs_prot.h
  23. #   rpc/nfs_prot_clnt.c wwmount/wwumount.c
  24. # Wrapped by kent@sparky on Sun Jan 16 17:48:37 1994
  25. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  26. echo If this archive is complete, you will see the following message:
  27. echo '          "shar: End of archive 16 (of 22)."'
  28. if test -f 'config/misc_rpc.c' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'config/misc_rpc.c'\"
  30. else
  31.   echo shar: Extracting \"'config/misc_rpc.c'\" \(5154 characters\)
  32.   sed "s/^X//" >'config/misc_rpc.c' <<'END_OF_FILE'
  33. X/*
  34. X * extracted from amd5.3b1/misc_rpc.c
  35. X * I think neither 'amd' copyright nor WWFS copyright apply.
  36. X */
  37. X
  38. X#include "am.h"
  39. X
  40. X/*
  41. X * Early RPC seems to be missing these..
  42. X * Extracted from the RPC 3.9 sources as indicated
  43. X */
  44. X
  45. X#ifdef NEED_XDR_POINTER
  46. X/* @(#)xdr_reference.c    1.1 87/11/04 3.9 RPCSRC */
  47. X/*
  48. X * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  49. X * unrestricted use provided that this legend is included on all tape
  50. X * media and as a part of the software program in whole or part.  Users
  51. X * may copy or modify Sun RPC without charge, but are not authorized
  52. X * to license or distribute it to anyone else except as part of a product or
  53. X * program developed by the user.
  54. X * 
  55. X * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  56. X * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  57. X * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  58. X * 
  59. X * Sun RPC is provided with no support and without any obligation on the
  60. X * part of Sun Microsystems, Inc. to assist in its use, correction,
  61. X * modification or enhancement.
  62. X * 
  63. X * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  64. X * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  65. X * OR ANY PART THEREOF.
  66. X * 
  67. X * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  68. X * or profits or other special, indirect and consequential damages, even if
  69. X * Sun has been advised of the possibility of such damages.
  70. X * 
  71. X * Sun Microsystems, Inc.
  72. X * 2550 Garcia Avenue
  73. X * Mountain View, California  94043
  74. X */
  75. X
  76. X
  77. X/*
  78. X * xdr_pointer():
  79. X *
  80. X * XDR a pointer to a possibly recursive data structure. This
  81. X * differs with xdr_reference in that it can serialize/deserialiaze
  82. X * trees correctly.
  83. X *
  84. X *  What's sent is actually a union:
  85. X *
  86. X *  union object_pointer switch (boolean b) {
  87. X *  case TRUE: object_data data;
  88. X *  case FALSE: void nothing;
  89. X *  }
  90. X *
  91. X * > objpp: Pointer to the pointer to the object.
  92. X * > obj_size: size of the object.
  93. X * > xdr_obj: routine to XDR an object.
  94. X *
  95. X */
  96. Xbool_t
  97. Xxdr_pointer(xdrs,objpp,obj_size,xdr_obj)
  98. X    register XDR *xdrs;
  99. X    char **objpp;
  100. X    u_int obj_size;
  101. X    xdrproc_t xdr_obj;
  102. X{
  103. X
  104. X    bool_t more_data;
  105. X
  106. X    more_data = (*objpp != NULL);
  107. X    if (! xdr_bool(xdrs,&more_data)) {
  108. X        return (FALSE);
  109. X    }
  110. X    if (! more_data) {
  111. X        *objpp = NULL;
  112. X        return (TRUE);
  113. X    }
  114. X    return (xdr_reference(xdrs,objpp,obj_size,xdr_obj));
  115. X}
  116. X#endif /* NEED_XDR_POINTER */
  117. X
  118. X#ifdef NEED_CLNT_SPERRNO
  119. X/* @(#)clnt_perror.c    1.1 87/11/04 3.9 RPCSRC */
  120. X/*
  121. X * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  122. X * unrestricted use provided that this legend is included on all tape
  123. X * media and as a part of the software program in whole or part.  Users
  124. X * may copy or modify Sun RPC without charge, but are not authorized
  125. X * to license or distribute it to anyone else except as part of a product or
  126. X * program developed by the user.
  127. X * 
  128. X * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  129. X * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  130. X * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  131. X * 
  132. X * Sun RPC is provided with no support and without any obligation on the
  133. X * part of Sun Microsystems, Inc. to assist in its use, correction,
  134. X * modification or enhancement.
  135. X * 
  136. X * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  137. X * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  138. X * OR ANY PART THEREOF.
  139. X * 
  140. X * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  141. X * or profits or other special, indirect and consequential damages, even if
  142. X * Sun has been advised of the possibility of such damages.
  143. X * 
  144. X * Sun Microsystems, Inc.
  145. X * 2550 Garcia Avenue
  146. X * Mountain View, California  94043
  147. X */
  148. X
  149. Xstruct rpc_errtab {
  150. X    enum clnt_stat status;
  151. X    char *message;
  152. X};
  153. X
  154. Xstatic struct rpc_errtab  rpc_errlist[] = {
  155. X    { RPC_SUCCESS, 
  156. X        "RPC: Success" }, 
  157. X    { RPC_CANTENCODEARGS, 
  158. X        "RPC: Can't encode arguments" },
  159. X    { RPC_CANTDECODERES, 
  160. X        "RPC: Can't decode result" },
  161. X    { RPC_CANTSEND, 
  162. X        "RPC: Unable to send" },
  163. X    { RPC_CANTRECV, 
  164. X        "RPC: Unable to receive" },
  165. X    { RPC_TIMEDOUT, 
  166. X        "RPC: Timed out" },
  167. X    { RPC_VERSMISMATCH, 
  168. X        "RPC: Incompatible versions of RPC" },
  169. X    { RPC_AUTHERROR, 
  170. X        "RPC: Authentication error" },
  171. X    { RPC_PROGUNAVAIL, 
  172. X        "RPC: Program unavailable" },
  173. X    { RPC_PROGVERSMISMATCH, 
  174. X        "RPC: Program/version mismatch" },
  175. X    { RPC_PROCUNAVAIL, 
  176. X        "RPC: Procedure unavailable" },
  177. X    { RPC_CANTDECODEARGS, 
  178. X        "RPC: Server can't decode arguments" },
  179. X    { RPC_SYSTEMERROR, 
  180. X        "RPC: Remote system error" },
  181. X    { RPC_UNKNOWNHOST, 
  182. X        "RPC: Unknown host" },
  183. X/*    { RPC_UNKNOWNPROTO,
  184. X        "RPC: Unknown protocol" },*/
  185. X    { RPC_PMAPFAILURE, 
  186. X        "RPC: Port mapper failure" },
  187. X    { RPC_PROGNOTREGISTERED, 
  188. X        "RPC: Program not registered"},
  189. X    { RPC_FAILED, 
  190. X        "RPC: Failed (unspecified error)"}
  191. X};
  192. X
  193. X
  194. X/*
  195. X * This interface for use by clntrpc
  196. X */
  197. Xchar *
  198. Xclnt_sperrno(stat)
  199. X    enum clnt_stat stat;
  200. X{
  201. X    int i;
  202. X
  203. X    for (i = 0; i < sizeof(rpc_errlist)/sizeof(struct rpc_errtab); i++) {
  204. X        if (rpc_errlist[i].status == stat) {
  205. X            return (rpc_errlist[i].message);
  206. X        }
  207. X    }
  208. X    return ("RPC: (unknown error code)");
  209. X}
  210. X
  211. X#endif /* NEED_CLNT_SPERRNO */
  212. END_OF_FILE
  213.   if test 5154 -ne `wc -c <'config/misc_rpc.c'`; then
  214.     echo shar: \"'config/misc_rpc.c'\" unpacked with wrong size!
  215.   fi
  216.   # end of 'config/misc_rpc.c'
  217. fi
  218. if test -f 'config/os-aix3.h' -a "${1}" != "-c" ; then 
  219.   echo shar: Will not clobber existing file \"'config/os-aix3.h'\"
  220. else
  221.   echo shar: Extracting \"'config/os-aix3.h'\" \(5183 characters\)
  222.   sed "s/^X//" >'config/os-aix3.h' <<'END_OF_FILE'
  223. X/*
  224. X * Copyright (c) 1990 Jan-Simon Pendry
  225. X * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
  226. X * Copyright (c) 1990 The Regents of the University of California.
  227. X * All rights reserved.
  228. X *
  229. X * This code is derived from software contributed to Berkeley by
  230. X * Jan-Simon Pendry at Imperial College, London.
  231. X *
  232. X * Redistribution and use in source and binary forms, with or without
  233. X * modification, are permitted provided that the following conditions
  234. X * are met:
  235. X * 1. Redistributions of source code must retain the above copyright
  236. X *    notice, this list of conditions and the following disclaimer.
  237. X * 2. Redistributions in binary form must reproduce the above copyright
  238. X *    notice, this list of conditions and the following disclaimer in the
  239. X *    documentation and/or other materials provided with the distribution.
  240. X * 3. All advertising materials mentioning features or use of this software
  241. X *    must display the following acknowledgement:
  242. X *      This product includes software developed by the University of
  243. X *      California, Berkeley and its contributors.
  244. X * 4. Neither the name of the University nor the names of its contributors
  245. X *    may be used to endorse or promote products derived from this software
  246. X *    without specific prior written permission.
  247. X *
  248. X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  249. X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  250. X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  251. X * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  252. X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  253. X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  254. X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  255. X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  256. X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  257. X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  258. X * SUCH DAMAGE.
  259. X *
  260. X *    %W% (Berkeley) %G%
  261. X *
  262. X * $Id: os-aix3.h,v 5.2.2.2 1992/05/31 16:38:49 jsp Exp $
  263. X *
  264. X * AIX 3.1 definitions for Amd (automounter)
  265. X */
  266. X
  267. X/*
  268. X * Does the compiler grok void *
  269. X */
  270. X#define    VOIDP
  271. X
  272. X/*
  273. X * Which version of the Sun RPC library we are using
  274. X * This is the implementation release number, not
  275. X * the protocol revision number.
  276. X */
  277. X#define    RPC_4
  278. X
  279. X/*
  280. X * Which version of the NFS interface are we using.
  281. X * This is the implementation release number, not
  282. X * the protocol revision number.
  283. X */
  284. X#define    NFS_AIX3
  285. X
  286. X/*
  287. X * Does this OS have NDBM support?
  288. X */
  289. X#define OS_HAS_NDBM
  290. X
  291. X/*
  292. X * The mount table is obtained from the kernel
  293. X */
  294. X#undef    UPDATE_MTAB
  295. X
  296. X/*
  297. X * Pick up BSD bits from include files
  298. X * Try for 4.4 compatibility if available (AIX 3.2 and later)
  299. X */
  300. X#define    _BSD 44
  301. X
  302. X/*
  303. X * No mntent info on AIX 3
  304. X */
  305. X#undef    MNTENT_HDR
  306. X#define    MNTENT_HDR <sys/mntctl.h>
  307. X
  308. X/*
  309. X * Name of filesystem types
  310. X */
  311. X#define    MOUNT_TYPE_NFS    MNT_NFS
  312. X#define    MOUNT_TYPE_UFS    MNT_JFS
  313. X#undef MTAB_TYPE_UFS
  314. X#define    MTAB_TYPE_UFS    "jfs"
  315. X
  316. X/*
  317. X * How to unmount filesystems
  318. X */
  319. X#undef MOUNT_TRAP
  320. X#define    MOUNT_TRAP(type, mnt, flag, mnt_data) \
  321. X    aix3_mount(mnt->mnt_fsname, mnt->mnt_dir, flag, type, mnt_data, mnt->mnt_opts)
  322. X#undef    UNMOUNT_TRAP
  323. X#define    UNMOUNT_TRAP(mnt)    uvmount(mnt->mnt_passno, 0)
  324. X
  325. X
  326. X/*
  327. X * Byte ordering
  328. X */
  329. X#ifndef BYTE_ORDER
  330. X#include <sys/machine.h>
  331. X#endif /* BYTE_ORDER */
  332. X
  333. X#undef ARCH_ENDIAN
  334. X#if BYTE_ORDER == LITTLE_ENDIAN
  335. X#define ARCH_ENDIAN "little"
  336. X#else
  337. X#if BYTE_ORDER == BIG_ENDIAN
  338. X#define ARCH_ENDIAN "big"
  339. X#else
  340. XXXX - Probably no hope of running Amd on this machine!
  341. X#endif /* BIG */
  342. X#endif /* LITTLE */
  343. X
  344. X/*
  345. X * Miscellaneous AIX 3 bits
  346. X */
  347. X#define    NEED_MNTOPT_PARSER
  348. X#define    SHORT_MOUNT_NAME
  349. X
  350. X#define    MNTMAXSTR       128
  351. X
  352. X#define    MNTTYPE_UFS    "jfs"        /* Un*x file system */
  353. X#define    MNTTYPE_NFS    "nfs"        /* network file system */
  354. X#define    MNTTYPE_IGNORE    "ignore"    /* No type specified, ignore this entry */
  355. X
  356. Xstruct mntent {
  357. X    char    *mnt_fsname;    /* name of mounted file system */
  358. X    char    *mnt_dir;    /* file system path prefix */
  359. X    char    *mnt_type;    /* MNTTYPE_* */
  360. X    char    *mnt_opts;    /* MNTOPT* */
  361. X    int    mnt_freq;    /* dump frequency, in days */
  362. X    int    mnt_passno;    /* pass number on parallel fsck */
  363. X};
  364. X
  365. X#define    NFS_HDR "misc-aix3.h"
  366. X#define    UFS_HDR "misc-aix3.h"
  367. X#undef NFS_FH_DREF
  368. X#define    NFS_FH_DREF(dst, src) { (dst) = *(src); }
  369. X#undef NFS_SA_DREF
  370. X#define    NFS_SA_DREF(dst, src) { (dst).addr = *(src); }
  371. X#define    M_RDONLY MNT_READONLY
  372. X
  373. X/*
  374. X * How to get a mount list
  375. X */
  376. X#undef    READ_MTAB_FROM_FILE
  377. X#define    READ_MTAB_AIX3_STYLE
  378. X
  379. X/*
  380. X * The data for the mount syscall needs the path in addition to the
  381. X * host name since that is the only source of information about the
  382. X * mounted filesystem.
  383. X#define    NFS_ARGS_NEEDS_PATH
  384. X */
  385. X
  386. X#define    NFS_LOMAP    34
  387. X#define    NFS_HIMAP    99
  388. X#define NFS_ERROR_MAPPING \
  389. Xstatic nfs_errormap[] = {         0,75,77,99,99,99, \
  390. X            99,99,99,99,99,78,99,99,99,79, \
  391. X            99,99,70,99,35,36,37,38,39,40, \
  392. X            41,42,43,44,45,46,47,48,49,50, \
  393. X            51,52,53,54,55,56,57,58,60,61, \
  394. X            64,65,99,67,68,62,63,66,69,68, \
  395. X            99,99,99,71,99,99,99,99,99,99 \
  396. X            };
  397. X
  398. X#define    MOUNT_HELPER_SOURCE "mount_aix.c"
  399. X
  400. X/*
  401. X * Need this too
  402. X */
  403. X#include <time.h>
  404. END_OF_FILE
  405.   if test 5183 -ne `wc -c <'config/os-aix3.h'`; then
  406.     echo shar: \"'config/os-aix3.h'\" unpacked with wrong size!
  407.   fi
  408.   # end of 'config/os-aix3.h'
  409. fi
  410. if test -f 'config/os-bsd386.h' -a "${1}" != "-c" ; then 
  411.   echo shar: Will not clobber existing file \"'config/os-bsd386.h'\"
  412. else
  413.   echo shar: Extracting \"'config/os-bsd386.h'\" \(5150 characters\)
  414.   sed "s/^X//" >'config/os-bsd386.h' <<'END_OF_FILE'
  415. X/*
  416. X * Copyright (c) 1990 Jan-Simon Pendry
  417. X * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
  418. X * Copyright (c) 1990 The Regents of the University of California.
  419. X * All rights reserved.
  420. X *
  421. X * This code is derived from software contributed to Berkeley by
  422. X * Jan-Simon Pendry at Imperial College, London.
  423. X *
  424. X * Redistribution and use in source and binary forms, with or without
  425. X * modification, are permitted provided that the following conditions
  426. X * are met:
  427. X * 1. Redistributions of source code must retain the above copyright
  428. X *    notice, this list of conditions and the following disclaimer.
  429. X * 2. Redistributions in binary form must reproduce the above copyright
  430. X *    notice, this list of conditions and the following disclaimer in the
  431. X *    documentation and/or other materials provided with the distribution.
  432. X * 3. All advertising materials mentioning features or use of this software
  433. X *    must display the following acknowledgement:
  434. X *      This product includes software developed by the University of
  435. X *      California, Berkeley and its contributors.
  436. X * 4. Neither the name of the University nor the names of its contributors
  437. X *    may be used to endorse or promote products derived from this software
  438. X *    without specific prior written permission.
  439. X *
  440. X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  441. X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  442. X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  443. X * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  444. X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  445. X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  446. X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  447. X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  448. X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  449. X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  450. X * SUCH DAMAGE.
  451. X *
  452. X *    %W% (Berkeley) %G%
  453. X *
  454. X * $Id: os-bsd44.h,v 5.2.2.1 1992/02/09 15:10:11 jsp beta $
  455. X *
  456. X * BSD/386 (and possibly other NET2 derivatives) definitions for Amd
  457. X */
  458. X
  459. X/*
  460. X * Does the compiler grok void *
  461. X */
  462. X#define    VOIDP
  463. X
  464. X/*
  465. X * Which version of the Sun RPC library we are using
  466. X * This is the implementation release number, not
  467. X * the protocol revision number.
  468. X */
  469. X#define    RPC_4
  470. X
  471. X/*
  472. X * Which version of the NFS interface are we using.
  473. X * This is the implementation release number, not
  474. X * the protocol revision number.
  475. X */
  476. X#define    NFS_44
  477. X#define HAS_TCP_NFS
  478. X
  479. X/*
  480. X * Does this OS have NDBM support?
  481. X */
  482. X#define OS_HAS_NDBM
  483. X
  484. X/*
  485. X * BSD/386 doesn't provide NIS.
  486. X */
  487. X#undef HAS_NIS_MAPS
  488. X
  489. X/*
  490. X * The mount table is obtained from the kernel
  491. X */
  492. X#undef    UPDATE_MTAB
  493. X
  494. X/*
  495. X * No mntent info on BSD/386
  496. X */
  497. X#undef    MNTENT_HDR
  498. X
  499. X/*
  500. X * Name of filesystem types
  501. X */
  502. X#define    MOUNT_TYPE_NFS    MOUNT_NFS
  503. X#define    MOUNT_TYPE_UFS    MOUNT_UFS
  504. X#undef MTAB_TYPE_UFS
  505. X#define    MTAB_TYPE_UFS    "ufs"
  506. X#define    MTAB_TYPE_MFS    "mfs"
  507. X
  508. X/*
  509. X * How to unmount filesystems
  510. X */
  511. X#undef UNMOUNT_TRAP
  512. X#undef    NEED_UMOUNT_FS
  513. X#define    NEED_UMOUNT_BSD
  514. X
  515. X/*
  516. X * How to copy an address into an NFS filehandle
  517. X */
  518. X#undef NFS_SA_DREF
  519. X#define    NFS_SA_DREF(dst, src) { \
  520. X        (dst).addr = (struct sockaddr *) (src); \
  521. X        (dst).sotype = SOCK_DGRAM; \
  522. X        (dst).proto = 0; \
  523. X    }
  524. X
  525. X/*
  526. X * Byte ordering
  527. X */
  528. X#ifndef BYTE_ORDER
  529. X#include <machine/endian.h>
  530. X#endif /* BYTE_ORDER */
  531. X
  532. X#undef ARCH_ENDIAN
  533. X#if BYTE_ORDER == LITTLE_ENDIAN
  534. X#define ARCH_ENDIAN "little"
  535. X#else
  536. X#if BYTE_ORDER == BIG_ENDIAN
  537. X#define ARCH_ENDIAN "big"
  538. X#else
  539. XXXX - Probably no hope of running Amd on this machine!
  540. X#endif /* BIG */
  541. X#endif /* LITTLE */
  542. X
  543. X/*
  544. X * Miscellaneous BSD/386 bits
  545. X */
  546. X#define    NEED_MNTOPT_PARSER
  547. X#define    SHORT_MOUNT_NAME
  548. X
  549. X#define    MNTMAXSTR       128
  550. X
  551. X#define    MNTTYPE_UFS    "ufs"        /* Un*x file system */
  552. X#define    MNTTYPE_NFS    "nfs"        /* network file system */
  553. X#define    MNTTYPE_MFS    "mfs"        /* memory file system */
  554. X#define    MNTTYPE_IGNORE    "ignore"    /* No type specified, ignore this entry */
  555. X
  556. X#define    M_RDONLY    MNT_RDONLY
  557. X#define    M_SYNC        MNT_SYNCHRONOUS
  558. X#define    M_NOEXEC    MNT_NOEXEC
  559. X#define    M_NOSUID    MNT_NOSUID
  560. X#define    M_NODEV        MNT_NODEV
  561. X
  562. X#define    MNTOPT_SOFT    "soft"        /* soft mount */
  563. X#define    MNTOPT_INTR    "intr"        /* interrupts allowed */
  564. X
  565. Xstruct mntent {
  566. X    char    *mnt_fsname;    /* name of mounted file system */
  567. X    char    *mnt_dir;    /* file system path prefix */
  568. X    char    *mnt_type;    /* MNTTYPE_* */
  569. X    char    *mnt_opts;    /* MNTOPT* */
  570. X    int    mnt_freq;    /* dump frequency, in days */
  571. X    int    mnt_passno;    /* pass number on parallel fsck */
  572. X};
  573. X
  574. X/*
  575. X * Type of a file handle
  576. X */
  577. X#undef NFS_FH_TYPE
  578. X#define    NFS_FH_TYPE    nfsv2fh_t *
  579. X
  580. X/*
  581. X * How to get a mount list
  582. X */
  583. X#undef    READ_MTAB_FROM_FILE
  584. X#define    READ_MTAB_BSD_STYLE
  585. X
  586. X/*
  587. X * The data for the mount syscall needs the path in addition to the
  588. X * host name since that is the only source of information about the
  589. X * mounted filesystem.
  590. X */
  591. X#define    NFS_ARGS_NEEDS_PATH
  592. X
  593. X/*
  594. X * struct statfs is in <sys/mount.h>
  595. X */
  596. X#undef STATFS_HDR
  597. X
  598. X/*
  599. X * BSD/386 has RE support built in
  600. X */
  601. X#undef RE_HDR
  602. X#define RE_HDR <regexp.h>
  603. X
  604. X/*
  605. X * prototype for index(), strdup() etc.
  606. X */
  607. X#include <string.h>
  608. END_OF_FILE
  609.   if test 5150 -ne `wc -c <'config/os-bsd386.h'`; then
  610.     echo shar: \"'config/os-bsd386.h'\" unpacked with wrong size!
  611.   fi
  612.   # end of 'config/os-bsd386.h'
  613. fi
  614. if test -f 'csd/acc.c' -a "${1}" != "-c" ; then 
  615.   echo shar: Will not clobber existing file \"'csd/acc.c'\"
  616. else
  617.   echo shar: Extracting \"'csd/acc.c'\" \(5191 characters\)
  618.   sed "s/^X//" >'csd/acc.c' <<'END_OF_FILE'
  619. X/* 
  620. X * WorldWide File System
  621. X * Copyright (c) 1992,1993 Youki Kadobayashi
  622. X * Copyright (c) 1992,1993 Osaka University
  623. X * All rights reserved.
  624. X *
  625. X * Permission to use, copy, modify and distribute this software and its
  626. X * documentation is hereby granted, provided that the following conditions
  627. X * are met:
  628. X * 1. Both the copyright notice and this permission notice appear in
  629. X *    all copies of the software, derivative works or modified versions,
  630. X *    and any portions thereof, and that both notices appear in
  631. X *    supporting documentation.
  632. X * 2. All advertising materials mentioning features or use of this software
  633. X *    must display the following acknowledgement:
  634. X *      This product includes software developed by the Osaka University
  635. X *      and its contributors.
  636. X * 3. Neither the name of the University nor the names of its contributors
  637. X *    may be used to endorse or promote products derived from this software
  638. X *    without specific prior written permission.
  639. X *
  640. X * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND OSAKA
  641. X * UNIVERSITY DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  642. X * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  643. X *
  644. X * Osaka University requests users of this software to return to
  645. X *
  646. X *  Youki Kadobayashi
  647. X *  Department of Information and Computer Sciences
  648. X *  Osaka University, Toyonaka 560, Osaka, Japan
  649. X *
  650. X * any improvements or extensions that they make and grant Osaka
  651. X * University the rights to redistribute these changes.
  652. X */
  653. X/* Access control functions */
  654. Xstatic char *AtFSid = "$Header: acc.c[109.0] Wed Nov 24 03:47:01 1993 youki-k@is.aist-nara.ac.jp saved $";
  655. X
  656. X#include <sys/file.h>        /* for R_OK */
  657. X#ifndef R_OK
  658. X#include <unistd.h>
  659. X#endif
  660. X#include <ctype.h>
  661. X#include <string.h>        /* for strchr */
  662. X#include "wfs.h"
  663. X#include "util.h"
  664. X#include "global.h"
  665. X
  666. X/* all access control data is chained on acc_head with wf_accq */
  667. Xtypedef struct wf_accq {
  668. X    qelem    q;
  669. X    wf_acc    *accp;
  670. X    char    *dir;
  671. X} wf_accq;
  672. X
  673. Xextern qelem acc_head;
  674. Xqelem acc_head = { &acc_head, &acc_head };
  675. X
  676. Xstatic wf_cap acc_cap[] = {
  677. X    { "nfs", WF_ACC_NFS },
  678. X    { "uip", WF_ACC_UIP },
  679. X    { "fdp", WF_ACC_FDP },
  680. X    { "raw", WF_ACC_RAW },
  681. X    { NULL, 0 }
  682. X};
  683. X
  684. Xstatic unsigned long
  685. Xwildcard_inet_addr(name, replacement)    /* in HOST byte order for later use */
  686. Xchar *name;
  687. Xunsigned char replacement;
  688. X{
  689. X    unsigned long ip;
  690. X    char *p;
  691. X    int i;
  692. X    unsigned char *r;
  693. X
  694. X    if (p = strchr(name, '*')) {
  695. X        /*
  696. X         * IP address with wildcard; "163.221.*"
  697. X         * We do not accept network number 0 for now, sorry.
  698. X         */
  699. X        if (p == name) {
  700. X            /* star alone: class A to class C */
  701. X            if (replacement == 0)
  702. X                ip = 0;
  703. X            else /* if (replacement == 255) */
  704. X                ip = inet_addr("0xdf.0xff.0xff.0xff");
  705. X        } else {
  706. X            /*
  707. X             * Ensure trailing dot is present.
  708. X             *
  709. X             * Probably tricky, undocumented feature:
  710. X             * 133.1. --> 133.1.0.0
  711. X             * 133.1  --> 133.0.0.1
  712. X             * We use the former one.
  713. X             */
  714. X            if (*(p-1) == '.') {
  715. X                *p = '\0';
  716. X            } else {
  717. X                *p = '.';
  718. X            }
  719. X            ip = inet_addr(name);
  720. X            *p = '*';
  721. X        }
  722. X    } else {
  723. X        ip = inet_addr(name);
  724. X    }
  725. X
  726. X#ifndef    INADDR_NONE
  727. X#define    INADDR_NONE    0xffffffff
  728. X#endif
  729. X    if ((ip & INADDR_NONE) == INADDR_NONE) {
  730. X        dlog("Invalid address specification: %s", name);
  731. X    } else {
  732. X        r = (char *) &ip;
  733. X        for (i = 0; i < sizeof(ip); ++i) {
  734. X            if (r[i] == 0) r[i] = replacement;
  735. X        }
  736. X        ip = ntohl(ip);
  737. X    }
  738. X    return ip;
  739. X}
  740. X
  741. Xstatic wf_acc *new_accp;
  742. Xstatic wf_accq *new_accq;
  743. X
  744. Xint
  745. Xacc_bind(name, value)
  746. Xchar *name;
  747. Xchar *value;
  748. X{
  749. X    char *p;
  750. X    wf_acc *accp;
  751. X    unsigned long from, to;
  752. X    long flag;
  753. X
  754. X    if (isdigit(name[0])) {
  755. X        if (p = strchr(name, '-')) {
  756. X            *p = '\0';
  757. X            from = wildcard_inet_addr(name, 0);
  758. X            to = wildcard_inet_addr(p+1, 255);
  759. X            *p = '-';
  760. X        } else {
  761. X            from = wildcard_inet_addr(name, 0);
  762. X            to = wildcard_inet_addr(name, 255);
  763. X        }
  764. X        if (from == INADDR_NONE || to == INADDR_NONE) {
  765. X            dlog("invalid IP address");
  766. X            return -1;
  767. X        }
  768. X        flag = parse_cap(acc_cap, value);
  769. X        if (flag < 0) {
  770. X            dlog("invalid flag");
  771. X            return -1;
  772. X        }
  773. X    } else {
  774. X        /*
  775. X         * Domain name or special keywords?
  776. X         * Just reject them for now.
  777. X         */
  778. X        dlog("Not an IP address");
  779. X        return -1;
  780. X    }
  781. X    accp = ALLOC(wf_acc);
  782. X    accp->from = from;
  783. X    accp->to = to;
  784. X    accp->flag = flag;
  785. X    q_insert(accp, new_accp);
  786. X    return 0;
  787. X}
  788. X
  789. Xwf_acc *
  790. Xacc_load(dir)
  791. Xchar *dir;
  792. X{
  793. X    char path[MAXPATHLEN];
  794. X
  795. X    new_accp = (wf_acc *) q_alloc();
  796. X    sprintf(path, "%s/vol/%s/access", cs_topdir, dir);
  797. X    if (access(path, F_OK) < 0 || parse_conf(path, acc_bind) < 0) {
  798. X        FREE(new_accp);
  799. X        return (wf_acc *)0;
  800. X    }
  801. X    new_accq = ALLOC(wf_accq);
  802. X    new_accq->accp = new_accp;
  803. X    new_accq->dir = strdup(dir);
  804. X    q_insert(new_accq, LAST(wf_accq, &acc_head));
  805. X    return new_accp;
  806. X}
  807. X
  808. X/* find access control data by directory name */
  809. Xwf_acc *
  810. Xacc_findname(dir)
  811. Xchar *dir;
  812. X{
  813. X    wf_accq *accq;
  814. X
  815. X    /* search memory cache */
  816. X    ITER(accq, wf_accq, &acc_head) {
  817. X        if (strcmp(accq->dir, dir) == 0) {
  818. X            return accq->accp;
  819. X        }
  820. X    }
  821. X
  822. X    /* search disk cache */
  823. X    return acc_load(dir);
  824. X}
  825. X
  826. Xint
  827. Xacc_check(accp, ip, mask)
  828. Xwf_acc *accp;
  829. Xunsigned long ip;
  830. Xlong mask;
  831. X{
  832. X    unsigned long host_ip;
  833. X    wf_acc *p;
  834. X
  835. X    host_ip = ntohl(ip);
  836. X    ITER(p, wf_acc, &accp->q) {
  837. X        /* comparison in HOST byte order */
  838. X        if (p->from <= host_ip && host_ip <= p->to
  839. X            && (p->flag & mask)) {
  840. X            return 0;
  841. X        }
  842. X    }
  843. X    return -1;
  844. X}
  845. X
  846. END_OF_FILE
  847.   if test 5191 -ne `wc -c <'csd/acc.c'`; then
  848.     echo shar: \"'csd/acc.c'\" unpacked with wrong size!
  849.   fi
  850.   # end of 'csd/acc.c'
  851. fi
  852. if test -f 'csd/bfs.c' -a "${1}" != "-c" ; then 
  853.   echo shar: Will not clobber existing file \"'csd/bfs.c'\"
  854. else
  855.   echo shar: Extracting \"'csd/bfs.c'\" \(5503 characters\)
  856.   sed "s/^X//" >'csd/bfs.c' <<'END_OF_FILE'
  857. X/* 
  858. X * WorldWide File System
  859. X * Copyright (c) 1992,1993 Youki Kadobayashi
  860. X * Copyright (c) 1992,1993 Osaka University
  861. X * All rights reserved.
  862. X *
  863. X * Permission to use, copy, modify and distribute this software and its
  864. X * documentation is hereby granted, provided that the following conditions
  865. X * are met:
  866. X * 1. Both the copyright notice and this permission notice appear in
  867. X *    all copies of the software, derivative works or modified versions,
  868. X *    and any portions thereof, and that both notices appear in
  869. X *    supporting documentation.
  870. X * 2. All advertising materials mentioning features or use of this software
  871. X *    must display the following acknowledgement:
  872. X *      This product includes software developed by the Osaka University
  873. X *      and its contributors.
  874. X * 3. Neither the name of the University nor the names of its contributors
  875. X *    may be used to endorse or promote products derived from this software
  876. X *    without specific prior written permission.
  877. X *
  878. X * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND OSAKA
  879. X * UNIVERSITY DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  880. X * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  881. X *
  882. X * Osaka University requests users of this software to return to
  883. X *
  884. X *  Youki Kadobayashi
  885. X *  Department of Information and Computer Sciences
  886. X *  Osaka University, Toyonaka 560, Osaka, Japan
  887. X *
  888. X * any improvements or extensions that they make and grant Osaka
  889. X * University the rights to redistribute these changes.
  890. X */
  891. X/*
  892. X * Bootstrap file system. Provide service address information.
  893. X * Gross hack!  Talented ladies&gentlemen should not read further!
  894. X */
  895. Xstatic char *AtFSid = "$Header: bfs.c[109.0] Wed Nov 24 03:47:03 1993 youki-k@is.aist-nara.ac.jp saved $";
  896. X
  897. X#include <string.h>    /* for strlen */
  898. X#include "wfs.h"
  899. X#include "util.h"
  900. X#include "global.h"
  901. X
  902. X#if 0
  903. Xwf_proto proto_host = {
  904. X    "host", host_getattr, err_getattr_miss,
  905. X    err_lookup, err_lookup_miss, err_readlink,
  906. X    host_read, err_read_miss, err_readdir, err_readdir_miss,
  907. X    err_getuda, err_keepalive, err_close, err_shutdown, 0
  908. X};
  909. X
  910. Xwf_proto proto_cwd = {
  911. X    "cwd", cwd_getattr, err_getattr_miss,
  912. X    err_lookup, err_lookup_miss, err_readlink,
  913. X    cwd_read, err_read_miss, err_readdir, err_readdir_miss,
  914. X    err_getuda, err_keepalive, err_close, err_shutdown, 0
  915. X};
  916. X#endif
  917. X
  918. Xwf_proto proto_fh = {
  919. X    "fh", fh_getattr, err_getattr_miss,
  920. X    err_lookup, err_lookup_miss, err_readlink,
  921. X    fh_read, err_read_miss, err_readdir, err_readdir_miss,
  922. X    err_getuda, err_keepalive, err_close, err_shutdown, 0
  923. X};
  924. X
  925. Xvoid
  926. Xbfs_start()
  927. X{
  928. X#if 0
  929. X    wf_vol *host_volp, *cwd_volp;
  930. X
  931. X    host_volp = vol_alloc();
  932. X    host_volp->id = WF_HOST_VOL_ID;
  933. X    host_volp->name = "host(fake)";
  934. X    host_volp->dir = "host(fake)";
  935. X
  936. X    cwd_volp = vol_alloc();
  937. X    cwd_volp->id = WF_CWD_VOL_ID;
  938. X    cwd_volp->name = "cwd(fake)";
  939. X    cwd_volp->dir = "cwd(fake)";
  940. X#endif
  941. X    wf_vol *fh_volp;
  942. X
  943. X    fh_volp = vol_alloc();
  944. X    fh_volp->id = WF_FH_VOL_ID;
  945. X    fh_volp->name = "fh(fake)";
  946. X    fh_volp->dir = "fh(fake)";
  947. X}
  948. X
  949. X/*
  950. X * We do bypass protocol switch here, since this kind of ugly hack is
  951. X * only necessary in the NFS.
  952. X */
  953. X
  954. Xstatic void
  955. Xfake_attr(attrp, size, fhp)
  956. Xfattr *attrp;
  957. Xlong size;
  958. Xwf_fh *fhp;
  959. X{
  960. X    bzero(attrp, sizeof(*attrp));
  961. X    /* hostname in ASCIZ */
  962. X    attr_initfile(attrp, size);
  963. X    attrp->fsid = fhp->child_vol;
  964. X    attrp->fileid = fhp->file_id;
  965. X}
  966. X
  967. X#if 0
  968. Xvoid
  969. Xhost_fake(c)
  970. Xwf_thrd *c;
  971. X{
  972. X    static wf_file file;
  973. X    fake_attr(&file.fattr, strlen(cs_hostname)+1, c->fhp);
  974. X    c->filep = &file;
  975. X}
  976. X
  977. Xvoid
  978. Xhost_getattr(c)
  979. Xwf_thrd *c;
  980. X{
  981. X    host_fake(c);
  982. X    nfs_getattr_reply(c, WF_REP_OK);
  983. X}
  984. X
  985. Xvoid
  986. Xhost_read(c)
  987. Xwf_thrd *c;
  988. X{
  989. X    static fattr attr;
  990. X    int namelen;
  991. X
  992. X    namelen = strlen(cs_hostname)+1;
  993. X    fake_attr(&attr, namelen, c->fhp);
  994. X    nfs_read_reply(c, WF_REP_OK, &attr, namelen, cs_hostname);
  995. X}
  996. X
  997. Xvoid
  998. Xcwd_getattr(c)
  999. Xwf_thrd *c;
  1000. X{
  1001. X    int ret;
  1002. X    ret = cwd_fake(c, c->fhp);
  1003. X    nfs_getattr_reply(c, ret);
  1004. X}
  1005. X
  1006. Xvoid
  1007. Xcwd_read(c)
  1008. Xwf_thrd *c;
  1009. X{
  1010. X    static fattr attr;
  1011. X    wf_vol *nfs_volp;
  1012. X    int namelen;
  1013. X    char path[MAXPATHLEN];
  1014. X
  1015. X    nfs_volp = vol_findid(c->fhp->parent_vol);
  1016. X    if (nfs_volp == NULL) {
  1017. X        nfs_read_reply(c, WF_ERR_STALE, 0, 0, 0);
  1018. X        return;
  1019. X    }
  1020. X    c->dirp = dir_findcache(nfs_volp, c->fhp->child_dir);
  1021. X    if (c->dirp == (wf_dir *)0) {
  1022. X        nfs_read_reply(c, WF_ERR_STALE, 0, 0, 0);
  1023. X        return;
  1024. X    }
  1025. X    namelen = strlen(nfs_volp->dir) + strlen(nfs_volp->name)
  1026. X        + strlen(c->dirp->name) + 3;
  1027. X    fake_attr(&attr, namelen, c->fhp);
  1028. X    sprintf(path, "%s/%s%s/", nfs_volp->dir,
  1029. X        nfs_volp->name, c->dirp->name);
  1030. X    nfs_read_reply(c, WF_REP_OK, &attr, namelen, path);
  1031. X}
  1032. X
  1033. X#endif
  1034. X
  1035. Xint
  1036. Xcwd_fake(c, fhp)
  1037. Xwf_thrd *c;
  1038. Xwf_fh *fhp;
  1039. X{
  1040. X    static wf_file file;
  1041. X    wf_vol *nfs_volp;
  1042. X
  1043. X    nfs_volp = vol_findid(fhp->parent_vol);
  1044. X    if (nfs_volp == NULL) {
  1045. X        return WF_ERR_STALE;
  1046. X    }
  1047. X    c->dirp = dir_findcache(nfs_volp, fhp->child_dir);
  1048. X    if (c->dirp == (wf_dir *)0) {
  1049. X        return WF_ERR_STALE;
  1050. X    }
  1051. X    fake_attr(&file.fattr, strlen(nfs_volp->dir)
  1052. X          + strlen(nfs_volp->name) + strlen(c->dirp->name) + 3, fhp);
  1053. X    c->filep = &file;
  1054. X    return WF_REP_OK;
  1055. X}
  1056. X
  1057. X#define FH_STRING_LEN    36
  1058. Xvoid
  1059. Xfh_fake(c)
  1060. Xwf_thrd *c;
  1061. X{
  1062. X    static wf_file file;
  1063. X    fake_attr(&file.fattr, FH_STRING_LEN, c->fhp);
  1064. X    c->filep = &file;
  1065. X}
  1066. X
  1067. Xvoid
  1068. Xfh_getattr(c)
  1069. Xwf_thrd *c;
  1070. X{
  1071. X    fh_fake(c);
  1072. X    nfs_getattr_reply(c, WF_REP_OK);
  1073. X}
  1074. X
  1075. Xvoid
  1076. Xfh_read(c)
  1077. Xwf_thrd *c;
  1078. X{
  1079. X    fattr attr;
  1080. X    char fh_string[FH_STRING_LEN];
  1081. X
  1082. X    fake_attr(&attr, FH_STRING_LEN, c->fhp);
  1083. X    sprintf(fh_string, "%08x.%08x.%08x.%08x",
  1084. X        c->fhp->parent_vol, c->fhp->parent_dir,
  1085. X        c->fhp->parent_vol, c->fhp->child_dir);
  1086. X    /*
  1087. X     * we don't use child_vol here since it's WF_FH_VOL_ID, a fake.
  1088. X     */
  1089. X    nfs_read_reply(c, WF_REP_OK, &attr, FH_STRING_LEN, fh_string);
  1090. X}
  1091. X
  1092. END_OF_FILE
  1093.   if test 5503 -ne `wc -c <'csd/bfs.c'`; then
  1094.     echo shar: \"'csd/bfs.c'\" unpacked with wrong size!
  1095.   fi
  1096.   # end of 'csd/bfs.c'
  1097. fi
  1098. if test -f 'csd/callout.c' -a "${1}" != "-c" ; then 
  1099.   echo shar: Will not clobber existing file \"'csd/callout.c'\"
  1100. else
  1101.   echo shar: Extracting \"'csd/callout.c'\" \(5388 characters\)
  1102.   sed "s/^X//" >'csd/callout.c' <<'END_OF_FILE'
  1103. X/* callout; borrowed and modified amd5.3alpha14 source */
  1104. Xstatic char *AtFSid = "$Header: callout.c[109.0] Wed Nov 24 03:47:03 1993 youki-k@is.aist-nara.ac.jp saved $";
  1105. X/*
  1106. X * Copyright (c) 1989 Jan-Simon Pendry
  1107. X * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
  1108. X * Copyright (c) 1989 The Regents of the University of California.
  1109. X * All rights reserved.
  1110. X *
  1111. X * This code is derived from software contributed to Berkeley by
  1112. X * Jan-Simon Pendry at Imperial College, London.
  1113. X *
  1114. X * Redistribution and use in source and binary forms, with or without
  1115. X * modification, are permitted provided that the following conditions
  1116. X * are met:
  1117. X * 1. Redistributions of source code must retain the above copyright
  1118. X *    notice, this list of conditions and the following disclaimer.
  1119. X * 2. Redistributions in binary form must reproduce the above copyright
  1120. X *    notice, this list of conditions and the following disclaimer in the
  1121. X *    documentation and/or other materials provided with the distribution.
  1122. X * 3. All advertising materials mentioning features or use of this software
  1123. X *    must display the following acknowledgement:
  1124. X *      This product includes software developed by the University of
  1125. X *      California, Berkeley and its contributors.
  1126. X * 4. Neither the name of the University nor the names of its contributors
  1127. X *    may be used to endorse or promote products derived from this software
  1128. X *    without specific prior written permission.
  1129. X *
  1130. X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  1131. X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  1132. X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  1133. X * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  1134. X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  1135. X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  1136. X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  1137. X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  1138. X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  1139. X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  1140. X * SUCH DAMAGE.
  1141. X *
  1142. X *    %W% (Berkeley) %G%
  1143. X *
  1144. X * $Id: clock.c,v 5.2.2.1 1992/02/09 15:08:20 jsp beta $
  1145. X *
  1146. X */
  1147. X
  1148. X#include "wfs.h"
  1149. X#include "util.h"
  1150. X#include "global.h"
  1151. X
  1152. X/*
  1153. X * Callouts.
  1154. X *
  1155. X * Modelled on kernel object of the same name.
  1156. X * See usual references.
  1157. X *
  1158. X * Use of a heap-based mechanism was rejected:
  1159. X * 1.  more complex implementation needed.
  1160. X * 2.  not obvious that a list is too slow for Amd.
  1161. X */
  1162. X
  1163. Xstruct callout {
  1164. X    qelem    q;            /* list of callouts */
  1165. X    void    (*c_fn)();        /* function to call */
  1166. X    void    *c_closure;        /* closure to pass to call */
  1167. X    time_t    c_time;            /* time of call */
  1168. X};
  1169. X
  1170. Xextern qelem callouts;
  1171. Xqelem callouts = { &callouts, &callouts };
  1172. Xtime_t next_softclock;            /* Time of next call to softclock() */
  1173. X
  1174. X/* Schedule a callout */
  1175. Xvoid *
  1176. Xtimeout_set(t, fn, closure)
  1177. Xtime_t t;
  1178. Xvoid (*fn)();
  1179. Xvoid *closure;
  1180. X{
  1181. X    callout *cp;
  1182. X
  1183. X    /*
  1184. X     * Allocate and fill in a new callout structure
  1185. X     */
  1186. X    callout *cpnew = ALLOC(struct callout);
  1187. X    cpnew->c_closure = closure;
  1188. X    cpnew->c_fn = fn;
  1189. X    cpnew->c_time = t;
  1190. X
  1191. X    if (t < next_softclock)
  1192. X        next_softclock = t;
  1193. X
  1194. X    /*
  1195. X     * Find the correct place in the list
  1196. X     */
  1197. X    ITER(cp, callout, &callouts) {
  1198. X        if (cp->c_time >= t)
  1199. X            break;
  1200. X    }
  1201. X    q_insert(cpnew, PREV(callout, cp));
  1202. X
  1203. X    /*
  1204. X     * Return callout
  1205. X     */
  1206. X    return (void *) cpnew;
  1207. X}
  1208. X
  1209. X/* Reconfigure a callout */
  1210. Xvoid
  1211. Xtimeout_reset(t, cp)
  1212. Xtime_t t;
  1213. Xcallout *cp;
  1214. X{
  1215. X    callout *p;
  1216. X
  1217. X    if (cp->c_time < t) {
  1218. X        if (NEXT(callout, &callouts) == cp) {
  1219. X            next_softclock = MIN(t, NEXT(callout, cp)->c_time);
  1220. X        }
  1221. X        q_remove(cp);
  1222. X        ITER(p, callout, &callouts) {
  1223. X            if (p->c_time > t)
  1224. X                break;
  1225. X        }
  1226. X        q_insert(cp, PREV(callout, p));
  1227. X    } else if (t < cp->c_time) {
  1228. X        q_remove(cp);
  1229. X        REVITER(p, callout, &callouts) {
  1230. X            if (p->c_time < t)
  1231. X                break;
  1232. X        }
  1233. X        q_insert(cp, p);
  1234. X        if (p == (callout *) &callouts) {
  1235. X            next_softclock = t;
  1236. X        }
  1237. X    } else {
  1238. X        syslog(LOG_WARNING, "unneeded timeout_reset");
  1239. X    }
  1240. X}
  1241. X
  1242. X/* De-schedule a callout */
  1243. Xvoid
  1244. Xtimeout_clear(cp)
  1245. Xcallout *cp;
  1246. X{
  1247. X    q_remove(cp);
  1248. X    FREE(cp);
  1249. X    return;
  1250. X}
  1251. X
  1252. X/* Reschedule after clock changed */
  1253. Xvoid
  1254. Xtimeout_reschedule(now, then)
  1255. Xtime_t now;
  1256. Xtime_t then;
  1257. X{
  1258. X    callout *cp;
  1259. X
  1260. X    ITER(cp, callout, &callouts) {
  1261. X        if (cp->c_time >= now && cp->c_time <= then) {
  1262. X#ifdef DEBUG
  1263. X            dlog("rescheduling job %ld back %d seconds",
  1264. X                 cp->c_time, cp->c_time - now);
  1265. X#endif
  1266. X            next_softclock = cp->c_time = now;
  1267. X        }
  1268. X    }
  1269. X}
  1270. X
  1271. X/* Clock handler */
  1272. Xint
  1273. Xsoftclock()
  1274. X{
  1275. X    callout *cp;
  1276. X
  1277. X    realtime();
  1278. X
  1279. X    /* While there are more callouts waiting... */
  1280. X    while ((cp = NEXT(callout, &callouts))
  1281. X           != HEAD(callout, &callouts)
  1282. X           && cp->c_time <= now) {
  1283. X        /*
  1284. X         * Extract first from list, save fn & closure and
  1285. X         * unlink callout from list and free.  Finally call
  1286. X         * function.
  1287. X         * The free is done first because it is quite common
  1288. X         * that the function will call timeout() and try to
  1289. X         * allocate a callout
  1290. X         */
  1291. X        void (*fn)() = cp->c_fn;
  1292. X        void *closure = cp->c_closure;
  1293. X        
  1294. X        q_remove(cp);
  1295. X        FREE(cp);
  1296. X#ifdef DEBUG
  1297. X        /*dlog("Calling %#x(%#x)", fn, closure);*/
  1298. X#endif /* DEBUG */
  1299. X        (*fn)(closure);
  1300. X    }
  1301. X
  1302. X    /*
  1303. X     * Return number of seconds to next event, or 0 if there is no
  1304. X     * event.
  1305. X     */
  1306. X    if (MORE(&callouts)) {
  1307. X        cp = NEXT(callout, &callouts);
  1308. X        return cp->c_time - now;
  1309. X    }
  1310. X    return 0;
  1311. X}
  1312. END_OF_FILE
  1313.   if test 5388 -ne `wc -c <'csd/callout.c'`; then
  1314.     echo shar: \"'csd/callout.c'\" unpacked with wrong size!
  1315.   fi
  1316.   # end of 'csd/callout.c'
  1317. fi
  1318. if test -f 'csd/cs.c' -a "${1}" != "-c" ; then 
  1319.   echo shar: Will not clobber existing file \"'csd/cs.c'\"
  1320. else
  1321.   echo shar: Extracting \"'csd/cs.c'\" \(5191 characters\)
  1322.   sed "s/^X//" >'csd/cs.c' <<'END_OF_FILE'
  1323. X/* 
  1324. X * WorldWide File System
  1325. X * Copyright (c) 1992,1993 Youki Kadobayashi
  1326. X * Copyright (c) 1992,1993 Osaka University
  1327. X * All rights reserved.
  1328. X *
  1329. X * Permission to use, copy, modify and distribute this software and its
  1330. X * documentation is hereby granted, provided that the following conditions
  1331. X * are met:
  1332. X * 1. Both the copyright notice and this permission notice appear in
  1333. X *    all copies of the software, derivative works or modified versions,
  1334. X *    and any portions thereof, and that both notices appear in
  1335. X *    supporting documentation.
  1336. X * 2. All advertising materials mentioning features or use of this software
  1337. X *    must display the following acknowledgement:
  1338. X *      This product includes software developed by the Osaka University
  1339. X *      and its contributors.
  1340. X * 3. Neither the name of the University nor the names of its contributors
  1341. X *    may be used to endorse or promote products derived from this software
  1342. X *    without specific prior written permission.
  1343. X *
  1344. X * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND OSAKA
  1345. X * UNIVERSITY DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  1346. X * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  1347. X *
  1348. X * Osaka University requests users of this software to return to
  1349. X *
  1350. X *  Youki Kadobayashi
  1351. X *  Department of Information and Computer Sciences
  1352. X *  Osaka University, Toyonaka 560, Osaka, Japan
  1353. X *
  1354. X * any improvements or extensions that they make and grant Osaka
  1355. X * University the rights to redistribute these changes.
  1356. X */
  1357. X/* CS filesystem */
  1358. Xstatic char *AtFSid = "$Header: cs.c[109.0] Wed Nov 24 03:47:04 1993 youki-k@is.aist-nara.ac.jp saved $";
  1359. X
  1360. X#include <rpc/rpc.h>
  1361. X#include "wfs.h"
  1362. X#include "global.h"
  1363. X#include "util.h"
  1364. X
  1365. X/* translation of WFS semantics to CS semantics */
  1366. Xstatic cs_stat cserr[] = {
  1367. X    CS_OK,        /* WF_REP_OK: no error */
  1368. X    CSERR_OTHER,    /* WF_ERR_PERM: Not owner *//* ROFS */
  1369. X    CSERR_NOENT,    /* WF_ERR_NOENT: No such entity */
  1370. X    CSERR_OTHER,    /* WF_ERR_IO: I/O error *//* ROFS */
  1371. X    CSERR_OTHER,    /* WF_ERR_NXIO: No such device or address *//* NODEV */
  1372. X    CSERR_ACCES,    /* WF_ERR_ACCES: Permission denied */
  1373. X    CSERR_OTHER,    /* WF_ERR_EXIST: Given resource exists *//* ROFS */
  1374. X    CSERR_OTHER,    /* WF_ERR_NODEV: No such device *//* NODEV */
  1375. X    CSERR_NOTDIR,    /* WF_ERR_NOTDIR: Not a directory*/
  1376. X    CSERR_ISDIR,    /* WF_ERR_ISDIR: Is a directory */
  1377. X    CSERR_FBIG,    /* WF_ERR_FBIG: Resource too large */
  1378. X    CSERR_NOSPC,    /* WF_ERR_NOSPC: No space left on device */
  1379. X    CSERR_ROFS,    /* WF_ERR_ROFS: Read-only file system */
  1380. X    CSERR_OTHER,    /* WF_ERR_NAMETOOLONG: Resource name too long *//*XXX*/
  1381. X    CSERR_OTHER,    /* WF_ERR_NOTEMPTY: Directory not empty *//* ROFS */
  1382. X    CSERR_OTHER,    /* WF_ERR_DQUOT: Disc quota exceeded *//* ROFS */
  1383. X    CSERR_STALE,    /* WF_ERR_STALE: Stale file handle */
  1384. X    CSERR_OTHER,    /* WF_ERR_WFLUSH: Write cache flushed *//* ROFS */
  1385. X    CS_WAIT,    /* WF_REP_WAIT: Operation would block */
  1386. X    CSERR_ALREADY,    /* WF_ERR_ALREADY: Operation already in progress */
  1387. X    CSERR_PROTO,    /* WF_ERR_PROTO: Protocol not available */
  1388. X    CSERR_NDOWN,    /* WF_ERR_NDOWN: Network is down */
  1389. X    CSERR_NUNREACH,    /* WF_ERR_NUNREACH: Network is unreachable */
  1390. X    CSERR_XABORT,    /* WF_ERR_XABORT: Transfer aborted */
  1391. X    CSERR_TIMEOUT,    /* WF_ERR_TIMEOUT: Connection timed out */
  1392. X    CSERR_REFUSED,    /* WF_ERR_REFUSED: Connection refused */
  1393. X    CSERR_HDOWN,    /* WF_ERR_HDOWN: Host is down */
  1394. X    CSERR_HUNREACH,    /* WF_ERR_HUNREACH: No route to host */
  1395. X    CSERR_NQUOT,    /* WF_ERR_NQUOT: Network quota exceeded */
  1396. X};
  1397. X
  1398. Xint
  1399. Xcs_namei(pname, fhp)
  1400. Xchar *pname;
  1401. Xwf_fh *fhp;    /* result */
  1402. X{
  1403. X    int ret;
  1404. X    ret = root_name2fh(pname, fhp);
  1405. X    return cserr[ret];
  1406. X}
  1407. X
  1408. Xlong
  1409. Xcs_error(msg)
  1410. Xchar *msg;
  1411. X{
  1412. X    long err_context;
  1413. X
  1414. X    return err_context;
  1415. X}
  1416. X
  1417. Xextern wf_vol *root_vol;
  1418. Xextern wf_dir *root_dir;
  1419. X
  1420. Xvoid
  1421. Xcs_mount(c)
  1422. Xwf_thrd *c;
  1423. X{
  1424. X    wf_file *filep;
  1425. X    filep = file_findname(root_dir, c->fname);
  1426. X    if (filep) {
  1427. X        /* already mounted */
  1428. X        (*c->reply)(c, WF_REP_OK);
  1429. X        return;
  1430. X    }
  1431. X
  1432. X    /* mount it */
  1433. X    c->parent_volp = c->child_volp = root_vol;
  1434. X    c->fhp = ALLOC(wf_fh);
  1435. X    c->fhp->parent_vol = c->fhp->child_vol = WF_ROOT_VOL_ID;
  1436. X    c->fhp->dir_id = c->fhp->file_id = WF_ROOT_DIR_ID;
  1437. X    c->dotdotp = root_dir;
  1438. X    root_lookup_miss(c);
  1439. X}
  1440. X
  1441. Xvoid
  1442. Xcs_mount_done(c, status)
  1443. Xwf_thrd *c;
  1444. Xint status;
  1445. X{
  1446. X    static cs_res res;
  1447. X
  1448. X    if (status == WF_REP_WAIT) {
  1449. X        return;
  1450. X    }
  1451. X    res.status = cserr[status];
  1452. X    svc_sendreply(c->rqstp->rq_xprt, xdr_cs_res, &res);
  1453. X    if (c->fhp) FREE(c->fhp);
  1454. X    if (! (c->flag & WF_THREAD_BUSY)) thrd_free(c);
  1455. X}
  1456. X
  1457. Xint
  1458. Xcs_umount(vol)
  1459. Xchar *vol;
  1460. X{
  1461. X    wf_file *filep;
  1462. X    wf_vol *volp;
  1463. X
  1464. X    filep = file_findname(root_dir, vol);
  1465. X    if (! filep) {
  1466. X        return CSERR_NOENT;
  1467. X    }
  1468. X    q_remove((qelem *) filep);
  1469. X    volp = vol_findname(".", vol);        /* XXX must support subdirs */
  1470. X    if (! volp) {
  1471. X        return CSERR_NOENT;
  1472. X    }
  1473. X    vol_free(volp);
  1474. X    return CS_OK;
  1475. X}
  1476. X
  1477. Xvoid
  1478. Xcs_lookup(rqstp, volp, fhp, fname)
  1479. Xsvc_req *rqstp;
  1480. Xwf_vol *volp;
  1481. Xwf_fh *fhp;
  1482. Xchar *fname;
  1483. X{
  1484. X}
  1485. X
  1486. Xvoid
  1487. Xcs_readdir(rqstp, volp, fhp, cookie, count)
  1488. Xsvc_req *rqstp;
  1489. Xwf_vol *volp;
  1490. Xwf_fh *fhp;
  1491. Xlong cookie;
  1492. Xu_int count;
  1493. X{
  1494. X}
  1495. X
  1496. Xvoid
  1497. Xcs_read(rqstp, volp, fhp, offset, count, totalcount)
  1498. Xsvc_req *rqstp;
  1499. Xwf_vol *volp;
  1500. Xwf_fh *fhp;
  1501. Xu_int offset, count, totalcount;
  1502. X{
  1503. X}
  1504. X
  1505. Xvoid
  1506. Xcs_getuda(rqstp, fhp, attrname)
  1507. Xsvc_req *rqstp;
  1508. Xwf_fh *fhp;
  1509. Xchar *attrname;
  1510. X{
  1511. X}
  1512. X
  1513. Xvoid
  1514. Xcs_geterr(rqstp, err_context)
  1515. Xsvc_req *rqstp;
  1516. Xlong err_context;
  1517. X{
  1518. X}
  1519. END_OF_FILE
  1520.   if test 5191 -ne `wc -c <'csd/cs.c'`; then
  1521.     echo shar: \"'csd/cs.c'\" unpacked with wrong size!
  1522.   fi
  1523.   # end of 'csd/cs.c'
  1524. fi
  1525. if test -f 'csd/icmp.c' -a "${1}" != "-c" ; then 
  1526.   echo shar: Will not clobber existing file \"'csd/icmp.c'\"
  1527. else
  1528.   echo shar: Extracting \"'csd/icmp.c'\" \(6074 characters\)
  1529.   sed "s/^X//" >'csd/icmp.c' <<'END_OF_FILE'
  1530. X/* 
  1531. X * WorldWide File System
  1532. X * Copyright (c) 1992,1993 Youki Kadobayashi
  1533. X * Copyright (c) 1992,1993 Osaka University
  1534. X * All rights reserved.
  1535. X *
  1536. X * Permission to use, copy, modify and distribute this software and its
  1537. X * documentation is hereby granted, provided that the following conditions
  1538. X * are met:
  1539. X * 1. Both the copyright notice and this permission notice appear in
  1540. X *    all copies of the software, derivative works or modified versions,
  1541. X *    and any portions thereof, and that both notices appear in
  1542. X *    supporting documentation.
  1543. X * 2. All advertising materials mentioning features or use of this software
  1544. X *    must display the following acknowledgement:
  1545. X *      This product includes software developed by the Osaka University
  1546. X *      and its contributors.
  1547. X * 3. Neither the name of the University nor the names of its contributors
  1548. X *    may be used to endorse or promote products derived from this software
  1549. X *    without specific prior written permission.
  1550. X *
  1551. X * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND OSAKA
  1552. X * UNIVERSITY DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  1553. X * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  1554. X *
  1555. X * Osaka University requests users of this software to return to
  1556. X *
  1557. X *  Youki Kadobayashi
  1558. X *  Department of Information and Computer Sciences
  1559. X *  Osaka University, Toyonaka 560, Osaka, Japan
  1560. X *
  1561. X * any improvements or extensions that they make and grant Osaka
  1562. X * University the rights to redistribute these changes.
  1563. X */
  1564. Xstatic char *AtFSid = "$Header: icmp.c[109.0] Wed Nov 24 03:47:10 1993 youki-k@is.aist-nara.ac.jp saved $";
  1565. X
  1566. X#include <sys/types.h>
  1567. X#include <sys/param.h>
  1568. X#include "wfs.h"
  1569. X#include <netinet/in_systm.h>
  1570. X#include <netinet/ip.h>
  1571. X#include <netinet/ip_icmp.h>
  1572. X#include <netdb.h>
  1573. X#include "util.h"
  1574. X#include "global.h"
  1575. X
  1576. Xstatic int seq;
  1577. Xstatic int so;
  1578. X#define    WF_ICMP_LEN    56
  1579. X#define    WF_ICMP_MAX    512    /* XXX should be enough */
  1580. Xstatic char buf[WF_ICMP_MAX];
  1581. X
  1582. Xvoid
  1583. Xicmp_start()
  1584. X{
  1585. X    struct protoent *proto;
  1586. X    proto = getprotobyname("icmp");
  1587. X    so = socket(AF_INET, SOCK_RAW, proto->p_proto);
  1588. X    if (so < 0) {
  1589. X        errno_diag();
  1590. X        return;
  1591. X    }
  1592. X    so_register(so, WF_SO_READ);
  1593. X    so_callback(so, icmp_recv, (void *)so);
  1594. X}
  1595. X
  1596. Xstatic int
  1597. Xicmp_cksum(ptr, nbytes)
  1598. Xu_short *ptr;
  1599. Xint nbytes;
  1600. X{
  1601. X    /* icmp_cksum is verbatim copy, whilst I checked errata carefully, from
  1602. X     * "UNIX Network Programming", W. Richard Stevens
  1603. X     *
  1604. X     * Refer to "Computing the Internet Checksum" by R.Braden, D.Borman and
  1605. X     * C.Partridge, Computer Communication Review 19(2), April 1989,
  1606. X     * pp.86-101, for additional details.
  1607. X     */
  1608. X    long sum;
  1609. X    u_short oddbyte;
  1610. X    u_short answer;
  1611. X
  1612. X    sum = 0;
  1613. X    while (nbytes > 1) {
  1614. X        sum += *ptr++;
  1615. X        nbytes -= 2;
  1616. X    }
  1617. X    if (nbytes == 1) {
  1618. X        oddbyte = 0;
  1619. X        *((u_char *) &oddbyte) = *(u_char *)ptr;
  1620. X        sum += oddbyte;
  1621. X    }
  1622. X    sum = (sum >> 16) + (sum & 0xffff);
  1623. X    sum += (sum >> 16);
  1624. X    answer = ~sum;
  1625. X    return answer;
  1626. X}
  1627. X
  1628. Xvoid
  1629. Xicmp_send(to)
  1630. Xsockaddr_in *to;
  1631. X{
  1632. X    struct icmp *p = (struct icmp *)buf;
  1633. X
  1634. X    p->icmp_type = ICMP_ECHO;
  1635. X    p->icmp_code = 0;
  1636. X    p->icmp_cksum = 0;
  1637. X    p->icmp_id = cs_pid & 0xFFFF;
  1638. X    p->icmp_seq = seq++;
  1639. X    gettimeofday((struct timeval *) buf+ICMP_MINLEN, (struct timezone *)0);
  1640. X    p->icmp_cksum = icmp_cksum(p, WF_ICMP_LEN);
  1641. X
  1642. X    sendto(so, buf, WF_ICMP_LEN, 0, (struct sockaddr *)to, sizeof(*to));
  1643. X}
  1644. X
  1645. Xstatic void
  1646. Xtvsub(out, in)
  1647. Xstruct timeval *out, *in;
  1648. X{
  1649. X    /* also from "UNIX Network Programming", W. Richard Stevens */
  1650. X    if ((out->tv_usec -= in->tv_usec) < 0) {
  1651. X        out->tv_sec--;
  1652. X        out->tv_usec += 1000000;
  1653. X    }
  1654. X    out->tv_sec -= in->tv_sec;
  1655. X}
  1656. X
  1657. Xvoid
  1658. Xicmp_recv(so)
  1659. Xint so;
  1660. X{
  1661. X    int n, fromlen;
  1662. X    struct sockaddr_in from;
  1663. X    int iphdrlen;
  1664. X    struct ip *ip = (struct ip *)buf;
  1665. X    wf_srv *srvp;
  1666. X    wf_srvstat *stat;
  1667. X    struct icmp *p;
  1668. X    struct timeval tv;
  1669. X    long rtt;        /* in milliseconds */
  1670. X
  1671. X    /*
  1672. X     * receive packet
  1673. X     */
  1674. X    fromlen = sizeof(from);
  1675. X resume:
  1676. X    n = recvfrom(so, buf, WF_ICMP_MAX, 0, (struct sockaddr *)&from,
  1677. X               &fromlen);
  1678. X    if (n < 0) {
  1679. X        errno_diag();
  1680. X        return;
  1681. X    }
  1682. X
  1683. X    /*
  1684. X     * verify header
  1685. X     */
  1686. X    iphdrlen = ip->ip_hl << 2;
  1687. X    if (n < iphdrlen + ICMP_MINLEN) {
  1688. X        dlog("icmp: packet too short");
  1689. X        return;
  1690. X    }
  1691. X    n -= iphdrlen;
  1692. X
  1693. X    /*
  1694. X     * analyse
  1695. X     */
  1696. X    p = (struct icmp *) (buf + iphdrlen);
  1697. X    switch(p->icmp_type) {
  1698. X    case ICMP_ECHOREPLY:
  1699. X        /* check if it's response to my echo request */
  1700. X        if (p->icmp_id != (cs_pid & 0xFFFF))
  1701. X            return;
  1702. X        /* check if I have talked with the server */
  1703. X        srvp = srv_findip(from.sin_addr.s_addr);
  1704. X        if (! srvp)
  1705. X            return;
  1706. X        stat = &srvp->stats;
  1707. X        gettimeofday((struct timeval *)&tv, (struct timezone *) 0);
  1708. X        tvsub(&tv, (struct timeval *) p->icmp_data);
  1709. X        rtt = tv.tv_sec * 1000 + (tv.tv_usec / 1000);
  1710. X        stat->icmp_reply++;
  1711. X        if (stat->rtt)
  1712. X            stat->rtt = stat->rtt * 3 / 4 + rtt / 4;
  1713. X        else
  1714. X            stat->rtt = rtt;    /* initial boost */
  1715. X        return;
  1716. X    case ICMP_UNREACH:
  1717. X        switch(p->icmp_code) {
  1718. X        case 2:        /* ICMP_UNREACH_PROTOCOL */
  1719. X            dlog("%s: bad protocol", inet_ntoa(from.sin_addr));
  1720. X            return;
  1721. X        case 3:        /* ICMP_UNREACH_PORT */
  1722. X#if 0    /* it's noisy... */
  1723. X            dlog("%s: bad port", inet_ntoa(from.sin_addr));
  1724. X#endif
  1725. X            return;
  1726. X        case 4:        /* ICMP_UNREACH_NEEDFRAG */
  1727. X            dlog("%s: IP_DF caused drop",
  1728. X                 inet_ntoa(from.sin_addr));
  1729. X            return;
  1730. X        case 5:        /* ICMP_UNREACH_SRCFAIL */
  1731. X            dlog("%s: source route failed",
  1732. X                 inet_ntoa(from.sin_addr));
  1733. X            return;
  1734. X        }
  1735. X        ip = (struct ip *) (buf + iphdrlen + 8);
  1736. X        /* check if it's response to my packet */
  1737. X        if (ip->ip_src.s_addr != cs_ipaddr.s_addr)
  1738. X            return;
  1739. X        /* check if I have talked with the server */
  1740. X        srvp = srv_findip(ip->ip_dst.s_addr);
  1741. X        if (! srvp)
  1742. X            return;
  1743. X        switch(p->icmp_code) {
  1744. X        case 0:        /* ICMP_UNREACH_NET */
  1745. X            dlog("%s: network unreachable", srvp->name);
  1746. X            srv_flag(srvp, WF_SRV_NUNREACH);
  1747. X            thrd_srvfailure(srvp);
  1748. X            return;
  1749. X        case 1:        /* ICMP_UNREACH_HOST */
  1750. X            dlog("%s: host unreachable", srvp->name);
  1751. X            srv_flag(srvp, WF_SRV_HUNREACH);
  1752. X            thrd_srvfailure(srvp);
  1753. X            return;
  1754. X        }
  1755. X        return;
  1756. X    case ICMP_SOURCEQUENCH:
  1757. X        return;
  1758. X    case ICMP_TIMXCEED:
  1759. X        return;
  1760. X    case ICMP_PARAMPROB:
  1761. X        return;
  1762. X    default:
  1763. X#if 0    /* it's noisy... */
  1764. X        dlog("spurious ICMP packet from %s, type=%d",
  1765. X             inet_ntoa(from.sin_addr), p->icmp_type);
  1766. X#endif
  1767. X        return;
  1768. X    }
  1769. X}
  1770. X
  1771. END_OF_FILE
  1772.   if test 6074 -ne `wc -c <'csd/icmp.c'`; then
  1773.     echo shar: \"'csd/icmp.c'\" unpacked with wrong size!
  1774.   fi
  1775.   # end of 'csd/icmp.c'
  1776. fi
  1777. if test -f 'csd/log.c' -a "${1}" != "-c" ; then 
  1778.   echo shar: Will not clobber existing file \"'csd/log.c'\"
  1779. else
  1780.   echo shar: Extracting \"'csd/log.c'\" \(5225 characters\)
  1781.   sed "s/^X//" >'csd/log.c' <<'END_OF_FILE'
  1782. X/* 
  1783. X * WorldWide File System
  1784. X * Copyright (c) 1992,1993 Youki Kadobayashi
  1785. X * Copyright (c) 1992,1993 Osaka University
  1786. X * All rights reserved.
  1787. X *
  1788. X * Permission to use, copy, modify and distribute this software and its
  1789. X * documentation is hereby granted, provided that the following conditions
  1790. X * are met:
  1791. X * 1. Both the copyright notice and this permission notice appear in
  1792. X *    all copies of the software, derivative works or modified versions,
  1793. X *    and any portions thereof, and that both notices appear in
  1794. X *    supporting documentation.
  1795. X * 2. All advertising materials mentioning features or use of this software
  1796. X *    must display the following acknowledgement:
  1797. X *      This product includes software developed by the Osaka University
  1798. X *      and its contributors.
  1799. X * 3. Neither the name of the University nor the names of its contributors
  1800. X *    may be used to endorse or promote products derived from this software
  1801. X *    without specific prior written permission.
  1802. X *
  1803. X * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND OSAKA
  1804. X * UNIVERSITY DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  1805. X * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  1806. X *
  1807. X * Osaka University requests users of this software to return to
  1808. X *
  1809. X *  Youki Kadobayashi
  1810. X *  Department of Information and Computer Sciences
  1811. X *  Osaka University, Toyonaka 560, Osaka, Japan
  1812. X *
  1813. X * any improvements or extensions that they make and grant Osaka
  1814. X * University the rights to redistribute these changes.
  1815. X */
  1816. Xstatic char *AtFSid = "$Header: log.c[109.0] Wed Nov 24 03:47:11 1993 youki-k@is.aist-nara.ac.jp saved $";
  1817. X
  1818. X#include <stdio.h>
  1819. X#ifdef __STDC__
  1820. X#include <stdarg.h>
  1821. X#else
  1822. X#include <varargs.h>
  1823. X#endif
  1824. X#include "wfs.h"
  1825. X#include "global.h"
  1826. X#include "util.h"
  1827. X
  1828. Xstatic void *dlog_callout;
  1829. X
  1830. Xstatic int idle = 0;
  1831. Xstatic int closed = 1;
  1832. Xstatic FILE *logfp;
  1833. X#ifdef _POSIX_SOURCE
  1834. Xstatic char linebuf[BUFSIZ];
  1835. X#endif
  1836. X
  1837. Xstatic int
  1838. Xdlog_open()
  1839. X{
  1840. X    char path[MAXPATHLEN];
  1841. X
  1842. X    sprintf(path, "%s/log/wwfs.log", cs_topdir);
  1843. X    logfp = fopen(path, "a+");
  1844. X    if (logfp == NULL) {
  1845. X        syslog(LOG_WARNING, "%s: %m", path);
  1846. X        return -1;
  1847. X    }
  1848. X    closed = 0;
  1849. X#ifdef _POSIX_SOURCE
  1850. X    setvbuf(logfp, linebuf, _IOLBF, sizeof(linebuf));
  1851. X#else
  1852. X    setlinebuf(logfp);
  1853. X#endif
  1854. X    return 0;
  1855. X}
  1856. X
  1857. X#ifdef __STDC__
  1858. Xvoid
  1859. Xdlog(char *fmt, ...)
  1860. X{
  1861. X    va_list ap;
  1862. X    char *buf, *timestr;
  1863. X    time_t t = gettime();
  1864. X    static time_t last_t = 0;
  1865. X    static char *last_ctime = 0;
  1866. X
  1867. X    buf = so_getbuf(0);
  1868. X    va_start(ap, fmt);
  1869. X    vsprintf(buf, fmt, ap);
  1870. X    va_end(ap);
  1871. X    if (!cs_topdir) {
  1872. X        /* as a last resort.. */
  1873. X        syslog(LOG_WARNING, buf);
  1874. X        return;
  1875. X    }
  1876. X    idle = 0;
  1877. X    if (closed) {
  1878. X        if (dlog_open() < 0) return;
  1879. X    }
  1880. X    if (t != last_t) {
  1881. X        last_ctime = ctime(&t);
  1882. X        last_t = t;
  1883. X    }
  1884. X    fprintf(logfp, "%15.15s %s csd[%d]: %s\n",
  1885. X        last_ctime+4, cs_hostname, cs_pid, buf);
  1886. X}
  1887. X#else
  1888. X
  1889. Xvoid
  1890. Xdlog(va_alist)
  1891. Xva_dcl
  1892. X{
  1893. X    va_list ap;
  1894. X    char *fmt, *buf;
  1895. X    time_t t = gettime();
  1896. X    static time_t last_t = 0;
  1897. X    static char *last_ctime = 0;
  1898. X
  1899. X    buf = so_getbuf(0);
  1900. X    va_start(ap);
  1901. X    fmt = va_arg(ap, char *);
  1902. X    vsprintf(buf, fmt, ap);
  1903. X    va_end(ap);
  1904. X    if (!cs_topdir) {
  1905. X        /* as a last resort.. */
  1906. X        syslog(LOG_WARNING, buf);
  1907. X        return;
  1908. X    }
  1909. X    idle = 0;
  1910. X    if (closed) {
  1911. X        if (dlog_open() < 0) return;
  1912. X    }
  1913. X    if (t != last_t) {
  1914. X        last_ctime = ctime(&t);
  1915. X        last_t = t;
  1916. X    }
  1917. X    fprintf(logfp, "%15.15s %s csd[%d]: %s\n",
  1918. X        last_ctime+4, cs_hostname, cs_pid, buf);
  1919. X}
  1920. X#endif
  1921. X
  1922. X/*
  1923. X * automagically close trace file if no activity has been observed recently.
  1924. X */
  1925. Xstatic void
  1926. Xdlog_gc()
  1927. X{
  1928. X    if (!closed) {
  1929. X        idle += 60;
  1930. X        if (idle > 120) {
  1931. X            fclose(logfp);
  1932. X            closed = 1;
  1933. X        }
  1934. X    }
  1935. X    dlog_callout = timeout_set(gettime()+60, dlog_gc, 0);
  1936. X}
  1937. X
  1938. Xvoid
  1939. Xdlog_start()
  1940. X{
  1941. X    FILE *fp;
  1942. X    char path[MAXPATHLEN];
  1943. X
  1944. X    sprintf(path, "%s/log/csd.pid", cs_topdir);
  1945. X    fp = fopen(path, "w");
  1946. X    if (fp) {
  1947. X        fprintf(fp, "%d", cs_pid);
  1948. X        fclose(fp);
  1949. X    } else {
  1950. X        syslog(LOG_WARNING, "%s: %m", path);
  1951. X    }
  1952. X
  1953. X    dlog_callout = timeout_set(gettime()+60, dlog_gc, 0);
  1954. X}
  1955. X
  1956. Xvoid
  1957. Xdlog_stop()
  1958. X{
  1959. X    if (!closed) {
  1960. X        fclose(logfp);
  1961. X        closed = 1;
  1962. X    }
  1963. X}
  1964. X
  1965. X#if 0    /* XXX for production use */
  1966. Xvoid
  1967. Xerrno_diag()
  1968. X{
  1969. X    syslog(LOG_WARNING, "%m");
  1970. X}
  1971. X#endif
  1972. X
  1973. Xvoid
  1974. Xerrno_log(file, line)
  1975. Xchar *file;
  1976. Xint line;
  1977. X{
  1978. X    extern char *sys_errlist[];
  1979. X    dlog("%s:%d, %s", file, line, sys_errlist[errno]);
  1980. X}
  1981. X
  1982. Xstatic int ts;
  1983. X
  1984. Xvoid
  1985. Xtalk_start()
  1986. X{
  1987. X    sockaddr_in from;
  1988. X    int ret;
  1989. X
  1990. X    ts = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  1991. X    from.sin_family = AF_INET;
  1992. X    from.sin_addr.s_addr = htonl(INADDR_ANY);
  1993. X    from.sin_port = htons(0);
  1994. X    ret = bind(ts, (struct sockaddr *) &from, sizeof (from));
  1995. X    if (ret < 0) {
  1996. X        errno_diag();
  1997. X    }
  1998. X}
  1999. X
  2000. X#ifdef __STDC__
  2001. Xvoid
  2002. Xtalk(long ip_addr, char *fmt, ...)
  2003. X{
  2004. X    va_list ap;
  2005. X    char *buf;
  2006. X    sockaddr_in to;
  2007. X
  2008. X    buf = so_getbuf(0);
  2009. X    va_start(ap, fmt);
  2010. X    vsprintf(buf, fmt, ap);
  2011. X    va_end(ap);
  2012. X    to.sin_family = AF_INET;
  2013. X    to.sin_port = htons(8001);    /* XXX */
  2014. X    to.sin_addr.s_addr = ip_addr;
  2015. X    sendto(ts, buf, strlen(buf)+1, 0, (struct sockaddr *)&to, sizeof(to));
  2016. X}
  2017. X
  2018. X#else
  2019. X
  2020. Xvoid
  2021. Xtalk(va_alist)
  2022. Xva_dcl
  2023. X{
  2024. X    va_list ap;
  2025. X    char *fmt, *buf;
  2026. X    sockaddr_in to;
  2027. X    long ip_addr;
  2028. X
  2029. X    buf = so_getbuf(0);
  2030. X    va_start(ap);
  2031. X    ip_addr = va_arg(ap, long);
  2032. X    fmt = va_arg(ap, char *);
  2033. X    vsprintf(buf, fmt, ap);
  2034. X    va_end(ap);
  2035. X    to.sin_family = AF_INET;
  2036. X    to.sin_port = htons(8001);    /* XXX */
  2037. X    to.sin_addr.s_addr = ip_addr;
  2038. X    sendto(ts, buf, strlen(buf)+1, 0, (struct sockaddr *)&to, sizeof(to));
  2039. X}
  2040. X
  2041. X#endif
  2042. END_OF_FILE
  2043.   if test 5225 -ne `wc -c <'csd/log.c'`; then
  2044.     echo shar: \"'csd/log.c'\" unpacked with wrong size!
  2045.   fi
  2046.   # end of 'csd/log.c'
  2047. fi
  2048. if test -f 'libmm/libmm.pl' -a "${1}" != "-c" ; then 
  2049.   echo shar: Will not clobber existing file \"'libmm/libmm.pl'\"
  2050. else
  2051.   echo shar: Extracting \"'libmm/libmm.pl'\" \(7307 characters\)
  2052.   sed "s/^X//" >'libmm/libmm.pl' <<'END_OF_FILE'
  2053. X# libmm.pl -- package for accessing csd cache.
  2054. X# Author: Youki Kadobayashi <youki@wide.ad.jp>
  2055. X#
  2056. X# It is written in the hope that perl scripts built upon this package
  2057. X# complements features not implemented in csd, thereby enabling much
  2058. X# more advanced features such as cache strategy selection, cache statistics
  2059. X# and cache consistency management.  I have also added UIP commands that
  2060. X# enables close collaboration of csd and these perl programs.
  2061. X#
  2062. X# This package only works on localhost (that is, the machine running csd)
  2063. X# for security reasons.  Current implementation of UIP server restricts
  2064. X# CTOR/RTOC access to localhost.
  2065. X
  2066. X# You may need to run `h2ph' on `sys/socket.h' to get the proper values
  2067. X# handy in a perl library file.
  2068. Xrequire 'sys/socket.ph' || die $!;
  2069. X
  2070. Xpackage mm;
  2071. X$S_IFDIR = 040000;    # because most of you don't have 'sys/stat.pl'...
  2072. X$S_IFREG = 0100000;
  2073. X
  2074. X#
  2075. X#    initialization: create UDP socket for UIP.
  2076. X#
  2077. X$uip_port = 8002;
  2078. X$sockaddr = 'S n a4 x8';
  2079. X@addr = gethostbyname('localhost');
  2080. X$localip = pop(@addr);
  2081. X$laddr = pack($sockaddr, &'AF_INET, 0, $localip);
  2082. X$faddr = pack($sockaddr, &'AF_INET, $uip_port, $localip);
  2083. Xsocket(SO, &'AF_INET, &'SOCK_DGRAM, 0) || die $!;
  2084. Xbind(SO, $laddr) || die $!;
  2085. X
  2086. X$serial = 0;
  2087. X$debug = 0;            # 1 if you want to debug your code
  2088. X
  2089. Xsub uip_send
  2090. X{
  2091. X    local ($msg) = @_;
  2092. X    send(SO, "$msg\n", 0, $faddr);
  2093. X    print "$msg\n" if $debug;
  2094. X}
  2095. X
  2096. Xsub uip_recv
  2097. X{
  2098. X    local ($msg, $from);
  2099. X    do {
  2100. X    $from = recv(SO, $msg, 256, 0);
  2101. X    print "$msg" if $debug;
  2102. X    } until unpack("x4 a4 x8", $from) eq $localip;
  2103. X    return $msg;
  2104. X}
  2105. X
  2106. X#
  2107. X#    mm'fstoc: convert from real (filesystem) pathname to cache pathname.
  2108. X#    static.
  2109. X#
  2110. Xsub fstoc
  2111. X{
  2112. X    local ($path, $type) = @_;
  2113. X    local ($cachepath, $msg);
  2114. X
  2115. X    if ($type == $S_IFDIR) {
  2116. X    # convert it to the pathname of a cached directory information,
  2117. X    # namely, "%s/%lx/dir/%lx"
  2118. X    &uip_send("RTOC dir $path");
  2119. X    }
  2120. X    elsif ($type == $S_IFREG) {
  2121. X    # convert it to the pathname of a cached file,
  2122. X    # namely, "%s/%lx/%lx/%s"
  2123. X    &uip_send("RTOC fil $path");
  2124. X    }
  2125. X    else {
  2126. X    $error = "fstoc: unsupported file type: $type\n";
  2127. X    return undef;
  2128. X    }
  2129. X
  2130. X    while (1) {
  2131. X    $msg = &uip_recv;
  2132. X    if ($msg =~ /^2..\.... c_p /) {
  2133. X        # we got cache path
  2134. X        $cachepath = $';
  2135. X        chop $cachepath;
  2136. X        return ($cachepath);    # unique pathname can be the key
  2137. X    }
  2138. X    elsif ($msg =~ /^[45]..\.... /) {
  2139. X        $error = $';
  2140. X        return undef;
  2141. X    }
  2142. X    }
  2143. X}
  2144. X
  2145. Xsub dir_file
  2146. X{
  2147. X    local ($path) = @_;
  2148. X    local ($dir, $file, @components);
  2149. X
  2150. X    @components = split(m:/+:, $path);
  2151. X    $file = pop(@components);
  2152. X    $dir = join('/', @components);
  2153. X    return ($dir, $file);
  2154. X}
  2155. X
  2156. X#
  2157. X#    mm'ctofs: convert from cache pathname to real (filesystem) pathname.
  2158. X#    static.
  2159. X#
  2160. Xsub ctofs
  2161. X{
  2162. X    local ($path) = @_;
  2163. X    local (@res, $realpath);
  2164. X    local ($dir, $file);
  2165. X
  2166. X    @res = stat($path);
  2167. X    if ($res[2] & $S_IFDIR) {
  2168. X    open(IN, "< $path/.realdir") || return undef;
  2169. X    $realpath = <IN>; close(IN);
  2170. X    return $realpath;
  2171. X    }
  2172. X    elsif ($res[2] & $S_IFREG) {
  2173. X    ($dir, $file) = &dir_file($path);
  2174. X    open(IN, "$dir/.realdir") || return undef;
  2175. X    $realpath = <IN>; close(IN);
  2176. X    return "$realpath/$file";
  2177. X    }
  2178. X    else {
  2179. X    $error = "ctofs: no such file or directory: $path\n";
  2180. X    return undef;
  2181. X    }
  2182. X}
  2183. X
  2184. X#
  2185. X#    &mm'opendir(*DIRHANDLE, pathname)
  2186. X#
  2187. Xsub opendir
  2188. X{
  2189. X    local (*DIR, $pathname) = @_;
  2190. X    local ($cachepath, $key, $size);
  2191. X    local ($magic, $namelen, $name, $ctime, $nfile);
  2192. X
  2193. X    $cachepath = &fstoc($pathname, $S_IFDIR) || return undef;
  2194. X    open(DIR, "<$cachepath") || return undef;
  2195. X    $key = fileno(DIR);        # use file number as the unique key
  2196. X    $size = (stat(DIR))[7];
  2197. X    $list{$key} = "";        # otherwise bad address occur
  2198. X    read(DIR, $list{$key}, $size) || return undef;
  2199. X
  2200. X    ($namelen) = unpack("x4 i", $list{$key});
  2201. X    ($magic, $name, $ctime, $nfile) = unpack("l x4 A$namelen l i",$list{$key});
  2202. X    $name{$key} = $name;
  2203. X    $ctime{$key} = $ctime;
  2204. X    $nfile{$key} = $nfile;
  2205. X    $index{$key} = 0;
  2206. X    $offset{$key} = 4 * 4 + $namelen;
  2207. X    1;
  2208. X}
  2209. X
  2210. X#
  2211. X#    &mm'closedir(*DIRHANDLE)
  2212. X#
  2213. Xsub closedir
  2214. X{
  2215. X    local (*DIR) = @_;
  2216. X    local ($key) = fileno(DIR);
  2217. X
  2218. X    close(DIR);
  2219. X    # conserve memory...
  2220. X    undef($list{$key});
  2221. X    undef($name{$key});
  2222. X    undef($ctime{$key});
  2223. X    undef($nfile{$key});
  2224. X    undef($index{$key});
  2225. X    undef($offset{$key});
  2226. X    0;
  2227. X}
  2228. X
  2229. X#
  2230. X#    ($name, $link, $type, $crc, $ausec, $musec, $cusec,
  2231. X#     $fsid, $fid, $mode, $nlink, $uid, $gid, $rdev, $size,
  2232. X#     $asec, $msec, $csec, $blocksize, $blocks)
  2233. X#        = &mm'getnext(*DIRHANDLE)
  2234. X#
  2235. X#    getnext: readdir + stat complex.  Return next directory entry.
  2236. X#    mm'opendir must be called before getnext.
  2237. X#
  2238. Xsub getnext
  2239. X{
  2240. X    local (*DIR) = @_;
  2241. X    local ($key) = fileno(DIR);
  2242. X    local ($namelen, $linklen, $name, $link);
  2243. X    local ($fid, $type, $mode, $nlink, $uid, $gid,
  2244. X       $size, $blocksize, $rdev, $blocks, $fsid, $crc,
  2245. X       $asec, $ausec, $msec, $musec, $csec, $cusec);
  2246. X    local ($off) = $offset{$key};
  2247. X
  2248. X    die "getnext: directory not opened\n" if !defined($name{$key});
  2249. X    return () if (++$index{$key} >= $nfile{$key});
  2250. X    ($fid, $namelen) = unpack("x$off l l", $list{$key});
  2251. X    ($name) = unpack("x$off x8 A$namelen", $list{$key});
  2252. X    ($linklen) = unpack("x$off x8 x$namelen l", $list{$key});
  2253. X    ($link) = unpack("x$off x8 x$namelen x4 A$linklen", $list{$key});
  2254. X    $off += 12 + $namelen + $linklen;
  2255. X    ($type, $mode, $nlink, 
  2256. X     $uid, $gid, $size, $blocksize, $rdev, $blocks, $fsid, $crc,
  2257. X     $asec, $ausec, $msec, $musec, $csec, $cusec)
  2258. X    = unpack("x$off l l l l l l l l l l l l l l l l l", $list{$key});
  2259. X    $off += 4 * 17;
  2260. X    $offset{$key} = $off;
  2261. X
  2262. X    return ($name, $link, $type, $crc, $ausec, $musec, $cusec,
  2263. X        $fsid, $fid, $mode, $nlink, $uid, $gid, $rdev, $size,
  2264. X        $asec, $msec, $csec, $blocksize, $blocks)
  2265. X}
  2266. X
  2267. X#
  2268. X#    $name = &mm'readdir(*DIRHANDLE)
  2269. X#    @names = &mm'readdir(*DIRHANDLE)
  2270. X#
  2271. X#    In array context, return list of filenames.
  2272. X#    In scalar context, return next directory entry.
  2273. X#
  2274. Xsub readdir
  2275. X{
  2276. X    local (*DIR) = @_;
  2277. X    local ($key) = fileno(DIR);
  2278. X    local (@files, $i);
  2279. X
  2280. X    die "readdir: directory not opened\n" if !defined($name{$key});
  2281. X    if (wantarray) {
  2282. X    for ($i = 0; $i < $nfile{$key}; ++$i) {
  2283. X        push(@files, (&getnext(*DIR))[0]);
  2284. X    }
  2285. X    return @files;
  2286. X    }
  2287. X    return (&getnext(*DIR))[0];
  2288. X}
  2289. X
  2290. X#
  2291. X#    rewinddir, seekdir, telldir is not implemented yet.
  2292. X#    do you need it?
  2293. X#
  2294. X
  2295. X#
  2296. X#    ($fsid, $fid, $mode, $nlink, $uid, $gid, $rdev, $size,
  2297. X#     $asec, $msec, $csec, $blocksize, $blocks)
  2298. X#        = &mm'stat(*DIRHANDLE, $filename)
  2299. X#
  2300. X#    Stat call is heavyweight in this library.  Not recommended.
  2301. X#    As a penalty, I made it incompatible with stat system call.
  2302. X#
  2303. Xsub stat
  2304. X{
  2305. X    local (*DIR, $filename) = @_;
  2306. X    local ($key) = fileno(DIR);
  2307. X    local (@res, $i);
  2308. X
  2309. X    for ($i = 0; $i < $nfile{$key}; ++$i) {
  2310. X    @res = &getnext(*DIR);
  2311. X    if ($res[0] eq $filename) {
  2312. X        return @res[7 .. $#res];
  2313. X    }
  2314. X    }
  2315. X    -1;        # errno = ENOENT
  2316. X}
  2317. X
  2318. X#
  2319. X#    $status = &mm'open(FILEHANDLE, EXPR)
  2320. X#
  2321. Xsub open
  2322. X{
  2323. X    local (*FH, $expr) = @_;
  2324. X    local ($key, $pos, $flag, $pathname);
  2325. X
  2326. X    $pos = index($expr, "/");
  2327. X    if ($pos < 0) {
  2328. X    open(FH, $expr) || return undef;
  2329. X    return 1;
  2330. X    }
  2331. X    ($flag, $pathname) = unpack("a$pos a*", $expr);
  2332. X    $key = &fstoc($pathname, $S_IFREG) || return undef;
  2333. X    open(FH, "$flag$key") || return undef;
  2334. X    return 1;
  2335. X}
  2336. X
  2337. X#
  2338. X#    There are no counterpart for built-in functions like
  2339. X#    read(), write(), seek() and close(); they just work fine.
  2340. X#
  2341. X
  2342. X1;
  2343. END_OF_FILE
  2344.   if test 7307 -ne `wc -c <'libmm/libmm.pl'`; then
  2345.     echo shar: \"'libmm/libmm.pl'\" unpacked with wrong size!
  2346.   fi
  2347.   # end of 'libmm/libmm.pl'
  2348. fi
  2349. if test -f 'mosaic/dirutil.pl' -a "${1}" != "-c" ; then 
  2350.   echo shar: Will not clobber existing file \"'mosaic/dirutil.pl'\"
  2351. else
  2352.   echo shar: Extracting \"'mosaic/dirutil.pl'\" \(755 characters\)
  2353.   sed "s/^X//" >'mosaic/dirutil.pl' <<'END_OF_FILE'
  2354. X# dirutil: directory-related goodies
  2355. X# Youki Kadobayashi <youki@wide.ad.jp>
  2356. X# This file is part of WWFS.
  2357. X#
  2358. X
  2359. Xsub basename {
  2360. X    local ($pathname) = @_;
  2361. X    local ($dir, $file, $pos);
  2362. X
  2363. X    $pos = rindex($pathname, "/");
  2364. X    if ($pos < 0) {
  2365. X        return (".", $pathname);
  2366. X    }
  2367. X    ++$pos;
  2368. X    ($dir, $file) = unpack("a$pos a*", $pathname);
  2369. X    return ($dir, $file);
  2370. X}
  2371. X
  2372. Xsub mkdirhier {
  2373. X        local($dir) = @_;
  2374. X        local($mk, @components);
  2375. X        # four-line implementation
  2376. X    @components = split (/\//, $dir);
  2377. X    $mk = shift(@components);
  2378. X        foreach $i (@components) {
  2379. X                $mk .= "/" . $i;
  2380. X        next if -d $mk;
  2381. X                mkdir($mk, 0755) || warn "$mk: $!" && return undef;
  2382. X        }
  2383. X    1;
  2384. X}
  2385. X
  2386. X1;
  2387. X
  2388. X# Local Variables:
  2389. X# mode: perl
  2390. X# End:
  2391. END_OF_FILE
  2392.   if test 755 -ne `wc -c <'mosaic/dirutil.pl'`; then
  2393.     echo shar: \"'mosaic/dirutil.pl'\" unpacked with wrong size!
  2394.   fi
  2395.   # end of 'mosaic/dirutil.pl'
  2396. fi
  2397. if test -f 'rpc/cs_prot.x' -a "${1}" != "-c" ; then 
  2398.   echo shar: Will not clobber existing file \"'rpc/cs_prot.x'\"
  2399. else
  2400.   echo shar: Extracting \"'rpc/cs_prot.x'\" \(7575 characters\)
  2401.   sed "s/^X//" >'rpc/cs_prot.x' <<'END_OF_FILE'
  2402. X/* 
  2403. X * WorldWide File System
  2404. X * Copyright (c) 1992,1993 Youki Kadobayashi
  2405. X * Copyright (c) 1992,1993 Osaka University
  2406. X * All rights reserved.
  2407. X *
  2408. X * Permission to use, copy, modify and distribute this software and its
  2409. X * documentation is hereby granted, provided that the following conditions
  2410. X * are met:
  2411. X * 1. Both the copyright notice and this permission notice appear in
  2412. X *    all copies of the software, derivative works or modified versions,
  2413. X *    and any portions thereof, and that both notices appear in
  2414. X *    supporting documentation.
  2415. X * 2. All advertising materials mentioning features or use of this software
  2416. X *    must display the following acknowledgement:
  2417. X *      This product includes software developed by the Osaka University
  2418. X *      and its contributors.
  2419. X * 3. Neither the name of the University nor the names of its contributors
  2420. X *    may be used to endorse or promote products derived from this software
  2421. X *    without specific prior written permission.
  2422. X *
  2423. X * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND OSAKA
  2424. X * UNIVERSITY DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  2425. X * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  2426. X *
  2427. X * Osaka University requests users of this software to return to
  2428. X *
  2429. X *  Youki Kadobayashi
  2430. X *  Department of Information and Computer Sciences
  2431. X *  Osaka University, Toyonaka 560, Osaka, Japan
  2432. X *
  2433. X * any improvements or extensions that they make and grant Osaka
  2434. X * University the rights to redistribute these changes.
  2435. X */
  2436. X/* RPC stubs for CS (WWFS Cluster Server) protocol. */
  2437. X/* $Header: cs_prot.x[109.0] Wed Nov 24 03:50:23 1993 youki-k@is.aist-nara.ac.jp saved $ */
  2438. X
  2439. Xconst CS_MAXDATA    = 8192;        /* as per NFS */
  2440. Xconst CS_FHSIZE        = 32;        /* as per NFS */
  2441. Xconst CS_MAXPATHLEN    = 1024;        /* sys/param.h */
  2442. Xconst CS_MAXNAMLEN    = 255;        /* sys/dir.h etc., vary */
  2443. Xconst CS_MAXHOSTLEN    = 64;        /* sys/param.h */
  2444. X
  2445. Xenum cs_stat {
  2446. X    CS_OK = 0,        /* Okay */
  2447. X    CS_BULK = 201,        /* Bulk data transfer */
  2448. X    CS_WAIT = 202,        /* Operation would block */
  2449. X    CSERR_NOENT = 2,    /* No such file or directory */
  2450. X    CSERR_ACCES = 13,    /* Access denied */
  2451. X    CSERR_NOTDIR = 20,    /* Not a directory */
  2452. X    CSERR_ISDIR = 21,    /* Is a directory */
  2453. X    CSERR_FBIG = 27,    /* File too large */
  2454. X    CSERR_NOSPC = 28,    /* No space left on device */
  2455. X    CSERR_ROFS = 30,    /* Read-only file system */
  2456. X    CSERR_STALE = 70,    /* Stale filehandle */
  2457. X    CSERR_OTHER = 100,    /* Other errors; use geterr */
  2458. X    CSERR_ALREADY = 101,    /* Operation already in progress */
  2459. X    CSERR_PROTO = 102,    /* Protocol not available */
  2460. X    CSERR_NDOWN = 103,    /* Network is down */
  2461. X    CSERR_NUNREACH = 104,    /* Network unreachable */
  2462. X    CSERR_XABORT = 105,    /* Transfer aborted */
  2463. X    CSERR_TIMEOUT = 106,    /* Connection timed out */
  2464. X    CSERR_REFUSED = 107,    /* Connection refused */
  2465. X    CSERR_HDOWN = 108,    /* Host is down */
  2466. X    CSERR_HUNREACH = 109,    /* No route to host */
  2467. X    CSERR_NQUOT = 110    /* Network quota exceeded */
  2468. X};
  2469. X
  2470. X#ifndef RPC_XDR
  2471. X%#ifndef NFS_FH_DEFINED
  2472. X
  2473. X/* NFS compatible type definitions */
  2474. Xstruct nfs_fh {
  2475. X    opaque data[CS_FHSIZE];
  2476. X};
  2477. X
  2478. Xtypedef string filename<CS_MAXNAMLEN>; 
  2479. Xtypedef string nfspath<CS_MAXPATHLEN>;
  2480. X
  2481. Xstruct nfstime {
  2482. X    unsigned seconds;
  2483. X    unsigned useconds;
  2484. X};
  2485. X
  2486. Xenum ftype {
  2487. X    NFNON = 0,    /* non-file */
  2488. X    NFREG = 1,    /* regular file */
  2489. X    NFDIR = 2,    /* directory */
  2490. X    NFBLK = 3,    /* block special */
  2491. X    NFCHR = 4,    /* character special */
  2492. X    NFLNK = 5,    /* symbolic link */
  2493. X    NFSOCK = 6,    /* unix domain sockets */
  2494. X    NFBAD = 7,    /* unused */
  2495. X    NFFIFO = 8     /* named pipe */
  2496. X};
  2497. X
  2498. Xstruct fattr {
  2499. X    ftype type;        /* file type */
  2500. X    unsigned mode;        /* protection mode bits */
  2501. X    unsigned nlink;        /* # hard links */
  2502. X    unsigned uid;        /* owner user id */
  2503. X    unsigned gid;        /* owner group id */
  2504. X    unsigned size;        /* file size in bytes */
  2505. X    unsigned blocksize;    /* prefered block size */
  2506. X    unsigned rdev;        /* special device # */
  2507. X    unsigned blocks;    /* Kb of disk used by file */
  2508. X    unsigned fsid;        /* device # */
  2509. X    unsigned fileid;    /* inode # */
  2510. X    nfstime    atime;        /* time of last access */
  2511. X    nfstime    mtime;        /* time of last modification */
  2512. X    nfstime    ctime;        /* time of last change */
  2513. X};
  2514. X/* end of NFS compatible type definitions */
  2515. X
  2516. X%#define NFS_FH_DEFINED
  2517. X%#endif
  2518. X#endif
  2519. X
  2520. Xunion cs_fhres switch (cs_stat status) {
  2521. X    case CS_OK:
  2522. X        nfs_fh    file;
  2523. X    default:
  2524. X        long    err_context;
  2525. X};
  2526. X
  2527. Xunion cs_res switch (cs_stat status) {
  2528. X    case CS_OK:
  2529. X        void;
  2530. X    default:
  2531. X        long    err_context;
  2532. X};
  2533. X
  2534. Xtypedef string volname<CS_MAXNAMLEN>;
  2535. X
  2536. Xstruct cs_volargs {
  2537. X    volname        vol;
  2538. X};
  2539. X
  2540. Xstruct cs_volokres {
  2541. X    long    volume_id;
  2542. X    /* verbatim copy from wfs.h */
  2543. X    long    bytes_to_server;    /* # of bytes sent to servers */
  2544. X    long    bytes_from_server;    /* # of bytes received from servers */
  2545. X    long    bytes_to_client;    /* # of bytes sent to clients */
  2546. X    long    bytes_from_client;    /* # of bytes received from clients */
  2547. X    long    n_request_readdir;    /* # of readdir requests */
  2548. X    long    n_request_lookup;    /* # of lookup requests */
  2549. X    long    n_request_read;        /* # of read requests */
  2550. X    long    n_request_readdir_miss;    /* # of readdir actually done */
  2551. X    long    n_request_lookup_miss;    /* # of lookup actually done */
  2552. X    long    n_request_read_miss;    /* # of read actually done */
  2553. X};
  2554. X
  2555. Xunion cs_volres switch (cs_stat status) {
  2556. X    case CS_OK:
  2557. X        cs_volokres volok;
  2558. X    default:
  2559. X        long    err_context;
  2560. X};
  2561. X
  2562. Xstruct cs_xferent {
  2563. X    int    status;
  2564. X    int    uid;        /* uid of originator */
  2565. X    int    gid;        /* gid of originator */
  2566. X    long    ip_address;    /* hostname of originator */
  2567. X    long    bytes;        /* done so far */
  2568. X    int    idle;        /* risky but no response */
  2569. X    char    server<CS_MAXHOSTLEN>;    /* server name */
  2570. X};
  2571. X
  2572. Xunion cs_xferres switch (cs_stat status) {
  2573. X    case CS_OK:
  2574. X        cs_xferent xfer;
  2575. X    default:
  2576. X        long    err_context;
  2577. X};
  2578. X
  2579. Xstruct cs_udaargs {
  2580. X    nfs_fh        file;
  2581. X    string        attrname<CS_MAXNAMLEN>;
  2582. X};
  2583. X
  2584. Xunion cs_udares switch (cs_stat status) {
  2585. X    case CS_OK:
  2586. X        char    attr<CS_MAXDATA>;    /* attribute value */
  2587. X    default:
  2588. X        long    err_context;
  2589. X};
  2590. X
  2591. Xstruct cs_diropargs {
  2592. X    nfspath        pname;
  2593. X    filename    fname;
  2594. X};
  2595. X
  2596. Xstruct cs_diropokres {
  2597. X    nfs_fh    file;
  2598. X    fattr    attr;
  2599. X};
  2600. X
  2601. Xunion cs_diropres switch (cs_stat status) {
  2602. X    case CS_OK:
  2603. X        cs_diropokres diropok;
  2604. X    default:
  2605. X        long    err_context;
  2606. X};
  2607. X
  2608. Xstruct cs_readdirargs {
  2609. X    nfs_fh        dir;
  2610. X    long        cookie;
  2611. X    unsigned    count;
  2612. X};
  2613. X
  2614. Xstruct cs_dirent {
  2615. X    unsigned    fileid;
  2616. X    filename    name;
  2617. X    fattr        attr;
  2618. X    cs_dirent    *nextentry;
  2619. X};
  2620. X
  2621. Xstruct cs_readdirokres {
  2622. X    cs_dirent    *entries;
  2623. X    bool        eof;
  2624. X};
  2625. X
  2626. Xunion cs_readdirres switch (cs_stat status) {
  2627. X    case CS_OK:
  2628. X        cs_readdirokres readdirok;
  2629. X    default:
  2630. X        long    err_context;
  2631. X};
  2632. X
  2633. Xstruct cs_readargs {
  2634. X    nfs_fh        file;
  2635. X    unsigned    offset;
  2636. X    unsigned    count;
  2637. X    unsigned    totalcount;
  2638. X    bool        prefer_bulk;    /* prefer bulk data xfer */
  2639. X};
  2640. X
  2641. Xstruct cs_readokres {
  2642. X    fattr    attr;
  2643. X    opaque    data<CS_MAXDATA>;
  2644. X};
  2645. X
  2646. Xstruct cs_readbulkres {
  2647. X    fattr    attr;
  2648. X    long    sin_port;
  2649. X};
  2650. X
  2651. Xunion cs_readres switch (cs_stat status) {
  2652. X    case CS_OK:
  2653. X        cs_readokres readok;
  2654. X    case CS_BULK:
  2655. X        cs_readbulkres readbulk;
  2656. X    default:
  2657. X        long    err_context;
  2658. X};
  2659. X
  2660. Xstruct cs_geterrargs {
  2661. X    long    err_context;
  2662. X};
  2663. X
  2664. Xunion cs_geterrres switch (cs_stat status) {
  2665. X    case CS_OK:
  2666. X        string err_string<CS_MAXNAMLEN>;
  2667. X    default:
  2668. X        void;
  2669. X};
  2670. X
  2671. Xprogram CS_PROGRAM {
  2672. X    version CS_VERSION {
  2673. X        void
  2674. X        CS_PROC_NULL(void) = 0;
  2675. X
  2676. X        int
  2677. X        CS_PROC_GETPORT(void) = 1;    /* obsolete */
  2678. X
  2679. X        cs_fhres
  2680. X        CS_PROC_REGISTER(void) = 2;
  2681. X
  2682. X        cs_res
  2683. X        CS_PROC_UNREGISTER(void) = 3;
  2684. X
  2685. X        cs_res
  2686. X        CS_PROC_MOUNT(cs_volargs) = 4;
  2687. X
  2688. X        cs_res
  2689. X        CS_PROC_UMOUNT(cs_volargs) = 5;
  2690. X
  2691. X        cs_diropres
  2692. X        CS_PROC_LOOKUP(cs_diropargs) = 6;
  2693. X
  2694. X        cs_readdirres
  2695. X        CS_PROC_READDIR(cs_readdirargs) = 7;
  2696. X
  2697. X        cs_readres
  2698. X        CS_PROC_READ(cs_readargs) = 8;
  2699. X
  2700. X        cs_volres
  2701. X        CS_PROC_GETVOL(cs_volargs) = 9;
  2702. X
  2703. X        cs_xferres
  2704. X        CS_PROC_GETXFER(nfs_fh) = 10;
  2705. X
  2706. X        cs_udares
  2707. X        CS_PROC_GETUDA(cs_udaargs) = 11;
  2708. X
  2709. X        cs_geterrres
  2710. X        CS_PROC_GETERR(cs_geterrargs) = 12;
  2711. X
  2712. X    } = 1;
  2713. X} = 300128;    /* XXX unlikely to be assigned */
  2714. END_OF_FILE
  2715.   if test 7575 -ne `wc -c <'rpc/cs_prot.x'`; then
  2716.     echo shar: \"'rpc/cs_prot.x'\" unpacked with wrong size!
  2717.   fi
  2718.   # end of 'rpc/cs_prot.x'
  2719. fi
  2720. if test -f 'rpc/nfs_prot.h' -a "${1}" != "-c" ; then 
  2721.   echo shar: Will not clobber existing file \"'rpc/nfs_prot.h'\"
  2722. else
  2723.   echo shar: Extracting \"'rpc/nfs_prot.h'\" \(6080 characters\)
  2724.   sed "s/^X//" >'rpc/nfs_prot.h' <<'END_OF_FILE'
  2725. X/*
  2726. X * Please do not edit this file.
  2727. X * It was generated using rpcgen.
  2728. X */
  2729. X
  2730. X#include <rpc/types.h>
  2731. X
  2732. X#define NFS_PORT 2049
  2733. X#define NFS_MAXDATA 8192
  2734. X#define NFS_MAXPATHLEN 1024
  2735. X#define NFS_MAXNAMLEN 255
  2736. X#define NFS_FHSIZE 32
  2737. X#define NFS_COOKIESIZE 4
  2738. X#define NFS_FIFO_DEV -1
  2739. X#define NFSMODE_FMT 0170000
  2740. X#define NFSMODE_DIR 0040000
  2741. X#define NFSMODE_CHR 0020000
  2742. X#define NFSMODE_BLK 0060000
  2743. X#define NFSMODE_REG 0100000
  2744. X#define NFSMODE_LNK 0120000
  2745. X#define NFSMODE_SOCK 0140000
  2746. X#define NFSMODE_FIFO 0010000
  2747. X
  2748. Xenum nfsstat {
  2749. X    NFS_OK = 0,
  2750. X    NFSERR_PERM = 1,
  2751. X    NFSERR_NOENT = 2,
  2752. X    NFSERR_IO = 5,
  2753. X    NFSERR_NXIO = 6,
  2754. X    NFSERR_ACCES = 13,
  2755. X    NFSERR_EXIST = 17,
  2756. X    NFSERR_NODEV = 19,
  2757. X    NFSERR_NOTDIR = 20,
  2758. X    NFSERR_ISDIR = 21,
  2759. X    NFSERR_FBIG = 27,
  2760. X    NFSERR_NOSPC = 28,
  2761. X    NFSERR_ROFS = 30,
  2762. X    NFSERR_NAMETOOLONG = 63,
  2763. X    NFSERR_NOTEMPTY = 66,
  2764. X    NFSERR_DQUOT = 69,
  2765. X    NFSERR_STALE = 70,
  2766. X    NFSERR_WFLUSH = 99,
  2767. X};
  2768. Xtypedef enum nfsstat nfsstat;
  2769. Xbool_t xdr_nfsstat();
  2770. X
  2771. Xenum ftype {
  2772. X    NFNON = 0,
  2773. X    NFREG = 1,
  2774. X    NFDIR = 2,
  2775. X    NFBLK = 3,
  2776. X    NFCHR = 4,
  2777. X    NFLNK = 5,
  2778. X    NFSOCK = 6,
  2779. X    NFBAD = 7,
  2780. X    NFFIFO = 8,
  2781. X};
  2782. Xtypedef enum ftype ftype;
  2783. Xbool_t xdr_ftype();
  2784. X#ifndef NFS_FH_DEFINED    /* nfs_fh has been declared in cs_prot.h */
  2785. X
  2786. Xstruct nfs_fh {
  2787. X    char data[NFS_FHSIZE];
  2788. X};
  2789. Xtypedef struct nfs_fh nfs_fh;
  2790. Xbool_t xdr_nfs_fh();
  2791. X#define NFS_FH_DEFINED
  2792. X#endif
  2793. X
  2794. Xstruct nfstime {
  2795. X    u_int seconds;
  2796. X    u_int useconds;
  2797. X};
  2798. Xtypedef struct nfstime nfstime;
  2799. Xbool_t xdr_nfstime();
  2800. X
  2801. Xstruct fattr {
  2802. X    ftype type;
  2803. X    u_int mode;
  2804. X    u_int nlink;
  2805. X    u_int uid;
  2806. X    u_int gid;
  2807. X    u_int size;
  2808. X    u_int blocksize;
  2809. X    u_int rdev;
  2810. X    u_int blocks;
  2811. X    u_int fsid;
  2812. X    u_int fileid;
  2813. X    nfstime atime;
  2814. X    nfstime mtime;
  2815. X    nfstime ctime;
  2816. X};
  2817. Xtypedef struct fattr fattr;
  2818. Xbool_t xdr_fattr();
  2819. X
  2820. Xstruct sattr {
  2821. X    u_int mode;
  2822. X    u_int uid;
  2823. X    u_int gid;
  2824. X    u_int size;
  2825. X    nfstime atime;
  2826. X    nfstime mtime;
  2827. X};
  2828. Xtypedef struct sattr sattr;
  2829. Xbool_t xdr_sattr();
  2830. X
  2831. Xtypedef char *filename;
  2832. Xbool_t xdr_filename();
  2833. X
  2834. Xtypedef char *nfspath;
  2835. Xbool_t xdr_nfspath();
  2836. X
  2837. Xstruct attrstat {
  2838. X    nfsstat status;
  2839. X    union {
  2840. X        fattr attributes;
  2841. X    } attrstat_u;
  2842. X};
  2843. Xtypedef struct attrstat attrstat;
  2844. Xbool_t xdr_attrstat();
  2845. X
  2846. Xstruct sattrargs {
  2847. X    nfs_fh file;
  2848. X    sattr attributes;
  2849. X};
  2850. Xtypedef struct sattrargs sattrargs;
  2851. Xbool_t xdr_sattrargs();
  2852. X
  2853. Xstruct diropargs {
  2854. X    nfs_fh dir;
  2855. X    filename name;
  2856. X};
  2857. Xtypedef struct diropargs diropargs;
  2858. Xbool_t xdr_diropargs();
  2859. X
  2860. Xstruct diropokres {
  2861. X    nfs_fh file;
  2862. X    fattr attributes;
  2863. X};
  2864. Xtypedef struct diropokres diropokres;
  2865. Xbool_t xdr_diropokres();
  2866. X
  2867. Xstruct diropres {
  2868. X    nfsstat status;
  2869. X    union {
  2870. X        diropokres diropres;
  2871. X    } diropres_u;
  2872. X};
  2873. Xtypedef struct diropres diropres;
  2874. Xbool_t xdr_diropres();
  2875. X
  2876. Xstruct readlinkres {
  2877. X    nfsstat status;
  2878. X    union {
  2879. X        nfspath data;
  2880. X    } readlinkres_u;
  2881. X};
  2882. Xtypedef struct readlinkres readlinkres;
  2883. Xbool_t xdr_readlinkres();
  2884. X
  2885. Xstruct readargs {
  2886. X    nfs_fh file;
  2887. X    u_int offset;
  2888. X    u_int count;
  2889. X    u_int totalcount;
  2890. X};
  2891. Xtypedef struct readargs readargs;
  2892. Xbool_t xdr_readargs();
  2893. X
  2894. Xstruct readokres {
  2895. X    fattr attributes;
  2896. X    struct {
  2897. X        u_int data_len;
  2898. X        char *data_val;
  2899. X    } data;
  2900. X};
  2901. Xtypedef struct readokres readokres;
  2902. Xbool_t xdr_readokres();
  2903. X
  2904. Xstruct readres {
  2905. X    nfsstat status;
  2906. X    union {
  2907. X        readokres reply;
  2908. X    } readres_u;
  2909. X};
  2910. Xtypedef struct readres readres;
  2911. Xbool_t xdr_readres();
  2912. X
  2913. Xstruct writeargs {
  2914. X    nfs_fh file;
  2915. X    u_int beginoffset;
  2916. X    u_int offset;
  2917. X    u_int totalcount;
  2918. X    struct {
  2919. X        u_int data_len;
  2920. X        char *data_val;
  2921. X    } data;
  2922. X};
  2923. Xtypedef struct writeargs writeargs;
  2924. Xbool_t xdr_writeargs();
  2925. X
  2926. Xstruct createargs {
  2927. X    diropargs where;
  2928. X    sattr attributes;
  2929. X};
  2930. Xtypedef struct createargs createargs;
  2931. Xbool_t xdr_createargs();
  2932. X
  2933. Xstruct renameargs {
  2934. X    diropargs from;
  2935. X    diropargs to;
  2936. X};
  2937. Xtypedef struct renameargs renameargs;
  2938. Xbool_t xdr_renameargs();
  2939. X
  2940. Xstruct linkargs {
  2941. X    nfs_fh from;
  2942. X    diropargs to;
  2943. X};
  2944. Xtypedef struct linkargs linkargs;
  2945. Xbool_t xdr_linkargs();
  2946. X
  2947. Xstruct symlinkargs {
  2948. X    diropargs from;
  2949. X    nfspath to;
  2950. X    sattr attributes;
  2951. X};
  2952. Xtypedef struct symlinkargs symlinkargs;
  2953. Xbool_t xdr_symlinkargs();
  2954. X
  2955. Xtypedef char nfscookie[NFS_COOKIESIZE];
  2956. Xbool_t xdr_nfscookie();
  2957. X
  2958. Xstruct readdirargs {
  2959. X    nfs_fh dir;
  2960. X    nfscookie cookie;
  2961. X    u_int count;
  2962. X};
  2963. Xtypedef struct readdirargs readdirargs;
  2964. Xbool_t xdr_readdirargs();
  2965. X
  2966. Xstruct entry {
  2967. X    u_int fileid;
  2968. X    filename name;
  2969. X    nfscookie cookie;
  2970. X    struct entry *nextentry;
  2971. X};
  2972. Xtypedef struct entry entry;
  2973. Xbool_t xdr_entry();
  2974. X
  2975. Xstruct dirlist {
  2976. X    entry *entries;
  2977. X    bool_t eof;
  2978. X};
  2979. Xtypedef struct dirlist dirlist;
  2980. Xbool_t xdr_dirlist();
  2981. X
  2982. Xstruct readdirres {
  2983. X    nfsstat status;
  2984. X    union {
  2985. X        dirlist reply;
  2986. X    } readdirres_u;
  2987. X};
  2988. Xtypedef struct readdirres readdirres;
  2989. Xbool_t xdr_readdirres();
  2990. X
  2991. Xstruct statfsokres {
  2992. X    u_int tsize;
  2993. X    u_int bsize;
  2994. X    u_int blocks;
  2995. X    u_int bfree;
  2996. X    u_int bavail;
  2997. X};
  2998. Xtypedef struct statfsokres statfsokres;
  2999. Xbool_t xdr_statfsokres();
  3000. X
  3001. Xstruct statfsres {
  3002. X    nfsstat status;
  3003. X    union {
  3004. X        statfsokres reply;
  3005. X    } statfsres_u;
  3006. X};
  3007. Xtypedef struct statfsres statfsres;
  3008. Xbool_t xdr_statfsres();
  3009. X
  3010. X#define NFS_PROGRAM ((u_long)100003)
  3011. X#define NFS_VERSION ((u_long)2)
  3012. X#define NFSPROC_NULL ((u_long)0)
  3013. Xextern void *nfsproc_null_2();
  3014. X#define NFSPROC_GETATTR ((u_long)1)
  3015. Xextern attrstat *nfsproc_getattr_2();
  3016. X#define NFSPROC_SETATTR ((u_long)2)
  3017. Xextern attrstat *nfsproc_setattr_2();
  3018. X#define NFSPROC_ROOT ((u_long)3)
  3019. Xextern void *nfsproc_root_2();
  3020. X#define NFSPROC_LOOKUP ((u_long)4)
  3021. Xextern diropres *nfsproc_lookup_2();
  3022. X#define NFSPROC_READLINK ((u_long)5)
  3023. Xextern readlinkres *nfsproc_readlink_2();
  3024. X#define NFSPROC_READ ((u_long)6)
  3025. Xextern readres *nfsproc_read_2();
  3026. X#define NFSPROC_WRITECACHE ((u_long)7)
  3027. Xextern void *nfsproc_writecache_2();
  3028. X#define NFSPROC_WRITE ((u_long)8)
  3029. Xextern attrstat *nfsproc_write_2();
  3030. X#define NFSPROC_CREATE ((u_long)9)
  3031. Xextern diropres *nfsproc_create_2();
  3032. X#define NFSPROC_REMOVE ((u_long)10)
  3033. Xextern nfsstat *nfsproc_remove_2();
  3034. X#define NFSPROC_RENAME ((u_long)11)
  3035. Xextern nfsstat *nfsproc_rename_2();
  3036. X#define NFSPROC_LINK ((u_long)12)
  3037. Xextern nfsstat *nfsproc_link_2();
  3038. X#define NFSPROC_SYMLINK ((u_long)13)
  3039. Xextern nfsstat *nfsproc_symlink_2();
  3040. X#define NFSPROC_MKDIR ((u_long)14)
  3041. Xextern diropres *nfsproc_mkdir_2();
  3042. X#define NFSPROC_RMDIR ((u_long)15)
  3043. Xextern nfsstat *nfsproc_rmdir_2();
  3044. X#define NFSPROC_READDIR ((u_long)16)
  3045. Xextern readdirres *nfsproc_readdir_2();
  3046. X#define NFSPROC_STATFS ((u_long)17)
  3047. Xextern statfsres *nfsproc_statfs_2();
  3048. END_OF_FILE
  3049.   if test 6080 -ne `wc -c <'rpc/nfs_prot.h'`; then
  3050.     echo shar: \"'rpc/nfs_prot.h'\" unpacked with wrong size!
  3051.   fi
  3052.   # end of 'rpc/nfs_prot.h'
  3053. fi
  3054. if test -f 'rpc/nfs_prot_clnt.c' -a "${1}" != "-c" ; then 
  3055.   echo shar: Will not clobber existing file \"'rpc/nfs_prot_clnt.c'\"
  3056. else
  3057.   echo shar: Extracting \"'rpc/nfs_prot_clnt.c'\" \(5251 characters\)
  3058.   sed "s/^X//" >'rpc/nfs_prot_clnt.c' <<'END_OF_FILE'
  3059. X/*
  3060. X * Please do not edit this file.
  3061. X * It was generated using rpcgen.
  3062. X */
  3063. X
  3064. X#include <rpc/rpc.h>
  3065. X#include "nfs_prot.h"
  3066. X#ifndef NFS_FH_DEFINED    /* nfs_fh has been declared in cs_prot.h */
  3067. X#define NFS_FH_DEFINED
  3068. X#endif
  3069. X
  3070. X/* Default timeout can be changed using clnt_control() */
  3071. Xstatic struct timeval TIMEOUT = { 25, 0 };
  3072. X
  3073. Xvoid *
  3074. Xnfsproc_null_2(argp, clnt)
  3075. X    void *argp;
  3076. X    CLIENT *clnt;
  3077. X{
  3078. X    static char res;
  3079. X
  3080. X    bzero((char *)&res, sizeof(res));
  3081. X    if (clnt_call(clnt, NFSPROC_NULL, xdr_void, argp, xdr_void, &res, TIMEOUT) != RPC_SUCCESS) {
  3082. X        return (NULL);
  3083. X    }
  3084. X    return ((void *)&res);
  3085. X}
  3086. X
  3087. Xattrstat *
  3088. Xnfsproc_getattr_2(argp, clnt)
  3089. X    nfs_fh *argp;
  3090. X    CLIENT *clnt;
  3091. X{
  3092. X    static attrstat res;
  3093. X
  3094. X    bzero((char *)&res, sizeof(res));
  3095. X    if (clnt_call(clnt, NFSPROC_GETATTR, xdr_nfs_fh, argp, xdr_attrstat, &res, TIMEOUT) != RPC_SUCCESS) {
  3096. X        return (NULL);
  3097. X    }
  3098. X    return (&res);
  3099. X}
  3100. X
  3101. Xattrstat *
  3102. Xnfsproc_setattr_2(argp, clnt)
  3103. X    sattrargs *argp;
  3104. X    CLIENT *clnt;
  3105. X{
  3106. X    static attrstat res;
  3107. X
  3108. X    bzero((char *)&res, sizeof(res));
  3109. X    if (clnt_call(clnt, NFSPROC_SETATTR, xdr_sattrargs, argp, xdr_attrstat, &res, TIMEOUT) != RPC_SUCCESS) {
  3110. X        return (NULL);
  3111. X    }
  3112. X    return (&res);
  3113. X}
  3114. X
  3115. Xvoid *
  3116. Xnfsproc_root_2(argp, clnt)
  3117. X    void *argp;
  3118. X    CLIENT *clnt;
  3119. X{
  3120. X    static char res;
  3121. X
  3122. X    bzero((char *)&res, sizeof(res));
  3123. X    if (clnt_call(clnt, NFSPROC_ROOT, xdr_void, argp, xdr_void, &res, TIMEOUT) != RPC_SUCCESS) {
  3124. X        return (NULL);
  3125. X    }
  3126. X    return ((void *)&res);
  3127. X}
  3128. X
  3129. Xdiropres *
  3130. Xnfsproc_lookup_2(argp, clnt)
  3131. X    diropargs *argp;
  3132. X    CLIENT *clnt;
  3133. X{
  3134. X    static diropres res;
  3135. X
  3136. X    bzero((char *)&res, sizeof(res));
  3137. X    if (clnt_call(clnt, NFSPROC_LOOKUP, xdr_diropargs, argp, xdr_diropres, &res, TIMEOUT) != RPC_SUCCESS) {
  3138. X        return (NULL);
  3139. X    }
  3140. X    return (&res);
  3141. X}
  3142. X
  3143. Xreadlinkres *
  3144. Xnfsproc_readlink_2(argp, clnt)
  3145. X    nfs_fh *argp;
  3146. X    CLIENT *clnt;
  3147. X{
  3148. X    static readlinkres res;
  3149. X
  3150. X    bzero((char *)&res, sizeof(res));
  3151. X    if (clnt_call(clnt, NFSPROC_READLINK, xdr_nfs_fh, argp, xdr_readlinkres, &res, TIMEOUT) != RPC_SUCCESS) {
  3152. X        return (NULL);
  3153. X    }
  3154. X    return (&res);
  3155. X}
  3156. X
  3157. Xreadres *
  3158. Xnfsproc_read_2(argp, clnt)
  3159. X    readargs *argp;
  3160. X    CLIENT *clnt;
  3161. X{
  3162. X    static readres res;
  3163. X
  3164. X    bzero((char *)&res, sizeof(res));
  3165. X    if (clnt_call(clnt, NFSPROC_READ, xdr_readargs, argp, xdr_readres, &res, TIMEOUT) != RPC_SUCCESS) {
  3166. X        return (NULL);
  3167. X    }
  3168. X    return (&res);
  3169. X}
  3170. X
  3171. Xvoid *
  3172. Xnfsproc_writecache_2(argp, clnt)
  3173. X    void *argp;
  3174. X    CLIENT *clnt;
  3175. X{
  3176. X    static char res;
  3177. X
  3178. X    bzero((char *)&res, sizeof(res));
  3179. X    if (clnt_call(clnt, NFSPROC_WRITECACHE, xdr_void, argp, xdr_void, &res, TIMEOUT) != RPC_SUCCESS) {
  3180. X        return (NULL);
  3181. X    }
  3182. X    return ((void *)&res);
  3183. X}
  3184. X
  3185. Xattrstat *
  3186. Xnfsproc_write_2(argp, clnt)
  3187. X    writeargs *argp;
  3188. X    CLIENT *clnt;
  3189. X{
  3190. X    static attrstat res;
  3191. X
  3192. X    bzero((char *)&res, sizeof(res));
  3193. X    if (clnt_call(clnt, NFSPROC_WRITE, xdr_writeargs, argp, xdr_attrstat, &res, TIMEOUT) != RPC_SUCCESS) {
  3194. X        return (NULL);
  3195. X    }
  3196. X    return (&res);
  3197. X}
  3198. X
  3199. Xdiropres *
  3200. Xnfsproc_create_2(argp, clnt)
  3201. X    createargs *argp;
  3202. X    CLIENT *clnt;
  3203. X{
  3204. X    static diropres res;
  3205. X
  3206. X    bzero((char *)&res, sizeof(res));
  3207. X    if (clnt_call(clnt, NFSPROC_CREATE, xdr_createargs, argp, xdr_diropres, &res, TIMEOUT) != RPC_SUCCESS) {
  3208. X        return (NULL);
  3209. X    }
  3210. X    return (&res);
  3211. X}
  3212. X
  3213. Xnfsstat *
  3214. Xnfsproc_remove_2(argp, clnt)
  3215. X    diropargs *argp;
  3216. X    CLIENT *clnt;
  3217. X{
  3218. X    static nfsstat res;
  3219. X
  3220. X    bzero((char *)&res, sizeof(res));
  3221. X    if (clnt_call(clnt, NFSPROC_REMOVE, xdr_diropargs, argp, xdr_nfsstat, &res, TIMEOUT) != RPC_SUCCESS) {
  3222. X        return (NULL);
  3223. X    }
  3224. X    return (&res);
  3225. X}
  3226. X
  3227. Xnfsstat *
  3228. Xnfsproc_rename_2(argp, clnt)
  3229. X    renameargs *argp;
  3230. X    CLIENT *clnt;
  3231. X{
  3232. X    static nfsstat res;
  3233. X
  3234. X    bzero((char *)&res, sizeof(res));
  3235. X    if (clnt_call(clnt, NFSPROC_RENAME, xdr_renameargs, argp, xdr_nfsstat, &res, TIMEOUT) != RPC_SUCCESS) {
  3236. X        return (NULL);
  3237. X    }
  3238. X    return (&res);
  3239. X}
  3240. X
  3241. Xnfsstat *
  3242. Xnfsproc_link_2(argp, clnt)
  3243. X    linkargs *argp;
  3244. X    CLIENT *clnt;
  3245. X{
  3246. X    static nfsstat res;
  3247. X
  3248. X    bzero((char *)&res, sizeof(res));
  3249. X    if (clnt_call(clnt, NFSPROC_LINK, xdr_linkargs, argp, xdr_nfsstat, &res, TIMEOUT) != RPC_SUCCESS) {
  3250. X        return (NULL);
  3251. X    }
  3252. X    return (&res);
  3253. X}
  3254. X
  3255. Xnfsstat *
  3256. Xnfsproc_symlink_2(argp, clnt)
  3257. X    symlinkargs *argp;
  3258. X    CLIENT *clnt;
  3259. X{
  3260. X    static nfsstat res;
  3261. X
  3262. X    bzero((char *)&res, sizeof(res));
  3263. X    if (clnt_call(clnt, NFSPROC_SYMLINK, xdr_symlinkargs, argp, xdr_nfsstat, &res, TIMEOUT) != RPC_SUCCESS) {
  3264. X        return (NULL);
  3265. X    }
  3266. X    return (&res);
  3267. X}
  3268. X
  3269. Xdiropres *
  3270. Xnfsproc_mkdir_2(argp, clnt)
  3271. X    createargs *argp;
  3272. X    CLIENT *clnt;
  3273. X{
  3274. X    static diropres res;
  3275. X
  3276. X    bzero((char *)&res, sizeof(res));
  3277. X    if (clnt_call(clnt, NFSPROC_MKDIR, xdr_createargs, argp, xdr_diropres, &res, TIMEOUT) != RPC_SUCCESS) {
  3278. X        return (NULL);
  3279. X    }
  3280. X    return (&res);
  3281. X}
  3282. X
  3283. Xnfsstat *
  3284. Xnfsproc_rmdir_2(argp, clnt)
  3285. X    diropargs *argp;
  3286. X    CLIENT *clnt;
  3287. X{
  3288. X    static nfsstat res;
  3289. X
  3290. X    bzero((char *)&res, sizeof(res));
  3291. X    if (clnt_call(clnt, NFSPROC_RMDIR, xdr_diropargs, argp, xdr_nfsstat, &res, TIMEOUT) != RPC_SUCCESS) {
  3292. X        return (NULL);
  3293. X    }
  3294. X    return (&res);
  3295. X}
  3296. X
  3297. Xreaddirres *
  3298. Xnfsproc_readdir_2(argp, clnt)
  3299. X    readdirargs *argp;
  3300. X    CLIENT *clnt;
  3301. X{
  3302. X    static readdirres res;
  3303. X
  3304. X    bzero((char *)&res, sizeof(res));
  3305. X    if (clnt_call(clnt, NFSPROC_READDIR, xdr_readdirargs, argp, xdr_readdirres, &res, TIMEOUT) != RPC_SUCCESS) {
  3306. X        return (NULL);
  3307. X    }
  3308. X    return (&res);
  3309. X}
  3310. X
  3311. Xstatfsres *
  3312. Xnfsproc_statfs_2(argp, clnt)
  3313. X    nfs_fh *argp;
  3314. X    CLIENT *clnt;
  3315. X{
  3316. X    static statfsres res;
  3317. X
  3318. X    bzero((char *)&res, sizeof(res));
  3319. X    if (clnt_call(clnt, NFSPROC_STATFS, xdr_nfs_fh, argp, xdr_statfsres, &res, TIMEOUT) != RPC_SUCCESS) {
  3320. X        return (NULL);
  3321. X    }
  3322. X    return (&res);
  3323. X}
  3324. END_OF_FILE
  3325.   if test 5251 -ne `wc -c <'rpc/nfs_prot_clnt.c'`; then
  3326.     echo shar: \"'rpc/nfs_prot_clnt.c'\" unpacked with wrong size!
  3327.   fi
  3328.   # end of 'rpc/nfs_prot_clnt.c'
  3329. fi
  3330. if test -f 'wwmount/wwumount.c' -a "${1}" != "-c" ; then 
  3331.   echo shar: Will not clobber existing file \"'wwmount/wwumount.c'\"
  3332. else
  3333.   echo shar: Extracting \"'wwmount/wwumount.c'\" \(5109 characters\)
  3334.   sed "s/^X//" >'wwmount/wwumount.c' <<'END_OF_FILE'
  3335. X/* 
  3336. X * WorldWide File System
  3337. X * Copyright (c) 1992,1993 Youki Kadobayashi
  3338. X * Copyright (c) 1992,1993 Osaka University
  3339. X * All rights reserved.
  3340. X *
  3341. X * Permission to use, copy, modify and distribute this software and its
  3342. X * documentation is hereby granted, provided that the following conditions
  3343. X * are met:
  3344. X * 1. Both the copyright notice and this permission notice appear in
  3345. X *    all copies of the software, derivative works or modified versions,
  3346. X *    and any portions thereof, and that both notices appear in
  3347. X *    supporting documentation.
  3348. X * 2. All advertising materials mentioning features or use of this software
  3349. X *    must display the following acknowledgement:
  3350. X *      This product includes software developed by the Osaka University
  3351. X *      and its contributors.
  3352. X * 3. Neither the name of the University nor the names of its contributors
  3353. X *    may be used to endorse or promote products derived from this software
  3354. X *    without specific prior written permission.
  3355. X *
  3356. X * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND OSAKA
  3357. X * UNIVERSITY DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  3358. X * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  3359. X *
  3360. X * Osaka University requests users of this software to return to
  3361. X *
  3362. X *  Youki Kadobayashi
  3363. X *  Department of Information and Computer Sciences
  3364. X *  Osaka University, Toyonaka 560, Osaka, Japan
  3365. X *
  3366. X * any improvements or extensions that they make and grant Osaka
  3367. X * University the rights to redistribute these changes.
  3368. X */
  3369. X/* WWFS umount */
  3370. Xstatic char *AtFSid = "$Header: wwumount.c[109.0] Wed Nov 24 03:49:38 1993 youki-k@is.aist-nara.ac.jp saved $";
  3371. X
  3372. X#include "am.h"        /* amd compatibility */
  3373. X
  3374. X/* NFS headers and definitions */
  3375. X#define NFS
  3376. X#define NFSCLIENT
  3377. X#ifdef NFS_3
  3378. Xtypedef nfs_fh fhandle_t;
  3379. X#endif /* NFS_3 */
  3380. X#include <sys/mount.h>
  3381. X#ifdef NFS_HDR
  3382. X#include NFS_HDR
  3383. X#endif /* NFS_HDR */
  3384. X
  3385. X/* miscellaneous headers */
  3386. X#include <sys/signal.h>
  3387. X#include <sys/stat.h>
  3388. X#include "cs_prot.h"
  3389. X
  3390. X#ifdef MOUNTED
  3391. Xchar *mtab = MOUNTED;
  3392. X#endif /* MOUNTED */
  3393. Xtime_t clock_valid = 0;
  3394. Xint mypid;
  3395. X
  3396. X#if defined(NEED_UMOUNT_BSD) || defined(NEED_UMOUNT_OSF)
  3397. X#ifdef NEED_UMOUNT_OSF
  3398. X#define unmount umount
  3399. X#endif
  3400. Xint umount_fs P((char *fs_name));
  3401. Xint umount_fs(fs_name)
  3402. Xchar *fs_name;
  3403. X{
  3404. X    int error;
  3405. X
  3406. Xeintr:
  3407. X    error = unmount(fs_name, MNT_NOFORCE);
  3408. X    if (error < 0)
  3409. X        error = errno;
  3410. X
  3411. X    switch (error) {
  3412. X    case EINVAL:
  3413. X    case ENOTBLK:
  3414. X    case ENOENT:
  3415. X        plog(XLOG_WARNING, "unmount: %s is not mounted", fs_name);
  3416. X        error = 0;    /* Not really an error */
  3417. X        break;
  3418. X
  3419. X    case EINTR:
  3420. X#ifdef DEBUG
  3421. X        /* not sure why this happens, but it does.  ask kirk one day... */
  3422. X        dlog("%s: unmount: %m", fs_name);
  3423. X#endif /* DEBUG */
  3424. X        goto eintr;
  3425. X
  3426. X#ifdef DEBUG
  3427. X    default:
  3428. X        dlog("%s: unmount: %m", fs_name);
  3429. X        break;
  3430. X#endif /* DEBUG */
  3431. X    }
  3432. X
  3433. X    return error;
  3434. X}
  3435. X
  3436. X#endif /* NEED_UMOUNT_BSD || NEED_UMOUNT_OSF */
  3437. X
  3438. X#ifdef NEED_UMOUNT_FS
  3439. X
  3440. Xint umount_fs(fs_name)
  3441. Xchar *fs_name;
  3442. X{
  3443. X    mntlist *mlist, *mp, *mp_save = 0;
  3444. X    int error = 0;
  3445. X
  3446. X    mp = mlist = read_mtab(fs_name);
  3447. X
  3448. X    /*
  3449. X     * Search the mount table looking for
  3450. X     * the correct (ie last) matching entry
  3451. X     */
  3452. X    while (mp) {
  3453. X        if (strcmp(mp->mnt->mnt_fsname, fs_name) == 0 ||
  3454. X                strcmp(mp->mnt->mnt_dir, fs_name) == 0)
  3455. X            mp_save = mp;
  3456. X        mp = mp->mnext;
  3457. X    }
  3458. X
  3459. X    if (mp_save) {
  3460. X#ifdef DEBUG
  3461. X        dlog("Trying unmount(%s)", mp_save->mnt->mnt_dir);
  3462. X#endif /* DEBUG */
  3463. X        /*
  3464. X         * This unmount may hang leaving this
  3465. X         * process with an exlusive lock on
  3466. X         * /etc/mtab. Therefore it is necessary
  3467. X         * to unlock mtab, do the unmount, then
  3468. X         * lock mtab (again) and reread it and
  3469. X         * finally update it.
  3470. X         */
  3471. X#ifdef UPDATE_MTAB
  3472. X        unlock_mntlist();
  3473. X#endif
  3474. X        if (UNMOUNT_TRAP(mp_save->mnt) < 0) {
  3475. X            switch (error = errno) {
  3476. X            case EINVAL:
  3477. X            case ENOTBLK:
  3478. X                plog(XLOG_WARNING,
  3479. X                     "unmount: %s is not mounted",
  3480. X                     mp_save->mnt->mnt_dir);
  3481. X                error = 0;    /* Not really an error */
  3482. X                break;
  3483. X
  3484. X            case ENOENT:
  3485. X                plog(XLOG_ERROR,
  3486. X                     "mount point %s: %m",
  3487. X                     mp_save->mnt->mnt_dir);
  3488. X                break;
  3489. X
  3490. X            default:
  3491. X#ifdef DEBUG
  3492. X                dlog("%s: unmount: %m", mp_save->mnt->mnt_dir);
  3493. X#endif /* DEBUG */
  3494. X                break;
  3495. X            }
  3496. X        }
  3497. X#ifdef DEBUG
  3498. X        dlog("Finished unmount(%s)", mp_save->mnt->mnt_dir);
  3499. X#endif
  3500. X
  3501. X#ifdef UPDATE_MTAB
  3502. X        if (!error) {
  3503. X            mp = mlist = read_mtab(fs_name);
  3504. X            
  3505. X            /*
  3506. X             * Search the mount table looking for
  3507. X             * the correct (ie last) matching entry
  3508. X             */
  3509. X            mp_save = 0;
  3510. X            while (mp) {
  3511. X                if (strcmp(mp->mnt->mnt_fsname, fs_name) == 0
  3512. X                    || strcmp(mp->mnt->mnt_dir, fs_name) == 0)
  3513. X                    mp_save = mp;
  3514. X                mp = mp->mnext;
  3515. X            }
  3516. X            
  3517. X            if (mp_save) {
  3518. X                mp_save->mnt = 0;
  3519. X                rewrite_mtab(mlist);
  3520. X            }
  3521. X        }
  3522. X#endif /* UPDATE_MTAB */
  3523. X    } else {
  3524. X        plog(XLOG_ERROR, "Couldn't find how to unmount %s", fs_name);
  3525. X        /*
  3526. X         * Assume it is already unmounted
  3527. X         */
  3528. X        error = 0;
  3529. X    }
  3530. X
  3531. X    return error;
  3532. X}
  3533. X
  3534. X#endif /* NEED_UMOUNT_FS */
  3535. X
  3536. Xmain(argc, argv)
  3537. Xint argc;
  3538. Xchar **argv;
  3539. X{
  3540. X    char *mp_name;
  3541. X    int ret;
  3542. X
  3543. X    /* amd compat code */
  3544. X    mypid = getpid();
  3545. X
  3546. X    if (argc < 2) {
  3547. X        usage(argv[0]);
  3548. X        exit(1);
  3549. X    }
  3550. X    mp_name = argv[1];
  3551. X    ret = umount_fs(mp_name);
  3552. X    if (ret < 0) {
  3553. X        perror(argv[0]);
  3554. X        exit(1);
  3555. X    }
  3556. X}
  3557. X
  3558. Xusage(name)
  3559. Xchar *name;
  3560. X{
  3561. X    printf("Usage: %s directory\n", name);
  3562. X}
  3563. END_OF_FILE
  3564.   if test 5109 -ne `wc -c <'wwmount/wwumount.c'`; then
  3565.     echo shar: \"'wwmount/wwumount.c'\" unpacked with wrong size!
  3566.   fi
  3567.   # end of 'wwmount/wwumount.c'
  3568. fi
  3569. echo shar: End of archive 16 \(of 22\).
  3570. cp /dev/null ark16isdone
  3571. MISSING=""
  3572. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ; do
  3573.     if test ! -f ark${I}isdone ; then
  3574.     MISSING="${MISSING} ${I}"
  3575.     fi
  3576. done
  3577. if test "${MISSING}" = "" ; then
  3578.     echo You have unpacked all 22 archives.
  3579.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  3580. else
  3581.     echo You still must unpack the following archives:
  3582.     echo "        " ${MISSING}
  3583. fi
  3584. exit 0
  3585. exit 0 # Just in case...
  3586.