summaryrefslogtreecommitdiff
path: root/plan9
diff options
context:
space:
mode:
authorPerl 5 Porters <perl5-porters@africa.nicoh.com>1996-07-26 03:53:27 +0000
committerCharles Bailey <bailey@genetics.upenn.edu>1996-07-26 03:53:27 +0000
commit396e9e6f77853ce5b5bd54c151a15d6820deba3a (patch)
treedec367aaa99df9194e1d594e7c4b0a15ea41157c /plan9
parent62ac1c994e20a7298bfc84e40958ae6c95247bab (diff)
downloadperl-396e9e6f77853ce5b5bd54c151a15d6820deba3a.tar.gz
New Plan9 port
Diffstat (limited to 'plan9')
-rw-r--r--plan9/aperl7
-rw-r--r--plan9/arpa/inet.h7
-rw-r--r--plan9/buildinfo1
-rw-r--r--plan9/config.plan91573
-rw-r--r--plan9/exclude29
-rw-r--r--plan9/fndvers9
-rw-r--r--plan9/genconfig.pl272
-rw-r--r--plan9/mkfile149
-rw-r--r--plan9/myconfig.plan939
-rw-r--r--plan9/perlplan9.doc91
-rw-r--r--plan9/perlplan9.pod87
-rw-r--r--plan9/plan9.c134
-rw-r--r--plan9/plan9ish.h113
-rw-r--r--plan9/setup.rc48
14 files changed, 2559 insertions, 0 deletions
diff --git a/plan9/aperl b/plan9/aperl
new file mode 100644
index 0000000000..4d032e3c3d
--- /dev/null
+++ b/plan9/aperl
@@ -0,0 +1,7 @@
+#!/bin/rc
+
+# aperl:
+# Executes perl command and alters stderr to produce Acme-friendly error messages
+# Created 02-JUL-1996, Luther Huffman, lutherh@stratcom.com
+
+/bin/perl $* |[2] /bin/perl -pe 's/ line (\d+)/:$1/' >[1=2]
diff --git a/plan9/arpa/inet.h b/plan9/arpa/inet.h
new file mode 100644
index 0000000000..518d517190
--- /dev/null
+++ b/plan9/arpa/inet.h
@@ -0,0 +1,7 @@
+/* Declarations which would have been found in <arpa/inet.h> */
+/* On Plan 9, these are found in <netinet/in.h> */
+
+/* extern unsigned long inet_addr(const char *); */
+/* extern char *inet_ntoa(struct in_addr); */
+
+#include <netinet/in.h>
diff --git a/plan9/buildinfo b/plan9/buildinfo
new file mode 100644
index 0000000000..52bc5a1709
--- /dev/null
+++ b/plan9/buildinfo
@@ -0,0 +1 @@
+p9pvers = 5.00301
diff --git a/plan9/config.plan9 b/plan9/config.plan9
new file mode 100644
index 0000000000..d59a75933b
--- /dev/null
+++ b/plan9/config.plan9
@@ -0,0 +1,1573 @@
+/* This file (config_H) is a sample config.h file. If you are unable
+ to successfully run Configure, copy this file to config.h and
+ edit it to suit your system.
+*/
+/*
+ * This file was produced by running the config_h.SH script, which
+ * gets its values from config.sh, which is generally produced by
+ * running Configure.
+ *
+ * Feel free to modify any of this as the need arises. Note, however,
+ * that running config_h.SH again will wipe out any changes you've made.
+ * For a more permanent change edit config.sh and rerun config_h.SH.
+ *
+ * $Id: Config_h.U,v 3.0.1.4 1995/09/25 09:10:49 ram Exp $
+ */
+
+/* Configuration time: Thu Feb 8 17:15:11 EST 1996
+ * Configured by: doughera
+ * Target system: sunos fractal 5.4 generic_101946-29 i86pc i386
+ */
+
+#ifndef _config_h_
+#define _config_h_
+
+/* CAT2:
+ * This macro catenates 2 tokens together.
+ */
+
+#define CAT2(a,b)a ## b
+#define CAT3(a,b,c)a ## b ## c
+#define CAT4(a,b,c,d)a ## b ## c ## d
+#define CAT5(a,b,c,d,e)a ## b ## c ## d ## e
+#define StGiFy(a)# a
+#define STRINGIFY(a)StGiFy(a)
+#define SCAT2(a,b)StGiFy(a) StGiFy(b)
+#define SCAT3(a,b,c)StGiFy(a) StGiFy(b) StGiFy(c)
+#define SCAT4(a,b,c,d)StGiFy(a) StGiFy(b) StGiFy(c) StGiFy(d)
+#define SCAT5(a,b,c,d,e)StGiFy(a) StGiFy(b) StGiFy(c) StGiFy(d) StGiFy(e)
+
+/* config-start */
+
+/* MEM_ALIGNBYTES:
+ * This symbol contains the number of bytes required to align a
+ * double. Usual values are 2, 4 and 8.
+ */
+#define MEM_ALIGNBYTES 8 /* config-skip */
+
+/* BIN:
+ * This symbol holds the path of the bin directory where the package will
+ * be installed. Program must be prepared to deal with ~name substitution.
+ */
+#define BIN "/_P9P_OBJTYPE/bin" /* */
+
+/* CPPSTDIN:
+ * This symbol contains the first part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. Typical value of "cc -E" or "/lib/cpp", but it can also
+ * call a wrapper. See CPPRUN.
+ */
+/* CPPMINUS:
+ * This symbol contains the second part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. This symbol will have the value "-" if CPPSTDIN needs a minus
+ * to specify standard input, otherwise the value is "".
+ */
+#define CPPSTDIN "cpp"
+#define CPPMINUS ""
+
+/* HAS_ALARM:
+ * This symbol, if defined, indicates that the alarm routine is
+ * available.
+ */
+#define HAS_ALARM /**/
+
+/* HASATTRIBUTE:
+ * This symbol indicates the C compiler can check for function attributes,
+ * such as printf formats. This is normally only supported by GNU cc.
+ */
+#undef HASATTRIBUTE /* config-skip*/
+#ifndef HASATTRIBUTE
+#define __attribute__(_arg_)
+#endif
+
+/* HAS_BCMP:
+ * This symbol is defined if the bcmp() routine is available to
+ * compare blocks of memory.
+ */
+#define HAS_BCMP /**/
+
+/* HAS_BCOPY:
+ * This symbol is defined if the bcopy() routine is available to
+ * copy blocks of memory.
+ */
+#define HAS_BCOPY /**/
+
+/* HAS_BZERO:
+ * This symbol is defined if the bzero() routine is available to
+ * set a memory block to 0.
+ */
+#define HAS_BZERO /**/
+
+/* CASTI32:
+ * This symbol is defined if the C compiler can cast negative
+ * or large floating point numbers to 32-bit ints.
+ */
+#undef CASTI32 /**/
+
+/* CASTNEGFLOAT:
+ * This symbol is defined if the C compiler can cast negative
+ * numbers to unsigned longs, ints and shorts.
+ */
+/* CASTFLAGS:
+ * This symbol contains flags that say what difficulties the compiler
+ * has casting odd floating values to unsigned long:
+ * 0 = ok
+ * 1 = couldn't cast < 0
+ * 2 = couldn't cast >= 0x80000000
+ * 4 = couldn't cast in argument expression list
+ */
+#define CASTNEGFLOAT /**/
+#if _P9P_OBJTYPE == 386
+# define CASTFLAGS 2 /**/ /* config-skip */
+#else
+# define CASTFLAGS 0 /**/ /* config-skip */
+#endif
+
+/* HAS_CHOWN:
+ * This symbol, if defined, indicates that the chown routine is
+ * available.
+ */
+#undef HAS_CHOWN /**/
+
+/* HAS_CHROOT:
+ * This symbol, if defined, indicates that the chroot routine is
+ * available.
+ */
+#undef HAS_CHROOT /**/
+
+/* HAS_CHSIZE:
+ * This symbol, if defined, indicates that the chsize routine is available
+ * to truncate files. You might need a -lx to get this routine.
+ */
+#undef HAS_CHSIZE /**/
+
+/* VOID_CLOSEDIR:
+ * This symbol, if defined, indicates that the closedir() routine
+ * does not return a value.
+ */
+#define VOID_CLOSEDIR /**/
+
+/* HASCONST:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the const type. There is no need to actually test for that symbol
+ * within your programs. The mere use of the "const" keyword will
+ * trigger the necessary tests.
+ */
+#define HASCONST /**/
+
+/* HAS_CRYPT:
+ * This symbol, if defined, indicates that the crypt routine is available
+ * to encrypt passwords and the like.
+ */
+/* #define HAS_CRYPT /**/
+
+/* HAS_CUSERID:
+ * This symbol, if defined, indicates that the cuserid routine is
+ * available to get character login names.
+ */
+#define HAS_CUSERID /**/
+
+/* HAS_DBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol DBL_DIG, which is the number
+ * of significant digits in a double precision number. If this
+ * symbol is not defined, a guess of 15 is usually pretty good.
+ */
+#undef HAS_DBL_DIG /* */
+
+/* HAS_DIFFTIME:
+ * This symbol, if defined, indicates that the difftime routine is
+ * available.
+ */
+#define HAS_DIFFTIME /**/
+
+/* HAS_DLERROR:
+ * This symbol, if defined, indicates that the dlerror routine is
+ * available to return a string describing the last error that
+ * occurred from a call to dlopen(), dlclose() or dlsym().
+ */
+#undef HAS_DLERROR /**/
+
+/* HAS_DUP2:
+ * This symbol, if defined, indicates that the dup2 routine is
+ * available to duplicate file descriptors.
+ */
+#define HAS_DUP2 /**/
+
+/* HAS_FCHMOD:
+ * This symbol, if defined, indicates that the fchmod routine is available
+ * to change mode of opened files. If unavailable, use chmod().
+ */
+#undef HAS_FCHMOD /**/
+
+/* HAS_FCHOWN:
+ * This symbol, if defined, indicates that the fchown routine is available
+ * to change ownership of opened files. If unavailable, use chown().
+ */
+#undef HAS_FCHOWN /**/
+
+/* HAS_FCNTL:
+ * This symbol, if defined, indicates to the C program that
+ * the fcntl() function exists.
+ */
+#define HAS_FCNTL /**/
+
+/* HAS_FGETPOS:
+ * This symbol, if defined, indicates that the fgetpos routine is
+ * available to get the file position indicator, similar to ftell().
+ */
+#define HAS_FGETPOS /**/
+
+/* FLEXFILENAMES:
+ * This symbol, if defined, indicates that the system supports filenames
+ * longer than 14 characters.
+ */
+#define FLEXFILENAMES /**/
+
+/* HAS_FLOCK:
+ * This symbol, if defined, indicates that the flock routine is
+ * available to do file locking.
+ */
+#undef HAS_FLOCK /**/
+
+/* HAS_FORK:
+ * This symbol, if defined, indicates that the fork routine is
+ * available.
+ */
+#define HAS_FORK /**/
+
+/* HAS_FSETPOS:
+ * This symbol, if defined, indicates that the fsetpos routine is
+ * available to set the file position indicator, similar to fseek().
+ */
+#define HAS_FSETPOS /**/
+
+/* HAS_GETGROUPS:
+ * This symbol, if defined, indicates that the getgroups() routine is
+ * available to get the list of process groups. If unavailable, multiple
+ * groups are probably not supported.
+ */
+#undef HAS_GETGROUPS /* config-skip */
+
+/* HAS_GETHOSTENT:
+ * This symbol, if defined, indicates that the gethostent routine is
+ * available to lookup host names in some data base or other.
+ */
+#undef HAS_GETHOSTENT /* config-skip */
+
+/* HAS_UNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * uname() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and PHOSTNAME.
+ */
+#undef HAS_UNAME /**/
+
+/* HAS_GETLOGIN:
+ * This symbol, if defined, indicates that the getlogin routine is
+ * available to get the login name.
+ */
+#define HAS_GETLOGIN /**/
+
+/* HAS_GETPGRP:
+ * This symbol, if defined, indicates that the getpgrp routine is
+ * available to get the current process group.
+ */
+#define HAS_GETPGRP /**/
+
+/* HAS_GETPGRP2:
+ * This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
+ * routine is available to get the current process group.
+ */
+#undef HAS_GETPGRP2 /**/
+
+/* HAS_GETPPID:
+ * This symbol, if defined, indicates that the getppid routine is
+ * available to get the parent process ID.
+ */
+#define HAS_GETPPID /**/
+
+/* HAS_GETPRIORITY:
+ * This symbol, if defined, indicates that the getpriority routine is
+ * available to get a process's priority.
+ */
+#undef HAS_GETPRIORITY /**/
+
+/* HAS_HTONL:
+ * This symbol, if defined, indicates that the htonl() routine (and
+ * friends htons() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_HTONS:
+ * This symbol, if defined, indicates that the htons() routine (and
+ * friends htonl() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHL:
+ * This symbol, if defined, indicates that the ntohl() routine (and
+ * friends htonl() htons() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHS:
+ * This symbol, if defined, indicates that the ntohs() routine (and
+ * friends htonl() htons() ntohl()) are available to do network
+ * order byte swapping.
+ */
+#define HAS_HTONL /**/
+
+#define HAS_HTONS /**/
+
+#define HAS_NTOHL /**/
+
+#define HAS_NTOHS /**/
+
+/* HAS_ISASCII:
+ * This manifest constant lets the C program know that isascii
+ * is available.
+ */
+#undef HAS_ISASCII /**/
+
+/* HAS_KILLPG:
+ * This symbol, if defined, indicates that the killpg routine is available
+ * to kill process groups. If unavailable, you probably should use kill
+ * with a negative process number.
+ */
+#undef HAS_KILLPG /**/
+
+/* HAS_LINK:
+ * This symbol, if defined, indicates that the link routine is
+ * available to create hard links.
+ */
+#define HAS_LINK /**/
+
+/* HAS_LOCALECONV:
+ * This symbol, if defined, indicates that the localeconv routine is
+ * available for numeric and monetary formatting conventions.
+ */
+#define HAS_LOCALECONV /**/
+
+/* HAS_LOCKF:
+ * This symbol, if defined, indicates that the lockf routine is
+ * available to do file locking.
+ */
+#undef HAS_LOCKF /**/
+
+/* HAS_LSTAT:
+ * This symbol, if defined, indicates that the lstat routine is
+ * available to do file stats on symbolic links.
+ */
+#define HAS_LSTAT /**/
+
+/* HAS_MBLEN:
+ * This symbol, if defined, indicates that the mblen routine is available
+ * to find the number of bytes in a multibye character.
+ */
+#define HAS_MBLEN /**/
+
+/* HAS_MBSTOWCS:
+ * This symbol, if defined, indicates that the mbstowcs routine is
+ * available to covert a multibyte string into a wide character string.
+ */
+#define HAS_MBSTOWCS /**/
+
+/* HAS_MBTOWC:
+ * This symbol, if defined, indicates that the mbtowc routine is available
+ * to covert a multibyte to a wide character.
+ */
+#define HAS_MBTOWC /**/
+
+/* HAS_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * to compare blocks of memory.
+ */
+#define HAS_MEMCMP /**/
+
+/* HAS_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy blocks of memory.
+ */
+#define HAS_MEMCPY /**/
+
+/* HAS_MEMMOVE:
+ * This symbol, if defined, indicates that the memmove routine is available
+ * to copy potentially overlapping blocks of memory. This should be used
+ * only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ * own version.
+ */
+#define HAS_MEMMOVE /**/
+
+/* HAS_MEMSET:
+ * This symbol, if defined, indicates that the memset routine is available
+ * to set blocks of memory.
+ */
+#define HAS_MEMSET /**/
+
+/* HAS_MKDIR:
+ * This symbol, if defined, indicates that the mkdir routine is available
+ * to create directories. Otherwise you should fork off a new process to
+ * exec /bin/mkdir.
+ */
+#define HAS_MKDIR /**/
+
+/* HAS_MKFIFO:
+ * This symbol, if defined, indicates that the mkfifo routine is
+ * available to create FIFOs. Otherwise, mknod should be able to
+ * do it for you. However, if mkfifo is there, mknod might require
+ * super-user privileges which mkfifo will not.
+ */
+#define HAS_MKFIFO /**/
+
+/* HAS_MKTIME:
+ * This symbol, if defined, indicates that the mktime routine is
+ * available.
+ */
+#define HAS_MKTIME /**/
+
+/* HAS_MSG:
+ * This symbol, if defined, indicates that the entire msg*(2) library is
+ * supported (IPC mechanism based on message queues).
+ */
+#undef HAS_MSG /**/
+
+/* HAS_NICE:
+ * This symbol, if defined, indicates that the nice routine is
+ * available.
+ */
+#undef HAS_NICE /**/
+
+/* HAS_OPEN3:
+ * This manifest constant lets the C program know that the three
+ * argument form of open(2) is available.
+ */
+#define HAS_OPEN3 /**/
+
+/* HAS_PATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given filename.
+ */
+/* HAS_FPATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given open file descriptor.
+ */
+#define HAS_PATHCONF /**/
+#define HAS_FPATHCONF /**/
+
+/* HAS_PAUSE:
+ * This symbol, if defined, indicates that the pause routine is
+ * available to suspend a process until a signal is received.
+ */
+#define HAS_PAUSE /**/
+
+/* HAS_PIPE:
+ * This symbol, if defined, indicates that the pipe routine is
+ * available to create an inter-process channel.
+ */
+#define HAS_PIPE /**/
+
+/* HAS_POLL:
+ * This symbol, if defined, indicates that the poll routine is
+ * available to poll active file descriptors.
+ */
+#undef HAS_POLL /**/
+
+/* HAS_READDIR:
+ * This symbol, if defined, indicates that the readdir routine is
+ * available to read directory entries. You may have to include
+ * <dirent.h>. See I_DIRENT.
+ */
+#define HAS_READDIR /**/
+
+/* HAS_SEEKDIR:
+ * This symbol, if defined, indicates that the seekdir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#undef HAS_SEEKDIR /**/
+
+/* HAS_TELLDIR:
+ * This symbol, if defined, indicates that the telldir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#undef HAS_TELLDIR /**/
+
+/* HAS_REWINDDIR:
+ * This symbol, if defined, indicates that the rewinddir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_REWINDDIR /**/
+
+/* HAS_READLINK:
+ * This symbol, if defined, indicates that the readlink routine is
+ * available to read the value of a symbolic link.
+ */
+#define HAS_READLINK /**/
+
+/* HAS_RENAME:
+ * This symbol, if defined, indicates that the rename routine is available
+ * to rename files. Otherwise you should do the unlink(), link(), unlink()
+ * trick.
+ */
+#define HAS_RENAME /**/
+
+/* HAS_RMDIR:
+ * This symbol, if defined, indicates that the rmdir routine is
+ * available to remove directories. Otherwise you should fork off a
+ * new process to exec /bin/rmdir.
+ */
+#define HAS_RMDIR /**/
+
+/* HAS_SAFE_BCOPY:
+ * This symbol, if defined, indicates that the bcopy routine is available
+ * to copy potentially overlapping memory blocks. Otherwise you should
+ * probably use memmove() or memcpy(). If neither is defined, roll your
+ * own version.
+ */
+#undef HAS_SAFE_BCOPY /**/
+
+/* HAS_SAFE_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy potentially overlapping memory blocks. Otherwise you should
+ * probably use memmove() or memcpy(). If neither is defined, roll your
+ * own version.
+ */
+#undef HAS_SAFE_MEMCPY /**/
+
+/* HAS_SELECT:
+ * This symbol, if defined, indicates that the select routine is
+ * available to select active file descriptors. If the timeout field
+ * is used, <sys/time.h> may need to be included.
+ */
+#define HAS_SELECT /* config-skip */
+
+/* HAS_SEM:
+ * This symbol, if defined, indicates that the entire sem*(2) library is
+ * supported.
+ */
+#undef HAS_SEM /**/
+
+/* HAS_SETEGID:
+ * This symbol, if defined, indicates that the setegid routine is available
+ * to change the effective gid of the current program.
+ */
+#undef HAS_SETEGID /**/
+
+/* HAS_SETEUID:
+ * This symbol, if defined, indicates that the seteuid routine is available
+ * to change the effective uid of the current program.
+ */
+#undef HAS_SETEUID /**/
+
+/* HAS_SETLINEBUF:
+ * This symbol, if defined, indicates that the setlinebuf routine is
+ * available to change stderr or stdout from block-buffered or unbuffered
+ * to a line-buffered mode.
+ */
+#undef HAS_SETLINEBUF /**/
+
+/* HAS_SETLOCALE:
+ * This symbol, if defined, indicates that the setlocale routine is
+ * available to handle locale-specific ctype implementations.
+ */
+#define HAS_SETLOCALE /**/
+
+/* HAS_SETPGID:
+ * This symbol, if defined, indicates that the setpgid routine is
+ * available to set process group ID.
+ */
+#define HAS_SETPGID /**/
+
+/* HAS_SETPGRP:
+ * This symbol, if defined, indicates that the setpgrp routine is
+ * available to set the current process group.
+ */
+/* USE_BSDPGRP:
+ * This symbol, if defined, indicates that the BSD notion of process
+ * group is to be used. For instance, you have to say setpgrp(pid, pgrp)
+ * instead of the USG setpgrp().
+ */
+#undef HAS_SETPGRP /**/
+#undef USE_BSDPGRP /**/
+
+/* HAS_SETPGRP2:
+ * This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
+ * routine is available to set the current process group.
+ */
+#undef HAS_SETPGRP2 /**/
+
+/* HAS_SETPRIORITY:
+ * This symbol, if defined, indicates that the setpriority routine is
+ * available to set a process's priority.
+ */
+#undef HAS_SETPRIORITY /**/
+
+/* HAS_SETREGID:
+ * This symbol, if defined, indicates that the setregid routine is
+ * available to change the real and effective gid of the current
+ * process.
+ */
+/* HAS_SETRESGID:
+ * This symbol, if defined, indicates that the setresgid routine is
+ * available to change the real, effective and saved gid of the current
+ * process.
+ */
+#undef HAS_SETREGID /**/
+#undef HAS_SETRESGID /**/
+
+/* HAS_SETREUID:
+ * This symbol, if defined, indicates that the setreuid routine is
+ * available to change the real and effective uid of the current
+ * process.
+ */
+/* HAS_SETRESUID:
+ * This symbol, if defined, indicates that the setresuid routine is
+ * available to change the real, effective and saved uid of the current
+ * process.
+ */
+#undef HAS_SETREUID /**/
+#undef HAS_SETRESUID /**/
+
+/* HAS_SETRGID:
+ * This symbol, if defined, indicates that the setrgid routine is available
+ * to change the real gid of the current program.
+ */
+#undef HAS_SETRGID /**/
+
+/* HAS_SETRUID:
+ * This symbol, if defined, indicates that the setruid routine is available
+ * to change the real uid of the current program.
+ */
+#undef HAS_SETRUID /**/
+
+/* HAS_SETSID:
+ * This symbol, if defined, indicates that the setsid routine is
+ * available to set the process group ID.
+ */
+#define HAS_SETSID /**/
+
+/* HAS_SHM:
+ * This symbol, if defined, indicates that the entire shm*(2) library is
+ * supported.
+ */
+#undef HAS_SHM /**/
+
+/* Shmat_t:
+ * This symbol holds the return type of the shmat() system call.
+ * Usually set to 'void *' or 'char *'.
+ */
+/* HAS_SHMAT_PROTOTYPE:
+ * This symbol, if defined, indicates that the sys/shm.h includes
+ * a prototype for shmat(). Otherwise, it is up to the program to
+ * guess one. Shmat_t shmat _((int, Shmat_t, int)) is a good guess,
+ * but not always right so it should be emitted by the program only
+ * when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs.
+ */
+#undef Shmat_t /* config-skip */
+#undef HAS_SHMAT_PROTOTYPE /**/
+
+/* HAS_SIGACTION:
+ * This symbol, if defined, indicates that Vr4's sigaction() routine
+ * is available.
+ */
+#define HAS_SIGACTION /**/
+
+/* HAS_SOCKET:
+ * This symbol, if defined, indicates that the BSD socket interface is
+ * supported.
+ */
+/* HAS_SOCKETPAIR:
+ * This symbol, if defined, indicates that the BSD socketpair() call is
+ * supported.
+ */
+#define HAS_SOCKET /**/
+#define HAS_SOCKETPAIR /**/
+
+/* USE_STAT_BLOCKS:
+ * This symbol is defined if this system has a stat structure declaring
+ * st_blksize and st_blocks.
+ */
+#undef USE_STAT_BLOCKS /**/
+
+/* USE_STDIO_PTR:
+ * This symbol is defined if the _ptr and _cnt fields (or similar)
+ * of the stdio FILE structure can be used to access the stdio buffer
+ * for a file handle. If this is defined, then the FILE_ptr(fp)
+ * and FILE_cnt(fp) macros will also be defined and should be used
+ * to access these fields.
+ */
+/* USE_STDIO_BASE:
+ * This symbol is defined if the _base field (or similar) of the
+ * stdio FILE structure can be used to access the stdio buffer for
+ * a file handle. If this is defined, then the FILE_base(fp) macro
+ * will also be defined and should be used to access this field.
+ * Also, the FILE_bufsiz(fp) macro will be defined and should be used
+ * to determine the number of bytes in the buffer. USE_STDIO_BASE
+ * will never be defined unless USE_STDIO_PTR is.
+ */
+#undef USE_STDIO_PTR /**/
+#undef USE_STDIO_BASE /**/
+
+/* FILE_ptr:
+ * This macro is used to access the _ptr field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_PTR_LVALUE:
+ * This symbol is defined if the FILE_ptr macro can be used as an
+ * lvalue.
+ */
+/* FILE_cnt:
+ * This macro is used to access the _cnt field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_CNT_LVALUE:
+ * This symbol is defined if the FILE_cnt macro can be used as an
+ * lvalue.
+ */
+#ifdef USE_STDIO_PTR
+#define FILE_ptr(fp) ((fp)->_ptr)
+#define STDIO_PTR_LVALUE /**/
+#define FILE_cnt(fp) ((fp)->_cnt)
+#define STDIO_CNT_LVALUE /**/
+#endif
+
+/* FILE_base:
+ * This macro is used to access the _base field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_BASE is defined.
+ */
+/* FILE_bufsiz:
+ * This macro is used to determine the number of bytes in the I/O
+ * buffer pointed to by _base field (or equivalent) of the FILE
+ * structure pointed to its argument. This macro will always be defined
+ * if USE_STDIO_BASE is defined.
+ */
+#ifdef USE_STDIO_BASE
+#define FILE_base(fp) ((fp)->_base)
+#define FILE_bufsiz(fp) ((fp)->_cnt + (fp)->_ptr - (fp)->_base)
+#endif
+
+/* HAS_STRCHR:
+ * This symbol is defined to indicate that the strchr()/strrchr()
+ * functions are available for string searching. If not, try the
+ * index()/rindex() pair.
+ */
+/* HAS_INDEX:
+ * This symbol is defined to indicate that the index()/rindex()
+ * functions are available for string searching.
+ */
+#define HAS_STRCHR /**/
+#undef HAS_INDEX /**/
+
+/* HAS_STRCOLL:
+ * This symbol, if defined, indicates that the strcoll routine is
+ * available to compare strings using collating information.
+ */
+#define HAS_STRCOLL /**/
+
+/* USE_STRUCT_COPY:
+ * This symbol, if defined, indicates that this C compiler knows how
+ * to copy structures. If undefined, you'll need to use a block copy
+ * routine of some sort instead.
+ */
+#define USE_STRUCT_COPY /**/
+
+/* HAS_STRERROR:
+ * This symbol, if defined, indicates that the strerror routine is
+ * available to translate error numbers to strings. See the writeup
+ * of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ * This symbol, if defined, indicates that the sys_errlist array is
+ * available to translate error numbers to strings. The extern int
+ * sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ * This preprocessor symbol is defined as a macro if strerror() is
+ * not available to translate error numbers to strings but sys_errlist[]
+ * array is there.
+ */
+#define HAS_STRERROR /**/
+#define HAS_SYS_ERRLIST /**/
+#define Strerror(e) strerror(e)
+
+/* HAS_STRXFRM:
+ * This symbol, if defined, indicates that the strxfrm() routine is
+ * available to transform strings.
+ */
+#define HAS_STRXFRM /**/
+
+/* HAS_SYMLINK:
+ * This symbol, if defined, indicates that the symlink routine is available
+ * to create symbolic links.
+ */
+#define HAS_SYMLINK /**/
+
+/* HAS_SYSCALL:
+ * This symbol, if defined, indicates that the syscall routine is
+ * available to call arbitrary system calls. If undefined, that's tough.
+ */
+#undef HAS_SYSCALL /**/
+
+/* HAS_SYSCONF:
+ * This symbol, if defined, indicates that sysconf() is available
+ * to determine system related limits and options.
+ */
+#define HAS_SYSCONF /**/
+
+/* HAS_SYSTEM:
+ * This symbol, if defined, indicates that the system routine is
+ * available to issue a shell command.
+ */
+#define HAS_SYSTEM /**/
+
+/* HAS_TCGETPGRP:
+ * This symbol, if defined, indicates that the tcgetpgrp routine is
+ * available to get foreground process group ID.
+ */
+#define HAS_TCGETPGRP /**/
+
+/* HAS_TCSETPGRP:
+ * This symbol, if defined, indicates that the tcsetpgrp routine is
+ * available to set foreground process group ID.
+ */
+#define HAS_TCSETPGRP /**/
+
+/* Time_t:
+ * This symbol holds the type returned by time(). It can be long,
+ * or time_t on BSD sites (in which case <sys/types.h> should be
+ * included).
+ */
+#define Time_t time_t /* Time type */
+
+/* HAS_TIMES:
+ * This symbol, if defined, indicates that the times() routine exists.
+ * Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
+ */
+#define HAS_TIMES /**/
+
+/* HAS_TRUNCATE:
+ * This symbol, if defined, indicates that the truncate routine is
+ * available to truncate files.
+ */
+#undef HAS_TRUNCATE /**/
+
+/* HAS_TZNAME:
+ * This symbol, if defined, indicates that the tzname[] array is
+ * available to access timezone names.
+ */
+#define HAS_TZNAME /**/
+
+/* HAS_UMASK:
+ * This symbol, if defined, indicates that the umask routine is
+ * available to set and get the value of the file creation mask.
+ */
+#define HAS_UMASK /**/
+
+/* HAS_VFORK:
+ * This symbol, if defined, indicates that vfork() exists.
+ */
+#undef HAS_VFORK /**/
+
+/* Signal_t:
+ * This symbol's value is either "void" or "int", corresponding to the
+ * appropriate return type of a signal handler. Thus, you can declare
+ * a signal handler using "Signal_t (*handler)()", and define the
+ * handler using "Signal_t handler(sig)".
+ */
+#define Signal_t void /* Signal handler's return type */
+
+/* HASVOLATILE:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the volatile declaration.
+ */
+#define HASVOLATILE /**/
+#ifndef HASVOLATILE
+#define volatile /* config-skip */
+#endif
+
+/* HAS_VPRINTF:
+ * This symbol, if defined, indicates that the vprintf routine is available
+ * to printf with a pointer to an argument list. If unavailable, you
+ * may need to write your own, probably in terms of _doprnt().
+ */
+/* USE_CHAR_VSPRINTF:
+ * This symbol is defined if this system has vsprintf() returning type
+ * (char*). The trend seems to be to declare it as "int vsprintf()". It
+ * is up to the package author to declare vsprintf correctly based on the
+ * symbol.
+ */
+#define HAS_VPRINTF /**/
+#define USE_CHAR_VSPRINTF /**/
+
+/* HAS_WAIT4:
+ * This symbol, if defined, indicates that wait4() exists.
+ */
+#undef HAS_WAIT4 /**/
+
+/* HAS_WAITPID:
+ * This symbol, if defined, indicates that the waitpid routine is
+ * available to wait for child process.
+ */
+#undef HAS_WAITPID /**/
+
+/* HAS_WCSTOMBS:
+ * This symbol, if defined, indicates that the wcstombs routine is
+ * available to convert wide character strings to multibyte strings.
+ */
+#define HAS_WCSTOMBS /**/
+
+/* HAS_WCTOMB:
+ * This symbol, if defined, indicates that the wctomb routine is available
+ * to covert a wide character to a multibyte.
+ */
+#define HAS_WCTOMB /**/
+
+/* Fpos_t:
+ * This symbol holds the type used to declare file positions in libc.
+ * It can be fpos_t, long, uint, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Fpos_t fpos_t /* File position type */
+
+/* Gid_t:
+ * This symbol holds the return type of getgid() and the type of
+ * argument to setrgid() and related functions. Typically,
+ * it is the type of group ids in the kernel. It can be int, ushort,
+ * uid_t, etc... It may be necessary to include <sys/types.h> to get
+ * any typedef'ed information.
+ */
+#define Gid_t gid_t /* config-skip */
+
+/* Groups_t:
+ * This symbol holds the type used for the second argument to
+ * getgroups(). Usually, this is the same of gidtype, but
+ * sometimes it isn't. It can be int, ushort, uid_t, etc...
+ * It may be necessary to include <sys/types.h> to get any
+ * typedef'ed information. This is only required if you have
+ * getgroups().
+ */
+#ifdef HAS_GETGROUPS
+#define Groups_t gid_t /* Type for 2nd arg to getgroups() */
+#endif
+
+/* DB_Prefix_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is u_int32_t.
+ */
+/* DB_Hash_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is size_t.
+ */
+#define DB_Hash_t int /**/
+#define DB_Prefix_t int /**/
+
+/* I_DIRENT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <dirent.h>. Using this symbol also triggers the definition
+ * of the Direntry_t define which ends up being 'struct dirent' or
+ * 'struct direct' depending on the availability of <dirent.h>.
+ */
+/* DIRNAMLEN:
+ * This symbol, if defined, indicates to the C program that the length
+ * of directory entry names is provided by a d_namlen field. Otherwise
+ * you need to do strlen() on the d_name field.
+ */
+/* Direntry_t:
+ * This symbol is set to 'struct direct' or 'struct dirent' depending on
+ * whether dirent is available or not. You should use this pseudo type to
+ * portably declare your directory entries.
+ */
+#define I_DIRENT /**/
+#undef DIRNAMLEN /**/
+#define Direntry_t struct dirent
+
+/* I_DLFCN:
+ * This symbol, if defined, indicates that <dlfcn.h> exists and should
+ * be included.
+ */
+#undef I_DLFCN /**/
+
+/* I_FCNTL:
+ * This manifest constant tells the C program to include <fcntl.h>.
+ */
+#define I_FCNTL /**/
+
+/* I_FLOAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <float.h> to get definition of symbols like DBL_MAX or
+ * DBL_MIN, i.e. machine dependent floating point values.
+ */
+#define I_FLOAT /**/
+
+/* I_GRP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <grp.h>.
+ */
+#define I_GRP /**/
+
+/* I_LIMITS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <limits.h> to get definition of symbols like WORD_BIT or
+ * LONG_MAX, i.e. machine dependant limitations.
+ */
+#define I_LIMITS /**/
+
+/* I_MATH:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <math.h>.
+ */
+#define I_MATH /**/
+
+/* I_MEMORY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <memory.h>.
+ */
+#undef I_MEMORY /**/
+
+/* I_NDBM:
+ * This symbol, if defined, indicates that <ndbm.h> exists and should
+ * be included.
+ */
+#undef I_NDBM /**/
+
+/* I_NET_ERRNO:
+ * This symbol, if defined, indicates that <net/errno.h> exists and
+ * should be included.
+ */
+#undef I_NET_ERRNO /* config-skip */
+
+/* I_NETINET_IN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
+ */
+#define I_NETINET_IN /* config-skip */
+
+/* I_PWD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <pwd.h>.
+ */
+/* PWQUOTA:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_quota.
+ */
+/* PWAGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_age.
+ */
+/* PWCHANGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_change.
+ */
+/* PWCLASS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_class.
+ */
+/* PWEXPIRE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_expire.
+ */
+/* PWCOMMENT:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_comment.
+ */
+#define I_PWD /**/
+#undef PWQUOTA /**/
+#undef PWAGE /**/
+#undef PWCHANGE /**/
+#undef PWCLASS /**/
+#undef PWEXPIRE /**/
+#undef PWCOMMENT /**/
+
+/* I_STDDEF:
+ * This symbol, if defined, indicates that <stddef.h> exists and should
+ * be included.
+ */
+#define I_STDDEF /**/
+
+/* I_STDLIB:
+ * This symbol, if defined, indicates that <stdlib.h> exists and should
+ * be included.
+ */
+#define I_STDLIB /**/
+
+/* I_STRING:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <string.h> (USG systems) instead of <strings.h> (BSD systems).
+ */
+#define I_STRING /**/
+
+/* I_SYS_DIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/dir.h>.
+ */
+#undef I_SYS_DIR /**/
+
+/* I_SYS_FILE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/file.h> to get definition of R_OK and friends.
+ */
+#undef I_SYS_FILE /**/
+
+/* I_SYS_IOCTL:
+ * This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ * be included. Otherwise, include <sgtty.h> or <termio.h>.
+ */
+#define I_SYS_IOCTL /**/
+
+/* I_SYS_NDIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/ndir.h>.
+ */
+#undef I_SYS_NDIR /**/
+
+/* I_SYS_PARAM:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/param.h>.
+ */
+#define I_SYS_PARAM /**/
+
+/* Plan 9: file position in Plan 9 is <select.h> */
+/* I_SYS_SELECT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/select.h> in order to get definition of struct timeval.
+ */
+#undef I_SYS_SELECT /**/
+
+/* I_SYS_TIMES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/times.h>.
+ */
+#define I_SYS_TIMES /**/
+
+/* I_SYS_TYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/types.h>.
+ */
+#define I_SYS_TYPES /**/
+
+/* I_SYS_UN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/un.h> to get UNIX domain socket definitions.
+ */
+#define I_SYS_UN /**/
+
+/* I_TERMIO:
+ * This symbol, if defined, indicates that the program should include
+ * <termio.h> rather than <sgtty.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/* I_TERMIOS:
+ * This symbol, if defined, indicates that the program should include
+ * the POSIX termios.h rather than sgtty.h or termio.h.
+ * There are also differences in the ioctl() calls that depend on the
+ * value of this symbol.
+ */
+/* I_SGTTY:
+ * This symbol, if defined, indicates that the program should include
+ * <sgtty.h> rather than <termio.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+#undef I_TERMIO /**/
+#define I_TERMIOS /**/
+#undef I_SGTTY /**/
+
+/* Plan 9: P9 has both <time.h> and <sys/time.h> */
+/* I_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <time.h>.
+ */
+/* I_SYS_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h>.
+ */
+/* I_SYS_TIME_KERNEL:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h> with KERNEL defined.
+ */
+#define I_TIME /**/
+#define I_SYS_TIME /**/
+#undef I_SYS_TIME_KERNEL /**/
+
+/* I_UNISTD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <unistd.h>.
+ */
+#define I_UNISTD /**/
+
+/* I_UTIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <utime.h>.
+ */
+#define I_UTIME /**/
+
+/* I_VFORK:
+ * This symbol, if defined, indicates to the C program that it should
+ * include vfork.h.
+ */
+#undef I_VFORK /**/
+
+/* Off_t:
+ * This symbol holds the type used to declare offsets in the kernel.
+ * It can be int, long, off_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Off_t off_t /* <offset> type */
+
+/* Mode_t:
+ * This symbol holds the type used to declare file modes
+ * for systems calls. It is usually mode_t, but may be
+ * int or unsigned short. It may be necessary to include <sys/types.h>
+ * to get any typedef'ed information.
+ */
+#define Mode_t mode_t /* file mode parameter for system calls */
+
+/* CAN_PROTOTYPE:
+ * If defined, this macro indicates that the C compiler can handle
+ * function prototypes.
+ */
+/* _:
+ * This macro is used to declare function parameters for folks who want
+ * to make declarations with prototypes using a different style than
+ * the above macros. Use double parentheses. For example:
+ *
+ * int main _((int argc, char *argv[]));
+ */
+#define CAN_PROTOTYPE /**/
+#ifdef CAN_PROTOTYPE
+#define _(args) args /* config-skip */
+#else
+#define _(args) () /* config-skip */
+#endif
+
+/* RANDBITS:
+ * This symbol contains the number of bits of random number the rand()
+ * function produces. Usual values are 15, 16, and 31.
+ */
+#define RANDBITS 15 /**/
+
+/* SCRIPTDIR:
+ * This symbol holds the name of the directory in which the user wants
+ * to put publicly executable scripts for the package in question. It
+ * is often a directory that is mounted across diverse architectures.
+ * Programs must be prepared to deal with ~name expansion.
+ */
+#define SCRIPTDIR "/bin"
+
+/* Select_fd_set_t:
+ * This symbol holds the type used for the 2nd, 3rd, and 4th
+ * arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET
+ * is defined, and 'int *' otherwise. This is only useful if you
+ * have select(), of course.
+ */
+#define Select_fd_set_t fd_set * /**/
+
+/* Size_t:
+ * This symbol holds the type used to declare length parameters
+ * for string functions. It is usually size_t, but may be
+ * unsigned long, int, etc. It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Size_t size_t /* length paramater for string functions */
+
+/* SSize_t:
+ * This symbol holds the type used by functions that return
+ * a count of bytes or an error condition. It must be a signed type.
+ * It is usually ssize_t, but may be long or int, etc.
+ * It may be necessary to include <sys/types.h> or <unistd.h>
+ * to get any typedef'ed information.
+ * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+ */
+#define SSize_t ssize_t /* signed count of bytes */
+
+/* STDCHAR:
+ * This symbol is defined to be the type of char used in stdio.h.
+ * It has the values "unsigned char" or "char".
+ */
+#define STDCHAR char /**/
+
+/* Uid_t:
+ * This symbol holds the type used to declare user ids in the kernel.
+ * It can be int, ushort, uid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Uid_t uid_t /* UID type */
+
+/* PLAN9:
+ This symbol, if defined, indicates that the program is running under the
+* Plan 9 operating system.
+*/
+#define PLAN9 /**/
+
+#define OSNAME "plan9"
+
+#define BIN_SH "/bin/rc"
+
+/* MYMALLOC:
+ * This symbol, if defined, indicates that we're using our own malloc.
+ */
+#undef MYMALLOC /**/
+
+
+#undef VMS
+
+/* LOC_SED:
+ * This symbol holds the complete pathname to the sed program.
+ */
+#define LOC_SED "/bin/sed" /**/
+
+/* ARCHLIB_EXP:
+ * This symbol contains the ~name expanded version of ARCHLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define ARCHLIB_EXP "/_P9P_OBJTYPE/lib/perl/_P9P_VERSION"
+
+/* BYTEORDER:
+ * This symbol hold the hexadecimal constant defined in byteorder,
+ * i.e. 0x1234 or 0x4321, etc...
+ */
+#define BYTEORDER 0x1234 /* large digits for MSB */
+
+/* CSH:
+ * This symbol, if defined, indicates that the C-shell exists.
+ * If defined, contains the full pathname of csh.
+ */
+#undef CSH /**/
+
+/* DLSYM_NEEDS_UNDERSCORE:
+ * This symbol, if defined, indicates that we need to prepend an
+ * underscore to the symbol name before calling dlsym(). This only
+ * makes sense if you *have* dlsym, which we will presume is the
+ * case if you're using dl_dlopen.xs.
+ */
+#undef DLSYM_NEEDS_UNDERSCORE /* */
+
+/* SETUID_SCRIPTS_ARE_SECURE_NOW:
+ * This symbol, if defined, indicates that the bug that prevents
+ * setuid scripts from being secure is not present in this kernel.
+ */
+/* DOSUID:
+ * This symbol, if defined, indicates that the C program should
+ * check the script that it is executing for setuid/setgid bits, and
+ * attempt to emulate setuid/setgid on systems that have disabled
+ * setuid #! scripts because the kernel can't do it securely.
+ * It is up to the package designer to make sure that this emulation
+ * is done securely. Among other things, it should do an fstat on
+ * the script it just opened to make sure it really is a setuid/setgid
+ * script, it should make sure the arguments passed correspond exactly
+ * to the argument on the #! line, and it should not trust any
+ * subprocesses to which it must pass the filename rather than the
+ * file descriptor of the script to be executed.
+ */
+#define SETUID_SCRIPTS_ARE_SECURE_NOW /**/
+#undef DOSUID /**/
+
+/* Gconvert:
+ * This preprocessor macro is defined to convert a floating point
+ * number to a string without a trailing decimal point. This
+ * emulates the behavior of sprintf("%g"), but is sometimes much more
+ * efficient. If gconvert() is not available, but gcvt() drops the
+ * trailing decimal point, then gcvt() is used. If all else fails,
+ * a macro using sprintf("%g") is used. Arguments for the Gconvert
+ * macro are: value, number of digits, whether trailing zeros should
+ * be retained, and the output buffer.
+ * Possible values are:
+ * d_Gconvert='gconvert((x),(n),(t),(b))'
+ * d_Gconvert='gcvt((x),(n),(b))'
+ * d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+ * The last two assume trailing zeros should not be kept.
+ */
+#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))
+
+/* Sigjmp_buf:
+ * This is the buffer type to be used with Sigsetjmp and Siglongjmp.
+ */
+/* Sigsetjmp:
+ * This macro is used in the same way as sigsetjmp(), but will invoke
+ * traditional setjmp() if sigsetjmp isn't available.
+ */
+/* Siglongjmp:
+ * This macro is used in the same way as siglongjmp(), but will invoke
+ * traditional longjmp() if siglongjmp isn't available.
+ */
+#define HAS_SIGSETJMP /**/ /* config-skip */
+#define Sigjmp_buf sigjmp_buf /* config-skip */
+#define Sigsetjmp(buf,save_mask) sigsetjmp(buf,save_mask) /* config-skip */
+#define Siglongjmp(buf,retval) siglongjmp(buf,retval) /* config-skip */
+
+/* USE_DYNAMIC_LOADING:
+ * This symbol, if defined, indicates that dynamic loading of
+ * some sort is available.
+ */
+#undef USE_DYNAMIC_LOADING /**/
+
+/* I_DBM:
+ * This symbol, if defined, indicates that <dbm.h> exists and should
+ * be included.
+ */
+/* I_RPCSVC_DBM:
+ * This symbol, if defined, indicates that <rpcsvc/dbm.h> exists and
+ * should be included.
+ */
+#undef I_DBM /**/
+#undef I_RPCSVC_DBM /**/
+
+/* I_LOCALE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <locale.h>.
+ */
+#define I_LOCALE /**/
+
+/* I_SYS_STAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/stat.h>.
+ */
+#define I_SYS_STAT /**/
+
+/* I_STDARG:
+ * This symbol, if defined, indicates that <stdarg.h> exists and should
+ * be included.
+ */
+/* I_VARARGS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <varargs.h>.
+ */
+#define I_STDARG /**/
+#undef I_VARARGS /**/
+
+/* INTSIZE:
+ * This symbol contains the size of an int, so that the C preprocessor
+ * can make decisions based on it.
+ */
+#define INTSIZE 4 /**/
+
+/* Free_t:
+ * This variable contains the return type of free(). It is usually
+ * void, but occasionally int.
+ */
+/* Malloc_t:
+ * This symbol is the type of pointer returned by malloc and realloc.
+ */
+#define Malloc_t void * /**/
+#define Free_t void /**/
+
+/* VAL_O_NONBLOCK:
+ * This symbol is to be used during open() or fcntl(F_SETFL) to turn on
+ * non-blocking I/O for the file descriptor. Note that there is no way
+ * back, i.e. you cannot turn it blocking again this way. If you wish to
+ * alternatively switch between blocking and non-blocking, use the
+ * ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
+ */
+/* VAL_EAGAIN:
+ * This symbol holds the errno error code set by read() when no data was
+ * present on the non-blocking file descriptor.
+ */
+/* RD_NODATA:
+ * This symbol holds the return code from read() when no data is present
+ * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
+ * not defined, then you can't distinguish between no data and EOF by
+ * issuing a read(). You'll have to find another way to tell for sure!
+ */
+/* EOF_NONBLOCK:
+ * This symbol, if defined, indicates to the C program that a read() on
+ * a non-blocking file descriptor will return 0 on EOF, and not the value
+ * held in RD_NODATA (-1 usually, in that case!).
+ */
+#define VAL_O_NONBLOCK O_NONBLOCK
+#define VAL_EAGAIN EAGAIN
+#define RD_NODATA -1
+#define EOF_NONBLOCK
+
+/* OLDARCHLIB_EXP:
+ * This symbol contains the ~name expanded version of OLDARCHLIB, to be
+ * used in programs that are not prepared to deal with ~ expansion at
+ * run-time.
+ */
+#undef OLDARCHLIB_EXP /**/
+
+/* PRIVLIB_EXP:
+ * This symbol contains the ~name expanded version of PRIVLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define PRIVLIB_EXP "/sys/lib/perl" /* */
+
+/* SIG_NAME:
+ * This symbol contains a list of signal names in order of
+ * signal number. This is intended
+ * to be used as a static array initialization, like this:
+ * char *sig_name[] = { SIG_NAME };
+ * The signals in the list are separated with commas, and each signal
+ * is surrounded by double quotes. There is no leading SIG in the signal
+ * name, i.e. SIGQUIT is known as "QUIT".
+ * Gaps in the signal numbers (up to NSIG) are filled in with NUMnn,
+ * etc., where nn is the actual signal number (e.g. NUM37).
+ * The signal number for sig_name[i] is stored in sig_num[i].
+ * The last element is 0 to terminate the list with a NULL. This
+ * corresponds to the 0 at the end of the sig_num list.
+ */
+/* SIG_NUM:
+ * This symbol contains a list of signal numbers, in the same order as the
+ * SIG_NAME list. It is suitable for static array initialization, as in:
+ * int sig_num[] = { SIG_NUM };
+ * The signals in the list are separated with commas, and the indices
+ * within that list and the SIG_NAME list match, so it's easy to compute
+ * the signal name from a number or vice versa at the price of a small
+ * dynamic linear lookup.
+ * Duplicates are allowed, but are moved to the end of the list.
+ * The signal number corresponding to sig_name[i] is sig_number[i].
+ * if (i < NSIG) then sig_number[i] == i.
+ * The last element is 0, corresponding to the 0 at the end of
+ * the sig_name list.
+ */
+#define SIG_NAME "ZERO","HUP","INT","QUIT","ILL","ABRT","FPE","KILL","SEGV","PIPE","ALRM","TERM","USR1","USR2","CHLD","CONT","STOP","TSTP","TTIN","TTOU",0 /* config-skip */
+#define SIG_NUM 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0 /* config-skip */
+
+/* SITELIB_EXP:
+ * This symbol contains the ~name expanded version of SITELIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define SITELIB_EXP "/sys/lib/perl/site_perl" /* */
+
+/* SITEARCH_EXP:
+ * This symbol contains the ~name expanded version of SITEARCH, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define SITEARCH_EXP "/_P9P_OBJTYPE/lib/perl/_P9P_VERSION/site_perl" /* */
+
+/* STARTPERL:
+ * This variable contains the string to put in front of a perl
+ * script to make sure (one hopes) that it runs with perl and not
+ * some shell.
+ */
+#define STARTPERL "#!/bin/perl" /**/
+
+/* VOIDFLAGS:
+ * This symbol indicates how much support of the void type is given by this
+ * compiler. What various bits mean:
+ *
+ * 1 = supports declaration of void
+ * 2 = supports arrays of pointers to functions returning void
+ * 4 = supports comparisons between pointers to void functions and
+ * addresses of void functions
+ * 8 = suports declaration of generic void pointers
+ *
+ * The package designer should define VOIDUSED to indicate the requirements
+ * of the package. This can be done either by #defining VOIDUSED before
+ * including config.h, or by defining defvoidused in Myinit.U. If the
+ * latter approach is taken, only those flags will be tested. If the
+ * level of void support necessary is not present, defines void to int.
+ */
+#ifndef VOIDUSED
+#define VOIDUSED 15
+#endif
+#define VOIDFLAGS 15
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define void int /* is void to be avoided? */ /* config-skip */
+#define M_VOID /* Xenix strikes again */ /* config-skip */
+#endif
+
+#endif
diff --git a/plan9/exclude b/plan9/exclude
new file mode 100644
index 0000000000..5b52d96d24
--- /dev/null
+++ b/plan9/exclude
@@ -0,0 +1,29 @@
+comp/cpp.t
+comp/script.t
+io/argv.t
+io/dup.t
+io/fs.t
+io/inplace.t
+io/pipe.t
+lib/anydbm.t
+lib/dirhand.t
+lib/filehand.t
+lib/io_dup.t
+lib/io_pipe.t
+lib/io_sock.t
+lib/io_tell.t
+lib/io_udp.t
+lib/posix.t
+lib/safe1.t
+lib/safe2.t
+lib/socket.t
+op/eval.t
+op/exec.t
+op/goto.t
+op/magic.t
+op/misc.t
+op/oct.t
+op/readdir.t
+op/split.t
+op/stat.t
+op/tie.t
diff --git a/plan9/fndvers b/plan9/fndvers
new file mode 100644
index 0000000000..c45c42bdf9
--- /dev/null
+++ b/plan9/fndvers
@@ -0,0 +1,9 @@
+#!/bin/rc
+
+. plan9/buildinfo
+
+ed config.plan9 <<!
+g/_P9P_VERSION/s//$p9pvers/g
+g/_P9P_OBJTYPE/s//$objtype/g
+w $1
+!
diff --git a/plan9/genconfig.pl b/plan9/genconfig.pl
new file mode 100644
index 0000000000..2ab6295884
--- /dev/null
+++ b/plan9/genconfig.pl
@@ -0,0 +1,272 @@
+#!../miniperl
+# Habit . . .
+#
+# Extract info from config.h, and add extra data here, to generate config.sh
+# Edit the static information after __END__ to reflect your site and options
+# that went into your perl binary. In addition, values which change from run
+# to run may be supplied on the command line as key=val pairs.
+#
+# Last Modified: 28-Jun-1996 Luther Huffman lutherh@stratcom.com
+#
+
+#==== Locations of installed Perl components
+$p9pvers="5.00301";
+$prefix='';
+$p9p_objtype=$ENV{'objtype'};
+$builddir="/sys/src/cmd/perl/$p9pvers";
+$installbin="/$p9p_objtype/bin";
+$installman1dir="/sys/man/1";
+$installman3dir="/sys/man/2";
+$installprivlib="/sys/lib/perl";
+$installarchlib = "/$p9p_objtype/lib/perl/$p9pvers";
+$archname="plan9_$p9p_objtype";
+$installsitelib="$installprivlib/site_perl";
+$installsitearch="$installarchlib/site_perl";
+$installscript="/bin";
+
+unshift(@INC,'lib'); # In case someone didn't define Perl_Root
+ # before the build
+
+if ($ARGV[0] eq '-f') {
+ open(ARGS,$ARGV[1]) or die "Can't read data from $ARGV[1]: $!\n";
+ @ARGV = ();
+ while (<ARGS>) {
+ push(@ARGV,split(/\|/,$_));
+ }
+ close ARGS;
+}
+
+if (-f "config.h") { $infile = "config.h"; $outdir = "../"; }
+elsif (-f "plan9/config.h") { $infile = "plan9/config.h"; $outdir = "./"; }
+
+if ($infile) { print "Generating config.sh from $infile . . .\n"; }
+else { die <<EndOfGasp;
+Can't find config.h to read!
+ Please run this script from the perl source directory or
+ the plan9 subdirectory in the distribution.
+EndOfGasp
+}
+$outdir = '';
+open(IN,"$infile") || die "Can't open $infile: $!\n";
+open(OUT,">${outdir}config.sh") || die "Can't open ${outdir}config.sh: $!\n";
+
+$time = localtime;
+$cf_by = $ENV{'user'};
+($vers = $]) =~ tr/./_/;
+
+# Plan 9 doesn't actually use version numbering. Following the original Unix
+# precedent of assigning a Unix edition number based on the edition number
+# of the manuals, I am referring to this as Plan 9, 1st edition.
+$osvers = '1';
+
+print OUT <<EndOfIntro;
+# This file generated by genconfig.pl on a Plan 9 system.
+# Input obtained from:
+# $infile
+# $0
+# Time: $time
+
+package='perl5'
+CONFIG='true'
+cf_time='$time'
+cf_by='$cf_by'
+ccdlflags=''
+cccdlflags=''
+libpth='$installprivlib'
+ld='pcc'
+lddlflags=''
+ranlib=''
+ar='ar'
+nroff='/bin/nroff'
+eunicefix=':'
+hint='none'
+hintfile=''
+intsize='4'
+alignbytes='8'
+shrplib='define'
+usemymalloc='n'
+usevfork='true'
+useposix='true'
+spitshell='cat'
+dlsrc='dl_none.c'
+binexp='$installbin'
+man1ext=''
+man3ext=''
+arch='$archname'
+archname='$archname'
+osname='plan9'
+extensions='IO Socket Opcode Fcntl POSIX DynaLoader FileHandle'
+osvers='$osvers'
+sig_maxsig='19'
+sig_name='ZERO HUP INT QUIT ILL ABRT FPE KILL SEGV PIPE ALRM TERM USR1 USR2 CHLD CONT STOP TSTP TTIN TTOU'
+sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19'
+sig_numsig='20'
+prefix='$prefix'
+builddir='$builddir'
+installbin='$installbin'
+installman1dir='$installman1dir'
+installman3dir='$installman3dir'
+installprivlib='$installprivlib'
+installarchlib='$installarchlib'
+installsitelib='$installsitelib'
+installsitearch='$installsitearch'
+installscript='$installscript'
+scriptdir='$installscript'
+scriptdirexp='$installscript'
+EndOfIntro
+
+# Plan 9 compiler stuff
+print OUT "cc='pcc'\n";
+print OUT "d_attribut='undef'\n";
+print OUT "d_socket='define'\n";
+print OUT "d_sockpair='define'\n";
+print OUT "d_sigsetjmp='define'\n";
+print OUT "sigjmp_buf='sigjmp_buf'\n";
+print OUT "sigsetjmp='sigsetjmp(buf,save_mask)'\n";
+print OUT "siglongjmp='siglongjmp(buf,retval) '\n";
+print OUT "exe_ext=''\n";
+if ($p9p_objtype eq '386') {
+ $objext = '.8';
+}
+elsif ($p9p_objtype eq '68020') {
+ $objext = '.2';
+}
+elsif ($p9p_objtype eq 'mips') {
+ $objext = '.v';
+}
+elsif ($p9p_objtype eq 'sparc') {
+ $objext = '.k';
+}
+print OUT "obj_ext='$objext'\n";
+
+if ($p9p_objtype eq '386') {
+ $cstflags = 2;
+}
+else {
+ $cstflags = 0;
+}
+print OUT "castflags='$cstflags'\n";
+
+$myname = $ENV{'site'} ;
+($myhostname,$mydomain) = split(/\./,$myname,2);
+print OUT "myhostname='$myhostname'\n" if $myhostname;
+if ($mydomain) {
+ print OUT "mydomain='.$mydomain'\n";
+ print OUT "perladmin='$cf_by\@$myhostname.$mydomain'\n";
+ print OUT "cf_email='$cf_by\@$myhostname.$mydomain'\n";
+}
+else {
+ print OUT "perladmin='$cf_by'\n";
+ print OUT "cf_email='$cf_by'\n";
+}
+print OUT "myuname='Plan9 $myname $osvers $p9p_objtype'\n";
+
+# Before we read the C header file, find out what config.sh constants are
+# equivalent to the C preprocessor macros
+if (open(SH,"${outdir}config_h.SH")) {
+ while (<SH>) {
+ next unless m%^#(?!if).*\$%;
+ s/^#//; s!(.*?)\s*/\*.*!$1!;
+ my(@words) = split;
+ $words[1] =~ s/\(.*//; # Clip off args from macro
+ # Did we use a shell variable for the preprocessor directive?
+ if ($words[0] =~ m!^\$(\w+)!) { $pp_vars{$words[1]} = $1; }
+ if (@words > 2) { # We may also have a shell var in the value
+ shift @words; # Discard preprocessor directive
+ my($token) = shift @words; # and keep constant name
+ my($word);
+ foreach $word (@words) {
+ next unless $word =~ m!\$(\w+)!;
+ $val_vars{$token} = $1;
+ last;
+ }
+ }
+ }
+ close SH;
+}
+else { warn "Couldn't read ${outfile}config_h.SH: $!\n"; }
+$pp_vars{PLAN9} = 'define'; #Plan 9 specific
+
+# OK, now read the C header file, and retcon statements into config.sh
+while (<IN>) { # roll through the comment header in config.h
+ last if /config-start/;
+}
+
+while (<IN>) {
+ chop;
+ while (/\\\s*$/) { # pick up contination lines
+ my $line = $_;
+ $line =~ s/\\\s*$//;
+ $_ = <IN>;
+ s/^\s*//;
+ $_ = $line . $_;
+ }
+ next unless my ($blocked,$un,$token,$val) =
+ m%^(\/\*)?\s*\#\s*(un)?def\w*\s+([A-Za-z0-9]\w+)\S*\s*(.*)%;
+ if (/config-skip/) {
+ delete $pp_vars{$token} if exists $pp_vars{$token};
+ delete $val_vars{$token} if exists $val_vars{$token};
+ next;
+ }
+ $val =~ s!\s*/\*.*!!; # strip off trailing comment
+ my($had_val); # Maybe a macro with args that we just #undefd or commented
+ if (!length($val) and $val_vars{$token} and ($un || $blocked)) {
+ print OUT "$val_vars{$token}=''\n";
+ delete $val_vars{$token};
+ $had_val = 1;
+ }
+ $state = ($blocked || $un) ? 'undef' : 'define';
+ if ($pp_vars{$token}) {
+ print OUT "$pp_vars{$token}='$state'\n";
+ delete $pp_vars{$token};
+ }
+ elsif (not length $val and not $had_val) {
+ # Wups -- should have been shell var for C preprocessor directive
+ warn "Constant $token not found in config_h.SH\n";
+ $token =~ tr/A-Z/a-z/;
+ $token = "d_$token" unless $token =~ /^i_/;
+ print OUT "$token='$state'\n";
+ }
+ next unless length $val;
+ $val =~ s/^"//; $val =~ s/"$//; # remove end quotes
+ $val =~ s/","/ /g; # make signal list look nice
+
+ if ($val_vars{$token}) {
+ print OUT "$val_vars{$token}='$val'\n";
+ if ($val_vars{$token} =~ s/exp$//) {print OUT "$val_vars{$token}='$val'\n";}
+ delete $val_vars{$token};
+ }
+ elsif (!$pp_vars{$token}) { # Haven't seen it previously, either
+ warn "Constant $token not found in config_h.SH (val=|$val|)\n";
+ $token =~ tr/A-Z/a-z/;
+ print OUT "$token='$val'\n";
+ if ($token =~ s/exp$//) {print OUT "$token='$val'\n";}
+ }
+}
+close IN;
+
+foreach (sort keys %pp_vars) {
+ warn "Didn't see $_ in $infile\n";
+}
+foreach (sort keys %val_vars) {
+ warn "Didn't see $_ in $infile(val)\n";
+}
+
+
+# print OUT "libs='",join(' ',@libs),"'\n";
+# print OUT "libc='",join(' ',@crtls),"'\n";
+
+if (open(PL,"${outdir}patchlevel.h")) {
+ while (<PL>) {
+ if (/^#define PATCHLEVEL\s+(\S+)/) { print OUT "PATCHLEVEL='$1'\n"; }
+ elsif (/^#define SUBVERSION\s+(\S+)/) { print OUT "SUBVERSION='$1'\n"; }
+ }
+ close PL;
+}
+else { warn "Can't read ${outdir}patchlevel.h - skipping 'PATCHLEVEL'"; }
+
+print OUT "pager='/bin/p'\n";
+
+close OUT;
+
+
diff --git a/plan9/mkfile b/plan9/mkfile
new file mode 100644
index 0000000000..65568b2b16
--- /dev/null
+++ b/plan9/mkfile
@@ -0,0 +1,149 @@
+Content-type: text/plain; charset="us-ascii"
+Content-disposition: attachment; filename="mkfile"
+
+APE=/sys/src/ape
+< $APE/config
+<plan9/buildinfo
+sourcedir = /sys/src/cmd/perl/$p9pvers
+archname = plan9_$objtype
+privlib=/sys/lib/perl
+archlib = /$objtype/lib/perl/$p9pvers
+sitelib = $privlib/site_perl
+sitearch = $archlib/site_perl
+
+CFLAGS = -B -D_POSIX_SOURCE -D_BSD_EXTENSION -DNO_EMBED
+LDFLAGS = -B
+
+CCCMD = $CC -c $CFLAGS
+
+perllib = $archlib/CORE/libperl.a
+
+perlshr = $archlib/CORE/libperlshr.a
+
+installman1dir = /sys/man/1
+installman3dir = /sys/man/2
+
+podnames = perl perlbook perlbot perlcall perldata perldebug perldiag perldsc perlembed perlform perlfunc perlguts perlipc perllol perlmod perlobj perlop perlovl perlpod perlre perlref perlrun perlsec perlstyle perlsub perlsyn perltie perltoc perltrap perlvar perlxs perlxstut
+
+libpods = ${podnames:%=pod/%.pod}
+
+perlpods = $libpods
+
+extensions = IO Socket Opcode DynaLoader Fcntl FileHandle POSIX
+ext_xs = IO.xs Socket.xs Opcode.xs dl_none.xs Fcntl.xs FileHandle.xs POSIX.xs
+ext_c = ${ext_xs:%.xs=%.c}
+ext_obj = ${ext_xs:%.xs=%.$O}
+
+obj = gv.$O toke.$O perly.$O op.$O regcomp.$O dump.$O util.$O mg.$O hv.$O av.$O run.$O pp_hot.$O sv.$O pp.$O scope.$O pp_ctl.$O pp_sys.$O doop.$O doio.$O regexec.$O taint.$O deb.$O globals.$O plan9.$O universal.$O
+
+OBJS = perl.$O $obj
+
+testlist = base/*.t comp/*.t cmd/*.t io/*.t op/*.t
+
+install:V: perl preplibrary
+ cp perl /$objtype/bin/perl
+ cp plan9/aperl /rc/bin/aperl
+
+perl: config.h miniperlmain.$O miniperl $archlib/Config.pm perlmain.$O $perlshr
+ $LD $CFLAGS -o perl perlmain.$O $perllib $perlshr
+
+miniperl: config.h $perllib miniperlmain.$O
+ $LD $CFLAGS -o miniperl miniperlmain.$O $perllib
+
+preplibrary:V: miniperl $archlib/Config.pm
+ cd $privlib
+ for (file in *.pm */*.pm $archlib/Config.pm) $sourcedir/miniperl -e 'use AutoSplit; autosplit(@ARGV)' $file $privlib/auto
+
+$perllib(%):N: %
+$perllib: ${OBJS:%=$perllib(%)}
+ ar rv $perllib $OBJS
+ $RANLIB $perllib
+
+miniperlmain.$O: config.h
+ $CCCMD miniperlmain.c
+
+perlmain.$O: config.h perlmain.c
+ $CCCMD perlmain.c
+
+perlmain.c: miniperl vms/writemain.pl
+ ./miniperl vms/writemain.pl $extensions
+
+config.h: config.plan9 plan9/fndvers
+ plan9/fndvers config.h
+ cp config.h $archlib/CORE
+
+$perlshr(%):N: %
+$perlshr: ${ext_obj:%=$perlshr(%)}
+ ar rv $perlshr $ext_obj
+ $RANLIB $perlshr
+
+IO.c: miniperl ext/IO/IO.xs
+ ./miniperl $privlib/ExtUtils/xsubpp -noprototypes -typemap $privlib/ExtUtils/typemap ext/IO/IO.xs > $target
+ cp ext/IO/*.pm $privlib
+ if (test !-d $privlib/IO) mkdir $privlib/IO
+ cp ext/IO/lib/IO/*.pm $privlib/IO
+
+Socket.$O: config.h Socket.c
+ $CCCMD -I plan9 Socket.c
+
+Socket.c: miniperl ext/Socket/Socket.xs
+ ./miniperl $privlib/ExtUtils/xsubpp -noprototypes -typemap $privlib/ExtUtils/typemap ext/Socket/Socket.xs > $target
+ cp ext/Socket/Socket.pm $privlib
+
+Opcode.c: miniperl ext/Opcode/Opcode.xs
+ ./miniperl $privlib/ExtUtils/xsubpp -noprototypes -typemap $privlib/ExtUtils/typemap ext/Opcode/Opcode.xs > $target
+ cp ext/Opcode/*.pm $privlib
+
+Fcntl.c: miniperl ext/Fcntl/Fcntl.xs
+ ./miniperl $privlib/ExtUtils/xsubpp -noprototypes -typemap $privlib/ExtUtils/typemap ext/Fcntl/Fcntl.xs > $target
+ cp ext/Fcntl/Fcntl.pm $privlib
+
+FileHandle.c: miniperl ext/FileHandle/FileHandle.xs
+ ./miniperl $privlib/ExtUtils/xsubpp -noprototypes -typemap $privlib/ExtUtils/typemap ext/FileHandle/FileHandle.xs > $target
+ cp ext/FileHandle/FileHandle.pm $privlib
+
+POSIX.c: miniperl ext/POSIX/POSIX.xs
+ ./miniperl $privlib/ExtUtils/xsubpp -noprototypes -typemap $privlib/ExtUtils/typemap ext/POSIX/POSIX.xs > $target
+ cp ext/POSIX/POSIX.pm $privlib
+
+dl_none.c: miniperl ext/DynaLoader/dl_none.xs
+ ./miniperl $privlib/ExtUtils/xsubpp -noprototypes -typemap $privlib/ExtUtils/typemap ext/DynaLoader/dl_none.xs > $target
+ cp ext/DynaLoader/DynaLoader.pm $privlib
+
+test:V:
+ bind -b $privlib $sourcedir/lib
+ bind -b $archlib $sourcedir/lib
+ cd $sourcedir/t
+ rm -f perl
+ cp /$objtype/bin/perl $sourcedir/t
+ perl TEST `{ ls */*.t | comm -23 - ../plan9/exclude }
+
+plan9.$O: config.h ./plan9/plan9.c
+ cp ./plan9/plan9.c ./plan9.c
+ $CCCMD plan9.c
+
+%.$O: config.h %.c
+ $CCCMD $stem.c
+
+$archlib/Config.pm: miniperl config.sh
+ ./miniperl configpm $archlib/Config.pm
+
+config.sh: miniperl config.h
+ ./miniperl ./plan9/genconfig.pl
+
+installall:V:
+ for (objtype in 386 mips 68020 sparc) mk install
+
+man:V: $perlpods pod/pod2man.PL perl
+ perl pod/pod2man.PL
+ for (i in $podnames) pod/pod2man pod/$i.pod > $installman3dir/$i
+ pod/pod2man plan9/perlplan9.pod > $installman3dir/perlplan9
+
+nuke:V:
+ rm -f *.$O $extensions^.pm config.sh $perllib config.h $perlshr perlmain.c perl miniperl $archlib/Config.pm $ext_c
+
+clean:V:
+ rm -f *.$O config.sh miniperl t/perl
+
+deleteman:V:
+ rm -f $installman1dir/perl* $installman3dir/perl*
diff --git a/plan9/myconfig.plan9 b/plan9/myconfig.plan9
new file mode 100644
index 0000000000..f336a7ce53
--- /dev/null
+++ b/plan9/myconfig.plan9
@@ -0,0 +1,39 @@
+#!/bin/rc
+
+# This script is designed to provide a handy summary of the configuration
+# information being used to build perl. This is especially useful if you
+# are requesting help from comp.lang.perl.misc on usenet or via mail.
+
+#This script is the "myconfig" script altered to run on Plan 9.
+#Last Modified: 28-Jun-96 Luther Huffman lutherh@stratcom.com
+
+
+. config.sh
+
+# Note that the text lines /^Summary of/ .. /^\s*$/ are copied into Config.pm.
+# XXX Add d_sigaction (?) once it's defined.
+
+$spitshell<<!GROK!THIS!
+
+Summary of my $package ($baserev patchlevel $PATCHLEVEL) configuration:
+ Platform:
+ osname=$osname, osver=$osvers, archname=$archname
+ uname='$myuname'
+ hint=$hint, useposix=$useposix
+ Compiler:
+ cc='$cc', optimize='$optimize', gccversion=$gccversion
+ cppflags='$cppflags'
+ ccflags ='$ccflags'
+ stdchar='$stdchar', d_stdstdio=$d_stdstdio, usevfork=$usevfork
+ voidflags=$voidflags, castflags=$castflags, d_casti32=$d_casti32, d_castneg=$d_castneg
+ intsize=$intsize, alignbytes=$alignbytes, usemymalloc=$usemymalloc, randbits=$randbits
+ Linker and Libraries:
+ ld='$ld', ldflags ='$ldflags'
+ libpth=$libpth
+ libs=$libs
+ libc=$libc, so=$so
+ Dynamic Linking:
+ dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags'
+ cccdlflags='$cccdlflags', lddlflags='$lddlflags'
+
+!GROK!THIS!
diff --git a/plan9/perlplan9.doc b/plan9/perlplan9.doc
new file mode 100644
index 0000000000..4f7a057749
--- /dev/null
+++ b/plan9/perlplan9.doc
@@ -0,0 +1,91 @@
+
+ PERLTEST/PLAN9/PERLPLAN9(1) (perl ) PERLTEST/PLAN9/PERLPLAN9(1)
+
+ NNNNAAAAMMMMEEEE
+ perlplan9 - Plan 9-specific documentation for Perl
+
+ DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
+ These are a few notes describing features peculiar to Plan 9
+ Perl. As such, it is not intended to be a replacement for
+ the rest of the Perl 5 documentation (which is both copious
+ and excellent). If you have any questions to which you can't
+ find answers in these man pages, contact Luther Huffman at
+ lutherh@stratcom.com and we'll try to answer them.
+
+ IIIInnnnvvvvooookkkkiiiinnnngggg PPPPeeeerrrrllll
+
+ Perl is invoked from the command line as described in the
+ _p_e_r_l manpage. Most perl scripts, however, do have a first
+ line such as "#!/usr/local/bin/perl". This is known as a
+ shebang (shell-bang) statement and tells the OS shell where
+ to find the perl interpreter. In Plan 9 Perl this statement
+ should be "#!/bin/perl" if you wish to be able to directly
+ invoke the script by its name.
+ Alternatively, you may invoke perl with the command
+ "aperl" instead of "perl". This will produce Acme-friendly
+ error messages of the form "filename:18".
+
+ Some scripts, usually identified with a *.PL extension, are
+ self-configuring and are able to correctly create their own
+ shebang path from config information located in Plan 9 Perl.
+ These you won't need to be worried about.
+
+ WWWWhhhhaaaatttt''''ssss iiiinnnn PPPPllllaaaannnn 9999 PPPPeeeerrrrllll
+
+ Although Plan 9 Perl currently only provides static
+ loading, it is built with a number of useful extensions.
+ These include Safe, FileHandle, Fcntl, and POSIX. Expect to
+ see others (and DynaLoading!) in the future.
+
+ WWWWhhhhaaaatttt''''ssss nnnnooootttt iiiinnnn PPPPllllaaaannnn 9999 PPPPeeeerrrrllll
+
+ As mentioned previously, dynamic loading isn't currently
+ available nor is MakeMaker. Both are high-priority items.
+
+ PPPPeeeerrrrllll5555 FFFFuuuunnnnccccttttiiiioooonnnnssss nnnnooootttt ccccuuuurrrrrrrreeeennnnttttllllyyyy ssssuuuuppppppppoooorrrrtttteeeedddd
+
+ Some, such as chown and umask aren't provided because the
+ concept does not exist within Plan 9. Others, such as some
+ of the socket-related functions, simply haven't been written
+ yet. Many in the latter category may be supported in the
+ future.
+
+ The functions not currently implemented include:
+
+ Page 1 4/Jul/96 (printed 7/4/96)
+
+ PERLTEST/PLAN9/PERLPLAN9(1) (perl ) PERLTEST/PLAN9/PERLPLAN9(1)
+
+ chown, chroot, dbmclose, dbmopen, getsockopt,
+ setsockopt, recvmsg, sendmsg, getnetbyname,
+ getnetbyaddr, getnetent, getprotoent, getservent,
+ sethostent, setnetent, setprotoent, setservent,
+ endservent, endnetent, endprotoent, umask
+
+ There may be several other functions that have undefined
+ behavior so this list shouldn't be considered complete.
+
+ SSSSiiiiggggnnnnaaaallllssss
+
+ For compatibility with perl scripts written for the Unix
+ environment, Plan 9 Perl uses the POSIX signal emulation
+ provided in Plan 9's ANSI POSIX Environment (APE). Signal
+ stacking isn't supported. The signals provided are:
+
+ SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT,
+ SIGFPE, SIGKILL, SIGSEGV, SIGPIPE, SIGPIPE, SIGALRM,
+ SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT,
+ SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU
+
+ BBBBUUUUGGGGSSSS
+ "As many as there are grains of sand on all the beaches of
+ the world . . ." - Carl Sagan
+
+ RRRReeeevvvviiiissssiiiioooonnnn ddddaaaatttteeee
+ This document was revised 04-July-1996 for Perl 5.003_1.
+
+ AAAAUUUUTTTTHHHHOOOORRRR
+ Luther Huffman, lutherh@stratcom.com
+
+ Page 2 4/Jul/96 (printed 7/4/96)
+
diff --git a/plan9/perlplan9.pod b/plan9/perlplan9.pod
new file mode 100644
index 0000000000..fa8d39df8c
--- /dev/null
+++ b/plan9/perlplan9.pod
@@ -0,0 +1,87 @@
+=head1 NAME
+
+perlplan9 - Plan 9-specific documentation for Perl
+
+=head1 DESCRIPTION
+
+These are a few notes describing features peculiar to
+Plan 9 Perl. As such, it is not intended to be a replacement
+for the rest of the Perl 5 documentation (which is both
+copious and excellent). If you have any questions to
+which you can't find answers in these man pages, contact
+Luther Huffman at lutherh@stratcom.com and we'll try to
+answer them.
+
+=head2 Invoking Perl
+
+Perl is invoked from the command line as described in
+L<perl>. Most perl scripts, however, do have a first line
+such as "#!/usr/local/bin/perl". This is known as a shebang
+(shell-bang) statement and tells the OS shell where to find
+the perl interpreter. In Plan 9 Perl this statement should be
+"#!/bin/perl" if you wish to be able to directly invoke the
+script by its name.
+ Alternatively, you may invoke perl with the command "aperl"
+instead of "perl". This will produce Acme-friendly error
+messages of the form "filename:18".
+
+Some scripts, usually identified with a *.PL extension, are
+self-configuring and are able to correctly create their own
+shebang path from config information located in Plan 9
+Perl. These you won't need to be worried about.
+
+=head2 What's in Plan 9 Perl
+
+Although Plan 9 Perl currently only provides static
+loading, it is built with a number of useful extensions.
+These include Safe, FileHandle, Fcntl, and POSIX. Expect
+to see others (and DynaLoading!) in the future.
+
+=head2 What's not in Plan 9 Perl
+
+As mentioned previously, dynamic loading isn't currently
+available nor is MakeMaker. Both are high-priority items.
+
+=head2 Perl5 Functions not currently supported
+
+Some, such as C<chown> and C<umask> aren't provided
+because the concept does not exist within Plan 9. Others,
+such as some of the socket-related functions, simply
+haven't been written yet. Many in the latter category
+may be supported in the future.
+
+The functions not currently implemented include:
+
+ chown, chroot, dbmclose, dbmopen, getsockopt,
+ setsockopt, recvmsg, sendmsg, getnetbyname,
+ getnetbyaddr, getnetent, getprotoent, getservent,
+ sethostent, setnetent, setprotoent, setservent,
+ endservent, endnetent, endprotoent, umask
+
+There may be several other functions that have undefined
+behavior so this list shouldn't be considered complete.
+
+=head2 Signals
+
+For compatibility with perl scripts written for the Unix
+environment, Plan 9 Perl uses the POSIX signal emulation
+provided in Plan 9's ANSI POSIX Environment (APE). Signal stacking
+isn't supported. The signals provided are:
+
+ SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT,
+ SIGFPE, SIGKILL, SIGSEGV, SIGPIPE, SIGPIPE, SIGALRM,
+ SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT,
+ SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU
+
+=head1 BUGS
+
+"As many as there are grains of sand on all the beaches of the
+world . . ." - Carl Sagan
+
+=head1 Revision date
+
+This document was revised 04-July-1996 for Perl 5.003_1.
+
+=head1 AUTHOR
+
+Luther Huffman, lutherh@stratcom.com \ No newline at end of file
diff --git a/plan9/plan9.c b/plan9/plan9.c
new file mode 100644
index 0000000000..ebdac27dcb
--- /dev/null
+++ b/plan9/plan9.c
@@ -0,0 +1,134 @@
+#include "EXTERN.h"
+#include "perl.h"
+
+/* Functions mentioned in <sys/socket.h> but not implemented */
+
+int getsockopt(int a, int b, int c, void *d, int *e)
+{
+ croak("Function \"getsockopt\" not implemented in this version of perl.");
+ return (int)NULL;
+}
+
+int setsockopt(int a, int b, int c, void *d, int *e)
+{
+ croak("Function \"setsockopt\" not implemented in this version of perl.");
+ return (int)NULL;
+}
+
+
+int recvmsg(int a, struct msghdr *b, int c)
+{
+ croak("Function \"recvmsg\" not implemented in this version of perl.");
+ return (int)NULL;
+}
+
+int sendmsg(int a, struct msghdr *b, int c)
+{
+ croak("Function \"sendmsg\" not implemented in this version of perl.");
+ return (int)NULL;
+}
+
+
+/* Functions mentioned in <netdb.h> but not implemented */
+struct netent *getnetbyname(const char *a)
+{
+ croak("Function \"getnetbyname\" not implemented in this version of perl.");
+ return (struct netent *)NULL;
+}
+
+struct netent *getnetbyaddr(long a, int b)
+{
+ croak("Function \"getnetbyaddr\" not implemented in this version of perl.");
+ return (struct netent *)NULL;
+}
+
+struct netent *getnetent()
+{
+ croak("Function \"getnetent\" not implemented in this version of perl.");
+ return (struct netent *)NULL;
+}
+
+struct protoent *getprotobyname(const char *a)
+{
+ croak("Function \"getprotobyname\" not implemented in this version of perl.");
+ return (struct protoent *)NULL;
+}
+
+struct protoent *getprotobynumber(int a)
+{
+ croak("Function \"getprotobynumber\" not implemented in this version of perl.");
+ return (struct protoent *)NULL;
+}
+
+struct protoent *getprotoent()
+{
+ croak("Function \"getprotoent\" not implemented in this version of perl.");
+ return (struct protoent *)NULL;
+}
+
+struct servent *getservbyport(int a, const char *b)
+{
+ croak("Function \"getservbyport\" not implemented in this version of perl.");
+ return (struct servent *)NULL;
+}
+
+struct servent *getservent()
+{
+ croak("Function \"getservent\" not implemented in this version of perl.");
+ return (struct servent *)NULL;
+}
+
+void sethostent(int a)
+{
+ croak("Function \"sethostent\" not implemented in this version of perl.");
+}
+
+void setnetent(int a)
+{
+ croak("Function \"setnetent\" not implemented in this version of perl.");
+}
+
+void setprotoent(int a)
+{
+ croak("Function \"setprotoent\" not implemented in this version of perl.");
+}
+
+void setservent(int a)
+{
+ croak("Function \"setservent\" not implemented in this version of perl.");
+}
+
+void endnetent()
+{
+ croak("Function \"endnetent\" not implemented in this version of perl.");
+}
+
+void endprotoent()
+{
+ croak("Function \"endprotoent\" not implemented in this version of perl.");
+}
+
+void endservent()
+{
+ croak("Function \"endservent\" not implemented in this version of perl.");
+}
+
+int tcdrain(int)
+{
+croak("Function \"tcdrain\" not implemented in this version of perl.");
+}
+
+int tcflow(int, int)
+{
+croak("Function \"tcflow\" not implemented in this version of perl.");
+}
+
+int tcflush(int, int)
+{
+croak("Function \"tcflush\" not implemented in this version of perl.");
+}
+
+int tcsendbreak(int, int)
+{
+croak("Function \"tcsendbreak\" not implemented in this version of perl.");
+}
diff --git a/plan9/plan9ish.h b/plan9/plan9ish.h
new file mode 100644
index 0000000000..6613c362e6
--- /dev/null
+++ b/plan9/plan9ish.h
@@ -0,0 +1,113 @@
+#ifndef __PLAN9ISH_H__
+#define __PLAN9ISH_H__
+
+/*
+ * The following symbols are defined if your operating system supports
+ * functions by that name. All Unixes I know of support them, thus they
+ * are not checked by the configuration script, but are directly defined
+ * here.
+ */
+
+/* HAS_IOCTL:
+ * This symbol, if defined, indicates that the ioctl() routine is
+ * available to set I/O characteristics
+ */
+#define HAS_IOCTL /**/
+
+/* HAS_UTIME:
+ * This symbol, if defined, indicates that the routine utime() is
+ * available to update the access and modification times of files.
+ */
+#define HAS_UTIME /**/
+
+/* HAS_GROUP
+ * This symbol, if defined, indicates that the getgrnam(),
+ * getgrgid(), and getgrent() routines are available to
+ * get group entries.
+ */
+/*#define HAS_GROUP /**/
+
+/* HAS_PASSWD
+ * This symbol, if defined, indicates that the getpwnam(),
+ * getpwuid(), and getpwent() routines are available to
+ * get password entries.
+ */
+/*#define HAS_PASSWD /**/
+
+#define HAS_KILL
+#define HAS_WAIT
+
+/* UNLINK_ALL_VERSIONS:
+ * This symbol, if defined, indicates that the program should arrange
+ * to remove all versions of a file if unlink() is called. This is
+ * probably only relevant for VMS.
+ */
+/* #define UNLINK_ALL_VERSIONS /**/
+
+/* PLAN9:
+ * This symbol, if defined, indicates that the program is running under
+ * Plan 9.
+ */
+#ifndef PLAN9
+#define PLAN9 /**/
+#endif
+
+/* USEMYBINMODE
+ * This symbol, if defined, indicates that the program should
+ * use the routine my_binmode(FILE *fp, char iotype) to insure
+ * that a file is in "binary" mode -- that is, that no translation
+ * of bytes occurs on read or write operations.
+ */
+#undef USEMYBINMODE
+
+/* USE_STAT_RDEV:
+* This symbol is defined if this system has a stat structure declaring
+* st_rdev
+*/
+#undef USE_STAT_RDEV /**/
+
+/* ACME_MESS:
+ * This symbol, if defined, indicates that error messages should be
+ * should be generated in a format that allows the use of the Acme
+ * GUI/editor's autofind feature.
+ */
+#define ACME_MESS /**/
+
+#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
+# include <signal.h>
+#endif
+
+#ifndef SIGABRT
+# define SIGABRT SIGILL
+#endif
+#ifndef SIGILL
+# define SIGILL 6 /* blech */
+#endif
+#define ABORT() kill(getpid(),SIGABRT);
+
+#define BIT_BUCKET "/dev/null"
+#define PERL_SYS_INIT(c,v)
+#define dXSUB_SYS int dummy
+#define PERL_SYS_TERM()
+
+/*
+ * fwrite1() should be a routine with the same calling sequence as fwrite(),
+ * but which outputs all of the bytes requested as a single stream (unlike
+ * fwrite() itself, which on some systems outputs several distinct records
+ * if the number_of_items parameter is >1).
+ */
+#define fwrite1 fwrite
+
+#define Stat(fname,bufptr) stat((fname),(bufptr))
+#define Fstat(fd,bufptr) fstat((fd),(bufptr))
+#define Fflush(fp) fflush(fp)
+
+/* getenv related stuff */
+#define my_getenv(var) getenv(var)
+/* Plan 9 prefers getenv("home") to getenv("HOME")
+#define HOME home
+
+/* For use by POSIX.xs */
+extern int tcsendbreak(int, int);
+
+#endif /* __PLAN9ISH_H__ */
diff --git a/plan9/setup.rc b/plan9/setup.rc
new file mode 100644
index 0000000000..c6ebe86fc8
--- /dev/null
+++ b/plan9/setup.rc
@@ -0,0 +1,48 @@
+#!/bin/rc
+# This is an rc shell script which unpacks the perl distribution, builds
+# directories, and puts files where they belong.
+# To use, just run it from within the plan9 subdirectory with the appropriate
+# permissions.
+# Last modified 6/30/96 by:
+# Luther Huffman, Strategic Computer Solutions, Inc., lutherh@stratcom.com
+
+. buildinfo
+builddir = `{ cd .. ; pwd }
+if(flag a) platforms = (386 mips sparc 68020)
+if not platforms = $objtype
+sourcedir=/sys/src/cmd/perl/$p9pvers
+privlib=/sys/lib/perl
+sitelib=$privlib/site_perl
+
+#Build source directory
+if (test ! -d /sys/src/cmd/perl) mkdir /sys/src/cmd/perl
+if (test ! -d $sourcedir) mkdir $sourcedir
+
+#Populate source directory
+echo Building source directories ...
+{cd $builddir ; tar c .} | { cd $sourcedir ; tar x}
+cp $builddir/plan9/config.plan9 $sourcedir/config.plan9
+cp $builddir/plan9/plan9.c $builddir/plan9/plan9ish.h $builddir/plan9/mkfile $sourcedir
+cd $sourcedir/lib ; rm -rf *
+
+#Build library directories
+echo Building library directories ...
+if (test ! -d $privlib) mkdir $privlib
+if (test ! -d $privlib/auto) mkdir $privlib/auto
+if (test ! -d $sitelib) mkdir $sitelib
+for(i in $platforms){
+ archlib=/$i/lib/perl/$p9pvers
+ sitearch=$archlib/site_perl
+ corelib=$archlib/CORE
+ arpalib=$corelib/arpa
+ if (test ! -d /$i/lib/perl) mkdir /$i/lib/perl
+ if (test ! -d $archlib) mkdir $archlib
+ if (test ! -d $sitearch) mkdir $sitearch
+ if (test ! -d $corelib) mkdir $corelib
+ if (test ! -d $arpalib) mkdir $arpalib
+ cp $builddir/*.h $builddir/plan9/*.h $corelib
+ cp $builddir/plan9/arpa/*.h $arpalib
+}
+
+#Populate library directories
+{cd $builddir/lib ; tar c . } | {cd $privlib ; tar x }