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