xref: /plan9/sys/doc/ape.ms (revision 0ceffd3c74a1de03d13dc3aa8fa06e39d209dbd4)
1426d2b71SDavid du Colombier.HTML "APE — The ANSI/POSIX Environment
23e12c5d1SDavid du Colombier.de XX
33e12c5d1SDavid du Colombier.IP \ \ \ \-
43e12c5d1SDavid du Colombier..
53e12c5d1SDavid du Colombier.TL
63e12c5d1SDavid du ColombierAPE \(em The ANSI/POSIX Environment
73e12c5d1SDavid du Colombier.AU
83e12c5d1SDavid du ColombierHoward Trickey
97dd7cddfSDavid du Colombierhoward@plan9.bell-labs.com
103e12c5d1SDavid du Colombier.SH
113e12c5d1SDavid du ColombierIntroduction
123e12c5d1SDavid du Colombier.PP
13219b2ee8SDavid du ColombierWhen a large or frequently-updated program must be ported
14219b2ee8SDavid du Colombierto or from Plan 9, the ANSI/POSIX environment known as APE can be useful.
153e12c5d1SDavid du ColombierAPE combines the set of headers and object code libraries specified by
163e12c5d1SDavid du Colombierthe ANSI C standard (ANSI X3.159-1989) with the POSIX operating system
17219b2ee8SDavid du Colombierinterface standard (IEEE 1003.1-1990, ISO 9945-1), the part of POSIX
18219b2ee8SDavid du Colombierdefining the basic operating system functions.
193e12c5d1SDavid du ColombierUsing APE will cause slower compilation and marginally slower execution speeds,
203e12c5d1SDavid du Colombierso if the importing or exporting happens only infrequently, due consideration
213e12c5d1SDavid du Colombiershould be given to using the usual Plan 9 compilation environment instead.
223e12c5d1SDavid du ColombierAnother factor to consider is that the Plan 9 header organization is
233e12c5d1SDavid du Colombiermuch simpler to remember and use.
243e12c5d1SDavid du Colombier.PP
25219b2ee8SDavid du ColombierThere are some aspects of required POSIX behavior that are impossible or
263e12c5d1SDavid du Colombiervery hard to simulate in Plan 9.  They are described below.
273e12c5d1SDavid du ColombierExperience has shown, however, that the simulation is adequate for the
28219b2ee8SDavid du Colombiervast majority of programs.  A much more common problem is that
293e12c5d1SDavid du Colombiermany programs use functions or headers not defined by POSIX.
303e12c5d1SDavid du ColombierAPE has some extensions to POSIX to help in this regard.
31219b2ee8SDavid du ColombierExtensions must be explicitly enabled with an appropriate
32219b2ee8SDavid du Colombier.CW #define ,
33219b2ee8SDavid du Colombierin order that the APE environment be a good aid for testing
34219b2ee8SDavid du ColombierANSI/POSIX compliance of programs.
353e12c5d1SDavid du Colombier.SH
363e12c5d1SDavid du ColombierPcc
373e12c5d1SDavid du Colombier.PP
383e12c5d1SDavid du ColombierThe
393e12c5d1SDavid du Colombier.CW pcc
403e12c5d1SDavid du Colombiercommand acts as a front end to the Plan 9 C compilers and loaders.
41219b2ee8SDavid du ColombierIt runs an ANSI C preprocessor over source files, using the APE
423e12c5d1SDavid du Colombierheaders to satisfy
433e12c5d1SDavid du Colombier.CW "#include <\fIfile\fP>"
443e12c5d1SDavid du Colombierdirectives; then it runs a Plan 9 C compiler; finally, it may load
453e12c5d1SDavid du Colombierwith APE libraries to produce an executable program.
463e12c5d1SDavid du ColombierThe document
473e12c5d1SDavid du Colombier.I "How to Use the Plan 9 C Compiler"
483e12c5d1SDavid du Colombierexplains how environment variables are used by convention to
493e12c5d1SDavid du Colombierhandle compilation for differing architectures.
503e12c5d1SDavid du ColombierThe environment variable
513e12c5d1SDavid du Colombier.CW $objtype
523e12c5d1SDavid du Colombiercontrols which Plan 9 compiler and loader are used by
533e12c5d1SDavid du Colombier.CW pcc ,
543e12c5d1SDavid du Colombieras well as the location of header and library files.
553e12c5d1SDavid du ColombierFor example, if
563e12c5d1SDavid du Colombier.CW $objtype
573e12c5d1SDavid du Colombieris
583e12c5d1SDavid du Colombier.CW mips ,
593e12c5d1SDavid du Colombierthen
603e12c5d1SDavid du Colombier.CW pcc
613e12c5d1SDavid du Colombierhas
623e12c5d1SDavid du Colombier.CW cpp
633e12c5d1SDavid du Colombierlook for headers in
643e12c5d1SDavid du Colombier.CW /mips/include/ape
653e12c5d1SDavid du Colombierfollowed by
663e12c5d1SDavid du Colombier.CW /sys/include/ape ;
673e12c5d1SDavid du Colombierthen
683e12c5d1SDavid du Colombier.CW pcc
693e12c5d1SDavid du Colombieruses
703e12c5d1SDavid du Colombier.CW vc
713e12c5d1SDavid du Colombierto create
723e12c5d1SDavid du Colombier.CW .v
733e12c5d1SDavid du Colombierobject files;
743e12c5d1SDavid du Colombierfinally,
753e12c5d1SDavid du Colombier.CW vl
763e12c5d1SDavid du Colombieris used to create an executable using libraries in
773e12c5d1SDavid du Colombier.CW /mips/lib/ape .
783e12c5d1SDavid du Colombier.SH
79219b2ee8SDavid du ColombierPsh and Cc
80219b2ee8SDavid du Colombier.PP
81219b2ee8SDavid du ColombierThe
82219b2ee8SDavid du Colombier.CW pcc
83219b2ee8SDavid du Colombiercommand is intended for uses where the source code is
84219b2ee8SDavid du ColombierANSI/POSIX, but the programs are built in the usual Plan 9
85219b2ee8SDavid du Colombiermanner \(em with
86219b2ee8SDavid du Colombier.CW mk
87219b2ee8SDavid du Colombierand producing object files with names ending in
88219b2ee8SDavid du Colombier.CW .v ,
89219b2ee8SDavid du Colombieretc.
90219b2ee8SDavid du ColombierSometimes it is best to use the standard POSIX
91219b2ee8SDavid du Colombier.CW make
92219b2ee8SDavid du Colombierand
93219b2ee8SDavid du Colombier.CW cc
94219b2ee8SDavid du Colombier(which produces object files with names ending in
95219b2ee8SDavid du Colombier.CW .o ,
96219b2ee8SDavid du Colombierand automatically calls the loader unless
97219b2ee8SDavid du Colombier.CW -c
98219b2ee8SDavid du Colombieris specified).
99219b2ee8SDavid du ColombierUnder these circumstances, execute the command:
100219b2ee8SDavid du Colombier.DS
101219b2ee8SDavid du Colombier.CW "ape/psh"
102219b2ee8SDavid du Colombier.DE
103219b2ee8SDavid du ColombierThis starts a POSIX shell, with an environment that
104219b2ee8SDavid du Colombierincludes the POSIX commands
105219b2ee8SDavid du Colombier.CW ar89 ,
106219b2ee8SDavid du Colombier.CW c89 ,
107219b2ee8SDavid du Colombier.CW cc ,
108219b2ee8SDavid du Colombier.CW basename ,
109219b2ee8SDavid du Colombier.CW dirname ,
110219b2ee8SDavid du Colombier.CW expr ,
111219b2ee8SDavid du Colombier.CW false ,
112219b2ee8SDavid du Colombier.CW grep ,
113219b2ee8SDavid du Colombier.CW kill ,
114219b2ee8SDavid du Colombier.CW make ,
115219b2ee8SDavid du Colombier.CW rmdir ,
116219b2ee8SDavid du Colombier.CW sed ,
117219b2ee8SDavid du Colombier.CW sh ,
118219b2ee8SDavid du Colombier.CW stty ,
119219b2ee8SDavid du Colombier.CW true ,
120219b2ee8SDavid du Colombier.CW uname ,
121219b2ee8SDavid du Colombierand
122219b2ee8SDavid du Colombier.CW yacc .
123219b2ee8SDavid du ColombierThere are also a few placeholders for commands that cannot be
124219b2ee8SDavid du Colombierimplemented in Plan 9:
125219b2ee8SDavid du Colombier.CW chown ,
126219b2ee8SDavid du Colombier.CW ln ,
127219b2ee8SDavid du Colombierand
128219b2ee8SDavid du Colombier.CW umask .
129219b2ee8SDavid du Colombier.PP
130219b2ee8SDavid du ColombierThe
131219b2ee8SDavid du Colombier.CW cc
132219b2ee8SDavid du Colombiercommand accepts the options mandated for
133219b2ee8SDavid du Colombierthe POSIX command
134219b2ee8SDavid du Colombier.CW c89 ,
135219b2ee8SDavid du Colombieras specified in the C-Language Development Utilities Option
136219b2ee8SDavid du Colombierannex of the POSIX Shell and Utilities standard.
137219b2ee8SDavid du ColombierIt also accepts the following nonstandard options:
138219b2ee8SDavid du Colombier.CW -v
139219b2ee8SDavid du Colombierfor echoing the commands for each pass to stdout;
140219b2ee8SDavid du Colombier.CW -A
141219b2ee8SDavid du Colombierto turn on ANSI prototype warnings;
142219b2ee8SDavid du Colombier.CW -S
143219b2ee8SDavid du Colombierto leave assembly language in
144219b2ee8SDavid du Colombier.I file .s;
145219b2ee8SDavid du Colombier.CW -Wp,\fIargs\fP
146219b2ee8SDavid du Colombierto pass
147219b2ee8SDavid du Colombier.I args
148219b2ee8SDavid du Colombierto the
149219b2ee8SDavid du Colombier.CW cpp ;
150219b2ee8SDavid du Colombier.CW -W0,\fIargs\fP
151219b2ee8SDavid du Colombierto pass
152219b2ee8SDavid du Colombier.I args
153219b2ee8SDavid du Colombierto 2c, etc.;
154219b2ee8SDavid du Colombierand
155219b2ee8SDavid du Colombier.CW -Wl,\fIargs\fP
156219b2ee8SDavid du Colombierto pass
157219b2ee8SDavid du Colombier.I args
158219b2ee8SDavid du Colombierto 2l, etc.
159219b2ee8SDavid du Colombier.PP
160219b2ee8SDavid du ColombierThe
161219b2ee8SDavid du Colombier.CW sh
1627dd7cddfSDavid du Colombiercommand is pdksh, a mostly POSIX-compliant public domain Korn Shell.
163219b2ee8SDavid du ColombierThe Plan 9 implementation does not include
164219b2ee8SDavid du Colombierthe emacs and vi editing modes.
165219b2ee8SDavid du Colombier.PP
166219b2ee8SDavid du ColombierThe
167219b2ee8SDavid du Colombier.CW stty
168219b2ee8SDavid du Colombiercommand only has effect if the
169219b2ee8SDavid du Colombier.CW ape/ptyfs
170219b2ee8SDavid du Colombiercommand has been started to interpose a pseudo-tty interface
171219b2ee8SDavid du Colombierbetween
172219b2ee8SDavid du Colombier.CW /dev/cons
173219b2ee8SDavid du Colombierand the running command.
174219b2ee8SDavid du ColombierNone of the distributed commands do this automatically.
175219b2ee8SDavid du Colombier.SH
1763e12c5d1SDavid du ColombierSymbols
1773e12c5d1SDavid du Colombier.PP
1783e12c5d1SDavid du ColombierThe C and POSIX standards require that certain symbols be
1793e12c5d1SDavid du Colombierdefined in headers.
1803e12c5d1SDavid du ColombierThey also require that certain other classes of symbols not
1813e12c5d1SDavid du Colombierbe defined in the headers, and specify certain other
1823e12c5d1SDavid du Colombiersymbols that may be defined in headers at the discretion
1833e12c5d1SDavid du Colombierof the implementation.
1843e12c5d1SDavid du ColombierPOSIX defines
1853e12c5d1SDavid du Colombier.I "feature test macros" ,
1863e12c5d1SDavid du Colombierwhich are preprocessor symbols beginning with an underscore
1873e12c5d1SDavid du Colombierand then a capital letter;  if the program
1883e12c5d1SDavid du Colombier.CW #defines
1893e12c5d1SDavid du Colombiera feature test macro before the inclusion of any headers,
1903e12c5d1SDavid du Colombierthen it is requesting that certain symbols be visible in the headers.
1913e12c5d1SDavid du ColombierThe most important feature test macro is
1923e12c5d1SDavid du Colombier.CW _POSIX_SOURCE :
1933e12c5d1SDavid du Colombierwhen it is defined, exactly the symbols required by POSIX are
1943e12c5d1SDavid du Colombiervisible in the appropriate headers.
1953e12c5d1SDavid du ColombierConsider
1963e12c5d1SDavid du Colombier.CW <signal.h>
1973e12c5d1SDavid du Colombierfor example:
1983e12c5d1SDavid du ColombierANSI defines some names that must be defined in
1993e12c5d1SDavid du Colombier.CW <signal.h> ,
2003e12c5d1SDavid du Colombierbut POSIX defines others, such as
2013e12c5d1SDavid du Colombier.CW sigset_t ,
2023e12c5d1SDavid du Colombierwhich are not allowed according to ANSI.
2033e12c5d1SDavid du ColombierThe solution is to make the additional symbols visible only when
2043e12c5d1SDavid du Colombier.CW _POSIX_SOURCE
2053e12c5d1SDavid du Colombieris defined.
2063e12c5d1SDavid du Colombier.PP
207219b2ee8SDavid du ColombierTo export a program, it helps to know whether it fits
2083e12c5d1SDavid du Colombierin one of the following categories:
2093e12c5d1SDavid du Colombier.IP 1.
2103e12c5d1SDavid du ColombierStrictly conforming ANSI C program. It only uses features of the language,
2113e12c5d1SDavid du Colombierlibraries, and headers explicitly required by the C standard.  It does not
2123e12c5d1SDavid du Colombierdepend on unspecified, undefined, or implementation-dependent behavior,
2133e12c5d1SDavid du Colombierand does not exceed any minimum implementation limit.
2143e12c5d1SDavid du Colombier.IP 2.
215219b2ee8SDavid du ColombierStrictly conforming POSIX program. Similar, but for the POSIX standard as well.
2163e12c5d1SDavid du Colombier.IP 3.
2173e12c5d1SDavid du ColombierSome superset of POSIX, with extensions.  Each extension
2183e12c5d1SDavid du Colombieris selected by a feature test macro, so it is clear which extensions
2193e12c5d1SDavid du Colombierare being used.
2203e12c5d1SDavid du Colombier.PP
2213e12c5d1SDavid du ColombierWith APE, if headers are always included to declare any library functions
2223e12c5d1SDavid du Colombierused, then the set of feature test macros defined by a program will
2233e12c5d1SDavid du Colombiershow which of the above categories the program is in.
224219b2ee8SDavid du ColombierTo accomplish this, no symbol is defined in a header if it is not required
2253e12c5d1SDavid du Colombierby the C or POSIX standard, and those required by the POSIX standard
2263e12c5d1SDavid du Colombierare protected by
2273e12c5d1SDavid du Colombier.CW "#ifdef _POSIX_SOURCE" .
2283e12c5d1SDavid du ColombierFor example,
2293e12c5d1SDavid du Colombier.CW <errno.h>
2303e12c5d1SDavid du Colombierdefines
2313e12c5d1SDavid du Colombier.CW EDOM ,
2323e12c5d1SDavid du Colombier.CW ERANGE ,
2333e12c5d1SDavid du Colombierand
2343e12c5d1SDavid du Colombier.CW errno ,
2353e12c5d1SDavid du Colombieras required by the C standard.
2363e12c5d1SDavid du ColombierThe C standard allows more names beginning with
2373e12c5d1SDavid du Colombier.CW E ,
2383e12c5d1SDavid du Colombierbut our header defines only those unless
2393e12c5d1SDavid du Colombier.CW _POSIX_SOURCE
240219b2ee8SDavid du Colombieris defined, in which case the symbols required by POSIX are also defined.
241219b2ee8SDavid du ColombierThis means that a program that uses
2423e12c5d1SDavid du Colombier.CW ENAMETOOLONG
2433e12c5d1SDavid du Colombiercannot masquerade as a strictly conforming ANSI C program.
2443e12c5d1SDavid du Colombier.PP
2453e12c5d1SDavid du Colombier.CW Pcc
246219b2ee8SDavid du Colombierand
247219b2ee8SDavid du Colombier.CW cc
248219b2ee8SDavid du Colombierdo not predefine any preprocessor symbols except those required by
2493e12c5d1SDavid du Colombierthe ANSI C standard:
2503e12c5d1SDavid du Colombier.CW __STDC__ ,
2513e12c5d1SDavid du Colombier.CW __LINE__ ,
2523e12c5d1SDavid du Colombier.CW __FILE__ ,
2533e12c5d1SDavid du Colombier.CW __DATE__ ,
2543e12c5d1SDavid du Colombierand
2553e12c5d1SDavid du Colombier.CW __TIME__ .
256219b2ee8SDavid du ColombierAny others must be defined in the program itself or by using
2573e12c5d1SDavid du Colombier.CW -D
2583e12c5d1SDavid du Colombieron the command line.
2593e12c5d1SDavid du Colombier.SH
2603e12c5d1SDavid du ColombierExtensions
2613e12c5d1SDavid du Colombier.PP
262219b2ee8SDavid du ColombierThe discipline enforced by putting only required
2633e12c5d1SDavid du Colombiernames in the headers is useful for exporting programs,
2643e12c5d1SDavid du Colombierbut it gets in the way when importing programs.
2653e12c5d1SDavid du ColombierThe compromise is to allow additional symbols in headers,
2663e12c5d1SDavid du Colombieradditional headers, and additional library functions,
2673e12c5d1SDavid du Colombierbut only under control of extension feature test macros.
2683e12c5d1SDavid du ColombierThe following extensions are provided; unless otherwise
2693e12c5d1SDavid du Colombierspecified, the additional library functions are in the
2703e12c5d1SDavid du Colombierdefault APE library.
2713e12c5d1SDavid du Colombier.XX
2723e12c5d1SDavid du Colombier.CW _LIBG_EXTENSION .
2733e12c5d1SDavid du ColombierThis allows the use of the Plan 9 graphics library.
2743e12c5d1SDavid du ColombierThe functions are as described in the Plan 9 manual (see
2753e12c5d1SDavid du Colombier.I graphics (2))
2763e12c5d1SDavid du Colombierexcept that
2773e12c5d1SDavid du Colombier.CW div
2783e12c5d1SDavid du Colombierhad to be renamed
2793e12c5d1SDavid du Colombier.CW ptdiv .
2803e12c5d1SDavid du ColombierInclude the
2813e12c5d1SDavid du Colombier.CW <libg.h>
282219b2ee8SDavid du Colombierheader to declare the needed types and functions.
2833e12c5d1SDavid du Colombier.XX
2843e12c5d1SDavid du Colombier.CW _LIMITS_EXTENSION .
2853e12c5d1SDavid du ColombierPOSIX does not require that names such as
2863e12c5d1SDavid du Colombier.CW PATH_MAX
2873e12c5d1SDavid du Colombierand
2883e12c5d1SDavid du Colombier.CW OPEN_MAX
2893e12c5d1SDavid du Colombierbe defined in
2903e12c5d1SDavid du Colombier.CW <limits.h> ,
2913e12c5d1SDavid du Colombierbut many programs assume they are defined there.
2923e12c5d1SDavid du ColombierIf
2933e12c5d1SDavid du Colombier.CW _LIMITS_EXTENSION
2943e12c5d1SDavid du Colombieris defined, those names will all be defined when
2953e12c5d1SDavid du Colombier.CW <limits.h>
2963e12c5d1SDavid du Colombieris included.
2973e12c5d1SDavid du Colombier.XX
298219b2ee8SDavid du Colombier.CW _BSD_EXTENSION .
299219b2ee8SDavid du ColombierThis extension includes not only Berkeley Unix routines,
300219b2ee8SDavid du Colombierbut also a grab bag of other miscellaneous routines often
301219b2ee8SDavid du Colombierfound in Unix implementations.
302219b2ee8SDavid du ColombierThe extension allows the inclusion of any of:
303219b2ee8SDavid du Colombier.CW <bsd.h>
304219b2ee8SDavid du Colombierfor
305219b2ee8SDavid du Colombier.CW bcopy() ,
306219b2ee8SDavid du Colombier.CW bcmp() ,
307219b2ee8SDavid du Colombierand similar Berkeley functions;
308219b2ee8SDavid du Colombier.CW <netdb.h>
309219b2ee8SDavid du Colombierfor
310219b2ee8SDavid du Colombier.CW gethostbyname() ,
311219b2ee8SDavid du Colombieretc.,
312219b2ee8SDavid du Colombierand associated structures;
313219b2ee8SDavid du Colombier.CW <select.h>
314219b2ee8SDavid du Colombierfor the Berkeley
315219b2ee8SDavid du Colombier.CW select
316219b2ee8SDavid du Colombierfunction and associated types and macros
317219b2ee8SDavid du Colombierfor dealing with multiple input sources;
318219b2ee8SDavid du Colombier.CW <sys/ioctl.h>
319219b2ee8SDavid du Colombierfor the
320219b2ee8SDavid du Colombier.CW ioctl
321219b2ee8SDavid du Colombierfunction (minimally implemented);
322219b2ee8SDavid du Colombier.CW <sys/param.h>
323219b2ee8SDavid du Colombierfor
324219b2ee8SDavid du Colombier.CW NOFILES_MAX ;
325219b2ee8SDavid du Colombier.CW <sys/pty.h>
326219b2ee8SDavid du Colombierfor pseudo-tty support via the
327219b2ee8SDavid du Colombier.CW ptsname(int)
328219b2ee8SDavid du Colombierand
329219b2ee8SDavid du Colombier.CW ptmname(int)
330219b2ee8SDavid du Colombierfunctions;
331219b2ee8SDavid du Colombier.CW <sys/resource.h> ;
332219b2ee8SDavid du Colombier.CW <sys/socket.h>
333219b2ee8SDavid du Colombierfor socket structures, constants, and functions;
3343e12c5d1SDavid du Colombier.CW <sys/time.h>
335219b2ee8SDavid du Colombierfor definitions of the
3363e12c5d1SDavid du Colombier.CW timeval
3373e12c5d1SDavid du Colombierand
3383e12c5d1SDavid du Colombier.CW timezone
339219b2ee8SDavid du Colombierstructures;
3403e12c5d1SDavid du Colombierand
341219b2ee8SDavid du Colombier.CW <sys/uio.h>
342219b2ee8SDavid du Colombierfor the
343219b2ee8SDavid du Colombier.CW iovec
344219b2ee8SDavid du Colombierstructure and the
345219b2ee8SDavid du Colombier.CW writev
3463e12c5d1SDavid du Colombierand
347219b2ee8SDavid du Colombier.CW readv
348219b2ee8SDavid du Colombierfunctions used for scatter/gather I/O.
349219b2ee8SDavid du ColombierDefining
350219b2ee8SDavid du Colombier.CW _BSD_EXTENSION
351219b2ee8SDavid du Colombieralso enables various extra definitions in
352219b2ee8SDavid du Colombier.CW <ctype.h> ,
353219b2ee8SDavid du Colombier.CW <signal.h> ,
354219b2ee8SDavid du Colombier.CW <stdio.h> ,
355219b2ee8SDavid du Colombier.CW <unistd.h> ,
356219b2ee8SDavid du Colombier.CW <sys/stat.h> ,
3573e12c5d1SDavid du Colombierand
358219b2ee8SDavid du Colombier.CW <sys/times.h> .
3593e12c5d1SDavid du Colombier.XX
3603e12c5d1SDavid du Colombier.CW _NET_EXTENSION .
3613e12c5d1SDavid du ColombierThis extension allows inclusion of
3623e12c5d1SDavid du Colombier.CW <libnet.h> ,
3633e12c5d1SDavid du Colombierwhich defines the networking functions described in the Plan 9 manual page
3643e12c5d1SDavid du Colombier.I dial (2).
3653e12c5d1SDavid du Colombier.XX
3669acf0835SDavid du Colombier.CW _PLAN9_EXTENSION .
3679acf0835SDavid du ColombierThis extension allows inclusion of
3689acf0835SDavid du Colombier.CW <u.h> ,
3699acf0835SDavid du Colombier.CW <lock.h> ,
3709acf0835SDavid du Colombier.CW <qlock.h> ,
3719acf0835SDavid du Colombier.CW <utf.h> ,
3729acf0835SDavid du Colombier.CW <fmt.h> ,
3739acf0835SDavid du Colombierand
3749acf0835SDavid du Colombier.CW <draw.h> .
3759acf0835SDavid du ColombierThese are pieces of Plan 9 source code ported into APE,
3769acf0835SDavid du Colombiermostly from
3779acf0835SDavid du Colombier.CW <libc.h> .
3789acf0835SDavid du Colombier.XX
3793e12c5d1SDavid du Colombier.CW _REGEXP_EXTENSION .
3803e12c5d1SDavid du ColombierThis extension allows inclusion of
381219b2ee8SDavid du Colombier.CW <regexp.h> ,
3823e12c5d1SDavid du Colombierwhich defines the regular expression matching functions described
3833e12c5d1SDavid du Colombierin the Plan 9 manual page
384219b2ee8SDavid du Colombier.I regexp (2).
3853e12c5d1SDavid du Colombier.XX
3863e12c5d1SDavid du Colombier.CW _RESEARCH_SOURCE .
3873e12c5d1SDavid du ColombierThis extension enables a small library of functions from the Tenth Edition Unix
3883e12c5d1SDavid du ColombierResearch System (V10).
3893e12c5d1SDavid du ColombierThese functions and the types needed to use them are all defined in the
3903e12c5d1SDavid du Colombier.CW <libv.h>
391219b2ee8SDavid du Colombierheader.
3923e12c5d1SDavid du ColombierThe provided functions are:
3933e12c5d1SDavid du Colombier.CW srand ,
3943e12c5d1SDavid du Colombier.CW rand ,
3953e12c5d1SDavid du Colombier.CW nrand ,
3963e12c5d1SDavid du Colombier.CW lrand ,
3973e12c5d1SDavid du Colombierand
3983e12c5d1SDavid du Colombier.CW frand
3993e12c5d1SDavid du Colombier(better random number generators);
4003e12c5d1SDavid du Colombier.CW getpass ,
4013e12c5d1SDavid du Colombier.CW tty_echoon ,
4023e12c5d1SDavid du Colombier.CW tty_echooff
4033e12c5d1SDavid du Colombier(for dealing with the common needs for mucking with terminal
4043e12c5d1SDavid du Colombiercharacteristics);
4053e12c5d1SDavid du Colombier.CW min
4063e12c5d1SDavid du Colombierand
4073e12c5d1SDavid du Colombier.CW max ;
4083e12c5d1SDavid du Colombier.CW nap ;
409219b2ee8SDavid du Colombierand
4103e12c5d1SDavid du Colombier.CW setfields ,
4113e12c5d1SDavid du Colombier.CW getfields ,
4123e12c5d1SDavid du Colombierand
4133e12c5d1SDavid du Colombier.CW getmfields
414219b2ee8SDavid du Colombier(for parsing a line into fields).
415219b2ee8SDavid du ColombierSee the Research Unix System Programmer's Manual, Tenth Edition, for a description
4163e12c5d1SDavid du Colombierof these functions.
41725fc6993SDavid du Colombier.XX
41825fc6993SDavid du Colombier.CW _C99_SNPRINTF_EXTENSION .
41925fc6993SDavid du ColombierThis extension permits the use of the return values of
42025fc6993SDavid du Colombier.I snprintf
42125fc6993SDavid du Colombierand
42225fc6993SDavid du Colombier.I vsnprintf .
42325fc6993SDavid du ColombierBefore C99, the 1999 C standard,
42425fc6993SDavid du Colombierthese functions usually returned the number of bytes,
42525fc6993SDavid du Colombierexcluding terminating NUL,
42625fc6993SDavid du Colombieractually stored in the target string.
42725fc6993SDavid du Colombier(GNU, as usual, had to be different and returned -1 if the target
42825fc6993SDavid du Colombierstring was too small.)
42925fc6993SDavid du ColombierC99 requires them to instead return the number of bytes,
43025fc6993SDavid du Colombierexcluding terminating NUL,
431*0ceffd3cSDavid du Colombierthat would have been written into the target string if it were infinitely large
432*0ceffd3cSDavid du Colombieror a negative value if an `encoding error' occurs,
43325fc6993SDavid du Colombierso old programs compiled under C99 rules will be prone to overrunning
43425fc6993SDavid du Colombiertheir buffers.
43525fc6993SDavid du ColombierThis extension is a way for the programmer to declare that he or she understands
43625fc6993SDavid du Colombierthe situation and has adjusted the code being compiled to compensate.
4373e12c5d1SDavid du Colombier.SH
4383e12c5d1SDavid du ColombierCommon Problems
4393e12c5d1SDavid du Colombier.PP
4403e12c5d1SDavid du ColombierSome large systems, including X11, have been ported successfully
441219b2ee8SDavid du Colombierto Plan 9 using APE
442219b2ee8SDavid du Colombier(the X11 port is not included in the distribution, however,
443219b2ee8SDavid du Colombierbecause supporting it properly is too big a job).
4443e12c5d1SDavid du ColombierThe problems encountered fall into three categories:
4453e12c5d1SDavid du Colombier(1) non-ANSI C/POSIX features used; (2) inadequate simulation of POSIX functions;
4463e12c5d1SDavid du Colombierand (3) compiler/loader bugs.
4473e12c5d1SDavid du ColombierBy far the majority of problems are in the first category.
4483e12c5d1SDavid du Colombier.PP
4493e12c5d1SDavid du ColombierPOSIX is just starting to be a target for programmers.
4503e12c5d1SDavid du ColombierMost existing code is written to work with one or both of a BSD or a System V Unix.
4513e12c5d1SDavid du ColombierSystem V is fairly close to POSIX, but there are some differences.
4523e12c5d1SDavid du ColombierAlso, many System V systems have imported some BSD features that are
4533e12c5d1SDavid du Colombiernot part of POSIX.
454219b2ee8SDavid du ColombierA good strategy for porting external programs is to first try using
455219b2ee8SDavid du Colombier.CW CFLAGS=-D_POSIX_SOURCE ;
456219b2ee8SDavid du Colombierif that doesn't work, try adding
457219b2ee8SDavid du Colombier.CW _D_BSD_EXTENSION
458219b2ee8SDavid du Colombierand perhaps include
459219b2ee8SDavid du Colombier.CW <bsd.h>
460219b2ee8SDavid du Colombierin source files.
461219b2ee8SDavid du ColombierHere are some solutions to problems that might remain:
4623e12c5d1SDavid du Colombier.XX
4633e12c5d1SDavid du ColombierThird (environment) argument to
4643e12c5d1SDavid du Colombier.CW main .
4653e12c5d1SDavid du ColombierUse the
4663e12c5d1SDavid du Colombier.CW environ
4673e12c5d1SDavid du Colombierglobal instead.
4683e12c5d1SDavid du Colombier.XX
4693e12c5d1SDavid du Colombier.CW OPEN_MAX ,
4703e12c5d1SDavid du Colombier.CW PATH_MAX ,
4713e12c5d1SDavid du Colombieretc., assumed in
4723e12c5d1SDavid du Colombier.CW <limits.h> .
4733e12c5d1SDavid du ColombierRewrite to call
4743e12c5d1SDavid du Colombier.CW sysconf
4753e12c5d1SDavid du Colombieror define
4763e12c5d1SDavid du Colombier.CW _LIMITS_EXTENSION .
4773e12c5d1SDavid du Colombier.XX
4783e12c5d1SDavid du Colombier.CW <varargs.h> .
4793e12c5d1SDavid du ColombierRewrite to use
4803e12c5d1SDavid du Colombier.CW <stdarg.h> .
4813e12c5d1SDavid du Colombier.PP
4823e12c5d1SDavid du ColombierThe second class of problems has to do with inadequacies in the Plan 9
4833e12c5d1SDavid du Colombiersimulation of POSIX functions.
484219b2ee8SDavid du ColombierThese shortcomings have rarely gotten in the way
485219b2ee8SDavid du Colombier(except, perhaps, for the
4863e12c5d1SDavid du Colombier.CW link
4873e12c5d1SDavid du Colombierproblem).
4883e12c5d1SDavid du Colombier.XX
4893e12c5d1SDavid du ColombierFunctions for setting the userid, groupid, effective userid and effective groupid
4903e12c5d1SDavid du Colombierdo not do anything useful.  The concept is impossible to simulate in Plan 9.
4913e12c5d1SDavid du Colombier.CW Chown
4923e12c5d1SDavid du Colombieralso does nothing.
4933e12c5d1SDavid du Colombier.XX
4943e12c5d1SDavid du Colombier.CW execlp
4953e12c5d1SDavid du Colombierand the related functions do not look at the
4963e12c5d1SDavid du Colombier.CW PATH
4973e12c5d1SDavid du Colombierenvironment variable.  They just try the current directory and
4983e12c5d1SDavid du Colombier.CW /bin
4993e12c5d1SDavid du Colombierif the pathname is not absolute.
5003e12c5d1SDavid du Colombier.XX
5013e12c5d1SDavid du ColombierAdvisory locking via
5023e12c5d1SDavid du Colombier.CW fcntl
5033e12c5d1SDavid du Colombieris not implemented.
5043e12c5d1SDavid du Colombier.XX
5053e12c5d1SDavid du Colombier.CW isatty
5063e12c5d1SDavid du Colombieris hard to do correctly.
507219b2ee8SDavid du ColombierThe approximation used is only sometimes correct.
5083e12c5d1SDavid du Colombier.XX
5093e12c5d1SDavid du Colombier.CW link
5103e12c5d1SDavid du Colombieralways fails.
5113e12c5d1SDavid du Colombier.XX
5123e12c5d1SDavid du ColombierWith
5133e12c5d1SDavid du Colombier.CW open ,
5143e12c5d1SDavid du Colombierthe
5153e12c5d1SDavid du Colombier.CW O_NOCTTY
5163e12c5d1SDavid du Colombieroption has no effect.
517219b2ee8SDavid du ColombierThe concept of a controlling tty is foreign to Plan 9.
5183e12c5d1SDavid du Colombier.XX
5193e12c5d1SDavid du Colombier.CW setsid
520219b2ee8SDavid du Colombierforks the name space and note group,
5213e12c5d1SDavid du Colombierwhich is only approximately the right behavior.
5223e12c5d1SDavid du Colombier.XX
5233e12c5d1SDavid du ColombierThe functions dealing with stacking signals,
5243e12c5d1SDavid du Colombier.CW sigpending ,
5253e12c5d1SDavid du Colombier.CW sigprocmask
5263e12c5d1SDavid du Colombierand
5273e12c5d1SDavid du Colombier.CW sigsuspend ,
5283e12c5d1SDavid du Colombierdo not work.
5293e12c5d1SDavid du Colombier.XX
5303e12c5d1SDavid du Colombier.CW umask
5313e12c5d1SDavid du Colombierhas no effect, as there is no such concept in Plan 9.
5323e12c5d1SDavid du Colombier.XX
533219b2ee8SDavid du Colombiercode that does
534219b2ee8SDavid du Colombier.CW getenv("HOME")
535219b2ee8SDavid du Colombiershould be changed to
536219b2ee8SDavid du Colombier.CW getenv("home")
537219b2ee8SDavid du Colombieron Plan 9.
538