tlibc.h - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tlibc.h (24968B)
       ---
            1 // This file originated as Plan 9's /sys/include/libc.h.
            2 // The plan9port-specific changes may be distributed
            3 // using the license in ../src/lib9/LICENSE.
            4 
            5 /*
            6  * Lib9 is miscellany from the Plan 9 C library that doesn't
            7  * fit into libutf or into libfmt, but is still missing from traditional
            8  * Unix C libraries.
            9  */
           10 #ifndef _LIBC_H_
           11 #define _LIBC_H_ 1
           12 #if defined(__cplusplus)
           13 extern "C" {
           14 #endif
           15 
           16 #include <utf.h>
           17 #include <fmt.h>
           18 
           19 /*
           20  * Begin usual libc.h
           21  */
           22 
           23 #ifndef nil
           24 #define        nil        ((void*)0)
           25 #endif
           26 #define        nelem(x)        (sizeof(x)/sizeof((x)[0]))
           27 
           28 #ifndef offsetof
           29 #define offsetof(s, m)        (ulong)(&(((s*)0)->m))
           30 #endif
           31 
           32 /*
           33  * mem routines (provided by system <string.h>)
           34  *
           35 extern        void*        memccpy(void*, void*, int, ulong);
           36 extern        void*        memset(void*, int, ulong);
           37 extern        int        memcmp(void*, void*, ulong);
           38 extern        void*        memcpy(void*, void*, ulong);
           39 extern        void*        memmove(void*, void*, ulong);
           40 extern        void*        memchr(void*, int, ulong);
           41  */
           42 
           43 /*
           44  * string routines (provided by system <string.h>)
           45  *
           46 extern        char*        strcat(char*, char*);
           47 extern        char*        strchr(char*, int);
           48 extern        int        strcmp(char*, char*);
           49 extern        char*        strcpy(char*, char*);
           50  */
           51 extern        char*        strecpy(char*, char*, char*);
           52 extern        char*        p9strdup(char*);
           53 /*
           54 extern        char*        strncat(char*, char*, long);
           55 extern        char*        strncpy(char*, char*, long);
           56 extern        int        strncmp(char*, char*, long);
           57 extern        char*        strpbrk(char*, char*);
           58 extern        char*        strrchr(char*, int);
           59 extern        char*        strtok(char*, char*);
           60 extern        long        strlen(char*);
           61 extern        long        strspn(char*, char*);
           62 extern        long        strcspn(char*, char*);
           63 extern        char*        strstr(char*, char*);
           64  */
           65 extern        int        cistrncmp(char*, char*, int);
           66 extern        int        cistrcmp(char*, char*);
           67 extern        char*        cistrstr(char*, char*);
           68 extern        int        tokenize(char*, char**, int);
           69 
           70 /*
           71 enum
           72 {
           73         UTFmax                = 4,
           74         Runesync        = 0x80,
           75         Runeself        = 0x80,
           76         Runeerror        = 0xFFFD,
           77         Runemax        = 0x10FFFF,
           78 };
           79 */
           80 
           81 /*
           82  * rune routines (provided by <utf.h>
           83  *
           84 extern        int        runetochar(char*, Rune*);
           85 extern        int        chartorune(Rune*, char*);
           86 extern        int        runelen(long);
           87 extern        int        runenlen(Rune*, int);
           88 extern        int        fullrune(char*, int);
           89 extern        int        utflen(char*);
           90 extern        int        utfnlen(char*, long);
           91 extern        char*        utfrune(char*, long);
           92 extern        char*        utfrrune(char*, long);
           93 extern        char*        utfutf(char*, char*);
           94 extern        char*        utfecpy(char*, char*, char*);
           95 
           96 extern        Rune*        runestrcat(Rune*, Rune*);
           97 extern        Rune*        runestrchr(Rune*, Rune);
           98 extern        int        runestrcmp(Rune*, Rune*);
           99 extern        Rune*        runestrcpy(Rune*, Rune*);
          100 extern        Rune*        runestrncpy(Rune*, Rune*, long);
          101 extern        Rune*        runestrecpy(Rune*, Rune*, Rune*);
          102 extern        Rune*        runestrdup(Rune*);
          103 extern        Rune*        runestrncat(Rune*, Rune*, long);
          104 extern        int        runestrncmp(Rune*, Rune*, long);
          105 extern        Rune*        runestrrchr(Rune*, Rune);
          106 extern        long        runestrlen(Rune*);
          107 extern        Rune*        runestrstr(Rune*, Rune*);
          108 
          109 extern        Rune        tolowerrune(Rune);
          110 extern        Rune        totitlerune(Rune);
          111 extern        Rune        toupperrune(Rune);
          112 extern        int        isalpharune(Rune);
          113 extern        int        islowerrune(Rune);
          114 extern        int        isspacerune(Rune);
          115 extern        int        istitlerune(Rune);
          116 extern        int        isupperrune(Rune);
          117  */
          118 
          119 /*
          120  * malloc (provied by system <stdlib.h>)
          121  *
          122 extern        void*        malloc(ulong);
          123  */
          124 extern        void*        p9malloc(ulong);
          125 extern        void*        mallocz(ulong, int);
          126 extern        void        p9free(void*);
          127 extern        void*        p9calloc(ulong, ulong);
          128 extern        void*        p9realloc(void*, ulong);
          129 extern        void                setmalloctag(void*, ulong);
          130 extern        void                setrealloctag(void*, ulong);
          131 extern        ulong        getmalloctag(void*);
          132 extern        ulong        getrealloctag(void*);
          133 /*
          134 extern        void*        malloctopoolblock(void*);
          135 */
          136 #ifndef NOPLAN9DEFINES
          137 #define        malloc        p9malloc
          138 #define        realloc        p9realloc
          139 #define        calloc        p9calloc
          140 #define        free        p9free
          141 #undef strdup
          142 #define        strdup        p9strdup
          143 #endif
          144 
          145 /*
          146  * print routines (provided by <fmt.h>)
          147  *
          148 typedef struct Fmt        Fmt;
          149 struct Fmt{
          150         uchar        runes;
          151         void        *start;
          152         void        *to;
          153         void        *stop;
          154         int        (*flush)(Fmt *);
          155         void        *farg;
          156         int        nfmt;
          157         va_list        args;
          158         int        r;
          159         int        width;
          160         int        prec;
          161         ulong        flags;
          162 };
          163 
          164 enum{
          165         FmtWidth        = 1,
          166         FmtLeft                = FmtWidth << 1,
          167         FmtPrec                = FmtLeft << 1,
          168         FmtSharp        = FmtPrec << 1,
          169         FmtSpace        = FmtSharp << 1,
          170         FmtSign                = FmtSpace << 1,
          171         FmtZero                = FmtSign << 1,
          172         FmtUnsigned        = FmtZero << 1,
          173         FmtShort        = FmtUnsigned << 1,
          174         FmtLong                = FmtShort << 1,
          175         FmtVLong        = FmtLong << 1,
          176         FmtComma        = FmtVLong << 1,
          177         FmtByte        = FmtComma << 1,
          178 
          179         FmtFlag                = FmtByte << 1
          180 };
          181 
          182 extern        int        print(char*, ...);
          183 extern        char*        seprint(char*, char*, char*, ...);
          184 extern        char*        vseprint(char*, char*, char*, va_list);
          185 extern        int        snprint(char*, int, char*, ...);
          186 extern        int        vsnprint(char*, int, char*, va_list);
          187 extern        char*        smprint(char*, ...);
          188 extern        char*        vsmprint(char*, va_list);
          189 extern        int        sprint(char*, char*, ...);
          190 extern        int        fprint(int, char*, ...);
          191 extern        int        vfprint(int, char*, va_list);
          192 
          193 extern        int        runesprint(Rune*, char*, ...);
          194 extern        int        runesnprint(Rune*, int, char*, ...);
          195 extern        int        runevsnprint(Rune*, int, char*, va_list);
          196 extern        Rune*        runeseprint(Rune*, Rune*, char*, ...);
          197 extern        Rune*        runevseprint(Rune*, Rune*, char*, va_list);
          198 extern        Rune*        runesmprint(char*, ...);
          199 extern        Rune*        runevsmprint(char*, va_list);
          200 
          201 extern        int        fmtfdinit(Fmt*, int, char*, int);
          202 extern        int        fmtfdflush(Fmt*);
          203 extern        int        fmtstrinit(Fmt*);
          204 extern        char*        fmtstrflush(Fmt*);
          205 extern        int        runefmtstrinit(Fmt*);
          206 extern        Rune*        runefmtstrflush(Fmt*);
          207 
          208 extern        int        fmtinstall(int, int (*)(Fmt*));
          209 extern        int        dofmt(Fmt*, char*);
          210 extern        int        dorfmt(Fmt*, Rune*);
          211 extern        int        fmtprint(Fmt*, char*, ...);
          212 extern        int        fmtvprint(Fmt*, char*, va_list);
          213 extern        int        fmtrune(Fmt*, int);
          214 extern        int        fmtstrcpy(Fmt*, char*);
          215 extern        int        fmtrunestrcpy(Fmt*, Rune*);
          216  */
          217 
          218 /*
          219  * error string for %r
          220  * supplied on per os basis, not part of fmt library
          221  *
          222  * (provided by lib9, but declared in fmt.h)
          223  *
          224 extern        int        errfmt(Fmt *f);
          225  */
          226 
          227 /*
          228  * quoted strings
          229  */
          230 extern        char        *unquotestrdup(char*);
          231 extern        Rune        *unquoterunestrdup(Rune*);
          232 extern        char        *quotestrdup(char*);
          233 extern        Rune        *quoterunestrdup(Rune*);
          234 /*
          235  * in fmt.h
          236  *
          237 extern        void        quotefmtinstall(void);
          238 extern        int        quotestrfmt(Fmt*);
          239 extern        int        quoterunestrfmt(Fmt*);
          240  */
          241 #ifndef NOPLAN9DEFINES
          242 #define doquote fmtdoquote
          243 #endif
          244 extern        int        needsrcquote(int);
          245 
          246 /*
          247  * random number
          248  */
          249 extern        void        p9srand(long);
          250 extern        int        p9rand(void);
          251 
          252 extern        int        p9nrand(int);
          253 extern        long        p9lrand(void);
          254 extern        long        p9lnrand(long);
          255 extern        double        p9frand(void);
          256 extern        ulong        truerand(void);                        /* uses /dev/random */
          257 extern        ulong        ntruerand(ulong);                /* uses /dev/random */
          258 
          259 #ifndef NOPLAN9DEFINES
          260 #define        srand        p9srand
          261 #define        rand        p9rand
          262 #define        nrand        p9nrand
          263 #define        lrand        p9lrand
          264 #define        lnrand        p9lnrand
          265 #define        frand        p9frand
          266 #endif
          267 
          268 /*
          269  * math
          270  */
          271 extern        ulong        getfcr(void);
          272 extern        void        setfsr(ulong);
          273 extern        ulong        getfsr(void);
          274 extern        void        setfcr(ulong);
          275 extern        double        NaN(void);
          276 extern        double        Inf(int);
          277 extern        int        isNaN(double);
          278 extern        int        isInf(double, int);
          279 extern        ulong        umuldiv(ulong, ulong, ulong);
          280 extern        long        muldiv(long, long, long);
          281 
          282 /*
          283  * provided by math.h
          284  *
          285 extern        double        pow(double, double);
          286 extern        double        atan2(double, double);
          287 extern        double        fabs(double);
          288 extern        double        atan(double);
          289 extern        double        log(double);
          290 extern        double        log10(double);
          291 extern        double        exp(double);
          292 extern        double        floor(double);
          293 extern        double        ceil(double);
          294 extern        double        hypot(double, double);
          295 extern        double        sin(double);
          296 extern        double        cos(double);
          297 extern        double        tan(double);
          298 extern        double        asin(double);
          299 extern        double        acos(double);
          300 extern        double        sinh(double);
          301 extern        double        cosh(double);
          302 extern        double        tanh(double);
          303 extern        double        sqrt(double);
          304 extern        double        fmod(double, double);
          305 #define        HUGE        3.4028234e38
          306 #define        PIO2        1.570796326794896619231e0
          307 #define        PI        (PIO2+PIO2)
          308  */
          309 #define PI        M_PI
          310 #define        PIO2        M_PI_2
          311 
          312 /*
          313  * Time-of-day
          314  */
          315 
          316 typedef
          317 struct Tm
          318 {
          319         int        sec;
          320         int        min;
          321         int        hour;
          322         int        mday;
          323         int        mon;
          324         int        year;
          325         int        wday;
          326         int        yday;
          327         char        zone[4];
          328         int        tzoff;
          329 } Tm;
          330 
          331 extern        Tm*        p9gmtime(long);
          332 extern        Tm*        p9localtime(long);
          333 extern        char*        p9asctime(Tm*);
          334 extern        char*        p9ctime(long);
          335 extern        double        p9cputime(void);
          336 extern        long        p9times(long*);
          337 extern        long        p9tm2sec(Tm*);
          338 extern        vlong        p9nsec(void);
          339 
          340 #ifndef NOPLAN9DEFINES
          341 #define        gmtime                p9gmtime
          342 #define        localtime        p9localtime
          343 #define        asctime                p9asctime
          344 #define        ctime                p9ctime
          345 #define        cputime                p9cputime
          346 #define        times                p9times
          347 #define        tm2sec                p9tm2sec
          348 #define        nsec                p9nsec
          349 #endif
          350 
          351 /*
          352  * one-of-a-kind
          353  */
          354 enum
          355 {
          356         PNPROC                = 1,
          357         PNGROUP                = 2
          358 };
          359 
          360 /* extern        int        abs(int); <stdlib.h> */
          361 extern        int        p9atexit(void(*)(void));
          362 extern        void        p9atexitdont(void(*)(void));
          363 extern        int        atnotify(int(*)(void*, char*), int);
          364 /*
          365  * <stdlib.h>
          366 extern        double        atof(char*); <stdlib.h>
          367  */
          368 extern        int        p9atoi(char*);
          369 extern        long        p9atol(char*);
          370 extern        vlong        p9atoll(char*);
          371 extern        double        fmtcharstod(int(*)(void*), void*);
          372 extern        char*        cleanname(char*);
          373 extern        int        p9decrypt(void*, void*, int);
          374 extern        int        p9encrypt(void*, void*, int);
          375 extern        int        netcrypt(void*, void*);
          376 extern        int        dec64(uchar*, int, char*, int);
          377 extern        int        enc64(char*, int, uchar*, int);
          378 extern        int        dec32(uchar*, int, char*, int);
          379 extern        int        enc32(char*, int, uchar*, int);
          380 extern        int        dec16(uchar*, int, char*, int);
          381 extern        int        enc16(char*, int, uchar*, int);
          382 extern        int        encodefmt(Fmt*);
          383 extern        int        dirmodefmt(Fmt*);
          384 extern        int        exitcode(char*);
          385 extern        void        exits(char*);
          386 extern        double        p9frexp(double, int*);
          387 extern        ulong        getcallerpc(void*);
          388 #if defined(__GNUC__) || defined(__clang__) || defined(__IBMC__)
          389 #define getcallerpc(x) ((ulong)__builtin_return_address(0))
          390 #endif
          391 extern        char*        p9getenv(char*);
          392 extern        int        p9putenv(char*, char*);
          393 extern        int        getfields(char*, char**, int, int, char*);
          394 extern        int        gettokens(char *, char **, int, char *);
          395 extern        char*        getuser(void);
          396 extern        char*        p9getwd(char*, int);
          397 extern        int        iounit(int);
          398 /* extern        long        labs(long); <math.h> */
          399 /* extern        double        ldexp(double, int); <math.h> */
          400 extern        void        p9longjmp(p9jmp_buf, int);
          401 extern        char*        mktemp(char*);
          402 extern        int                opentemp(char*, int);
          403 /* extern        double        modf(double, double*); <math.h> */
          404 extern        void        p9notejmp(void*, p9jmp_buf, int);
          405 extern        void        perror(const char*);
          406 extern        int        postnote(int, int, char *);
          407 extern        double        p9pow10(int);
          408 /* extern        int        putenv(char*, char*); <stdlib.h. */
          409 /* extern        void        qsort(void*, long, long, int (*)(void*, void*)); <stdlib.h> */
          410 extern        char*        searchpath(char*);
          411 /* extern        int        p9setjmp(p9jmp_buf); */
          412 #define p9setjmp(b)        sigsetjmp((void*)(b), 1)
          413 /*
          414  * <stdlib.h>
          415 extern        long        strtol(char*, char**, int);
          416 extern        ulong        strtoul(char*, char**, int);
          417 extern        vlong        strtoll(char*, char**, int);
          418 extern        uvlong        strtoull(char*, char**, int);
          419  */
          420 extern        void        sysfatal(char*, ...);
          421 extern        void        p9syslog(int, char*, char*, ...);
          422 extern        long        p9time(long*);
          423 /* extern        int        tolower(int); <ctype.h> */
          424 /* extern        int        toupper(int); <ctype.h> */
          425 extern        void        needstack(int);
          426 extern        char*        readcons(char*, char*, int);
          427 
          428 extern        void        (*_pin)(void);
          429 extern        void        (*_unpin)(void);
          430 
          431 #ifndef NOPLAN9DEFINES
          432 #define atexit                p9atexit
          433 #define atexitdont        p9atexitdont
          434 #define atoi                p9atoi
          435 #define atol                p9atol
          436 #define atoll                p9atoll
          437 #define encrypt                p9encrypt
          438 #define decrypt                p9decrypt
          439 #undef frexp
          440 #define frexp                p9frexp
          441 #define getenv                p9getenv
          442 #define        getwd                p9getwd
          443 #define        longjmp                p9longjmp
          444 #undef  setjmp
          445 #define setjmp                p9setjmp
          446 #define putenv                p9putenv
          447 #define notejmp                p9notejmp
          448 #define jmp_buf                p9jmp_buf
          449 #define time                p9time
          450 #define pow10                p9pow10
          451 #define strtod                fmtstrtod
          452 #define charstod        fmtcharstod
          453 #define syslog                p9syslog
          454 #endif
          455 
          456 /*
          457  *  just enough information so that libc can be
          458  *  properly locked without dragging in all of libthread
          459  */
          460 typedef struct _Thread _Thread;
          461 typedef struct _Threadlist _Threadlist;
          462 struct _Threadlist
          463 {
          464         _Thread        *head;
          465         _Thread        *tail;
          466 };
          467 
          468 extern        _Thread        *(*threadnow)(void);
          469 
          470 /*
          471  *  synchronization
          472  */
          473 typedef struct Lock Lock;
          474 struct Lock
          475 {
          476         int init;
          477         pthread_mutex_t mutex;
          478         int held;
          479 };
          480 
          481 extern        void        lock(Lock*);
          482 extern        void        unlock(Lock*);
          483 extern        int        canlock(Lock*);
          484 extern        int        (*_lock)(Lock*, int, ulong);
          485 extern        void        (*_unlock)(Lock*, ulong);
          486 
          487 typedef struct QLock QLock;
          488 struct QLock
          489 {
          490         Lock                l;
          491         _Thread        *owner;
          492         _Threadlist        waiting;
          493 };
          494 
          495 extern        void        qlock(QLock*);
          496 extern        void        qunlock(QLock*);
          497 extern        int        canqlock(QLock*);
          498 extern        int        (*_qlock)(QLock*, int, ulong);        /* do not use */
          499 extern        void        (*_qunlock)(QLock*, ulong);
          500 
          501 typedef struct Rendez Rendez;
          502 struct Rendez
          503 {
          504         QLock        *l;
          505         _Threadlist        waiting;
          506 };
          507 
          508 extern        void        rsleep(Rendez*);        /* unlocks r->l, sleeps, locks r->l again */
          509 extern        int        rwakeup(Rendez*);
          510 extern        int        rwakeupall(Rendez*);
          511 extern        void        (*_rsleep)(Rendez*, ulong);        /* do not use */
          512 extern        int        (*_rwakeup)(Rendez*, int, ulong);
          513 
          514 typedef struct RWLock RWLock;
          515 struct RWLock
          516 {
          517         Lock                l;
          518         int        readers;
          519         _Thread        *writer;
          520         _Threadlist        rwaiting;
          521         _Threadlist        wwaiting;
          522 };
          523 
          524 extern        void        rlock(RWLock*);
          525 extern        void        runlock(RWLock*);
          526 extern        int                canrlock(RWLock*);
          527 extern        void        wlock(RWLock*);
          528 extern        void        wunlock(RWLock*);
          529 extern        int                canwlock(RWLock*);
          530 extern        int        (*_rlock)(RWLock*, int, ulong);        /* do not use */
          531 extern        int        (*_wlock)(RWLock*, int, ulong);
          532 extern        void        (*_runlock)(RWLock*, ulong);
          533 extern        void        (*_wunlock)(RWLock*, ulong);
          534 
          535 /*
          536  * per-process private data
          537  */
          538 extern        void**        privalloc(void);
          539 extern        void        privfree(void**);
          540 
          541 /*
          542  *  network dialing
          543  */
          544 #define NETPATHLEN 40
          545 extern        int        p9accept(int, char*);
          546 extern        int        p9announce(char*, char*);
          547 extern        int        p9dial(char*, char*, char*, int*);
          548 extern        int        p9dialparse(char *ds, char **net, char **unixa, void *ip, int *port);
          549 extern        void        p9setnetmtpt(char*, int, char*);
          550 extern        int        p9listen(char*, char*);
          551 extern        char*        p9netmkaddr(char*, char*, char*);
          552 extern        int        p9reject(int, char*, char*);
          553 
          554 #ifndef NOPLAN9DEFINES
          555 #define        accept                p9accept
          556 #define        announce        p9announce
          557 #define        dial                p9dial
          558 #define        setnetmtpt        p9setnetmtpt
          559 #define        listen                p9listen
          560 #define        netmkaddr        p9netmkaddr
          561 #define        reject                p9reject
          562 #endif
          563 
          564 /*
          565  *  encryption
          566  */
          567 extern        int        pushssl(int, char*, char*, char*, int*);
          568 extern        int        pushtls(int, char*, char*, int, char*, char*);
          569 
          570 /*
          571  *  network services
          572  */
          573 typedef struct NetConnInfo NetConnInfo;
          574 struct NetConnInfo
          575 {
          576         char        *dir;                /* connection directory */
          577         char        *root;                /* network root */
          578         char        *spec;                /* binding spec */
          579         char        *lsys;                /* local system */
          580         char        *lserv;                /* local service */
          581         char        *rsys;                /* remote system */
          582         char        *rserv;                /* remote service */
          583         char *laddr;
          584         char *raddr;
          585 };
          586 extern        NetConnInfo*        getnetconninfo(char*, int);
          587 extern        void                freenetconninfo(NetConnInfo*);
          588 
          589 /*
          590  * system calls
          591  *
          592  */
          593 #define        STATMAX        65535U        /* max length of machine-independent stat structure */
          594 #define        DIRMAX        (sizeof(Dir)+STATMAX)        /* max length of Dir structure */
          595 #define        ERRMAX        128        /* max length of error string */
          596 
          597 #define        MORDER        0x0003        /* mask for bits defining order of mounting */
          598 #define        MREPL        0x0000        /* mount replaces object */
          599 #define        MBEFORE        0x0001        /* mount goes before others in union directory */
          600 #define        MAFTER        0x0002        /* mount goes after others in union directory */
          601 #define        MCREATE        0x0004        /* permit creation in mounted directory */
          602 #define        MCACHE        0x0010        /* cache some data */
          603 #define        MMASK        0x0017        /* all bits on */
          604 
          605 #define        OREAD        0        /* open for read */
          606 #define        OWRITE        1        /* write */
          607 #define        ORDWR        2        /* read and write */
          608 #define        OEXEC        3        /* execute, == read but check execute permission */
          609 #define        OTRUNC        16        /* or'ed in (except for exec), truncate file first */
          610 #define        OCEXEC        32        /* or'ed in, close on exec */
          611 #define        ORCLOSE        64        /* or'ed in, remove on close */
          612 #define        ODIRECT        128        /* or'ed in, direct access */
          613 #define        ONONBLOCK 256        /* or'ed in, non-blocking call */
          614 #define        OEXCL        0x1000        /* or'ed in, exclusive use (create only) */
          615 #define        OLOCK        0x2000        /* or'ed in, lock after opening */
          616 #define        OAPPEND        0x4000        /* or'ed in, append only */
          617 
          618 #define        AEXIST        0        /* accessible: exists */
          619 #define        AEXEC        1        /* execute access */
          620 #define        AWRITE        2        /* write access */
          621 #define        AREAD        4        /* read access */
          622 
          623 /* Segattch */
          624 #define        SG_RONLY        0040        /* read only */
          625 #define        SG_CEXEC        0100        /* detach on exec */
          626 
          627 #define        NCONT        0        /* continue after note */
          628 #define        NDFLT        1        /* terminate after note */
          629 #define        NSAVE        2        /* clear note but hold state */
          630 #define        NRSTR        3        /* restore saved state */
          631 
          632 /* bits in Qid.type */
          633 #define QTDIR                0x80                /* type bit for directories */
          634 #define QTAPPEND        0x40                /* type bit for append only files */
          635 #define QTEXCL                0x20                /* type bit for exclusive use files */
          636 #define QTMOUNT                0x10                /* type bit for mounted channel */
          637 #define QTAUTH                0x08                /* type bit for authentication file */
          638 #define QTTMP                0x04                /* type bit for non-backed-up file */
          639 #define QTSYMLINK        0x02                /* type bit for symbolic link */
          640 #define QTFILE                0x00                /* type bits for plain file */
          641 
          642 /* bits in Dir.mode */
          643 #define DMDIR                0x80000000        /* mode bit for directories */
          644 #define DMAPPEND        0x40000000        /* mode bit for append only files */
          645 #define DMEXCL                0x20000000        /* mode bit for exclusive use files */
          646 #define DMMOUNT                0x10000000        /* mode bit for mounted channel */
          647 #define DMAUTH                0x08000000        /* mode bit for authentication file */
          648 #define DMTMP                0x04000000        /* mode bit for non-backed-up file */
          649 #define DMSYMLINK        0x02000000        /* mode bit for symbolic link (Unix, 9P2000.u) */
          650 #define DMDEVICE        0x00800000        /* mode bit for device file (Unix, 9P2000.u) */
          651 #define DMNAMEDPIPE        0x00200000        /* mode bit for named pipe (Unix, 9P2000.u) */
          652 #define DMSOCKET        0x00100000        /* mode bit for socket (Unix, 9P2000.u) */
          653 #define DMSETUID        0x00080000        /* mode bit for setuid (Unix, 9P2000.u) */
          654 #define DMSETGID        0x00040000        /* mode bit for setgid (Unix, 9P2000.u) */
          655 
          656 #define DMREAD                0x4                /* mode bit for read permission */
          657 #define DMWRITE                0x2                /* mode bit for write permission */
          658 #define DMEXEC                0x1                /* mode bit for execute permission */
          659 
          660 #ifdef RFMEM        /* FreeBSD, OpenBSD */
          661 #undef RFFDG
          662 #undef RFNOTEG
          663 #undef RFPROC
          664 #undef RFMEM
          665 #undef RFNOWAIT
          666 #undef RFCFDG
          667 #undef RFNAMEG
          668 #undef RFENVG
          669 #undef RFCENVG
          670 #undef RFCFDG
          671 #undef RFCNAMEG
          672 #endif
          673 
          674 enum
          675 {
          676         RFNAMEG                = (1<<0),
          677         RFENVG                = (1<<1),
          678         RFFDG                = (1<<2),
          679         RFNOTEG                = (1<<3),
          680         RFPROC                = (1<<4),
          681         RFMEM                = (1<<5),
          682         RFNOWAIT        = (1<<6),
          683         RFCNAMEG        = (1<<10),
          684         RFCENVG                = (1<<11),
          685         RFCFDG                = (1<<12)
          686 /*        RFREND                = (1<<13), */
          687 /*        RFNOMNT                = (1<<14) */
          688 };
          689 
          690 typedef
          691 struct Qid
          692 {
          693         uvlong        path;
          694         ulong        vers;
          695         uchar        type;
          696 } Qid;
          697 
          698 typedef
          699 struct Dir {
          700         /* system-modified data */
          701         ushort        type;        /* server type */
          702         uint        dev;        /* server subtype */
          703         /* file data */
          704         Qid        qid;        /* unique id from server */
          705         ulong        mode;        /* permissions */
          706         ulong        atime;        /* last read time */
          707         ulong        mtime;        /* last write time */
          708         vlong        length;        /* file length */
          709         char        *name;        /* last element of path */
          710         char        *uid;        /* owner name */
          711         char        *gid;        /* group name */
          712         char        *muid;        /* last modifier name */
          713 
          714         /* 9P2000.u extensions */
          715         uint        uidnum;                /* numeric uid */
          716         uint        gidnum;                /* numeric gid */
          717         uint        muidnum;        /* numeric muid */
          718         char        *ext;                /* extended info */
          719 } Dir;
          720 
          721 /* keep /sys/src/ape/lib/ap/plan9/sys9.h in sync with this -rsc */
          722 typedef
          723 struct Waitmsg
          724 {
          725         int pid;        /* of loved one */
          726         ulong time[3];        /* of loved one & descendants */
          727         char        *msg;
          728 } Waitmsg;
          729 
          730 typedef
          731 struct IOchunk
          732 {
          733         void        *addr;
          734         ulong        len;
          735 } IOchunk;
          736 
          737 extern        void        _exits(char*);
          738 
          739 extern        void        abort(void);
          740 /* extern        int        access(char*, int); */
          741 extern        long        p9alarm(ulong);
          742 extern        int        await(char*, int);
          743 extern        int        awaitfor(int, char*, int);
          744 extern        int        awaitnohang(char*, int);
          745 /* extern        int        bind(char*, char*, int); give up */
          746 /* extern        int        brk(void*); <unistd.h> */
          747 extern        int        p9chdir(char*);
          748 extern        int        p9close(int);
          749 extern        int        p9create(char*, int, ulong);
          750 extern        int        p9dup(int, int);
          751 extern        int        errstr(char*, uint);
          752 extern        int        p9exec(char*, char*[]);
          753 extern        int        p9execl(char*, ...);
          754 /* extern        int        p9fork(void); */
          755 extern        int        p9rfork(int);
          756 /* not implemented
          757 extern        int        fauth(int, char*);
          758 extern        int        fstat(int, uchar*, int);
          759 extern        int        fwstat(int, uchar*, int);
          760 extern        int        fversion(int, int, char*, int);
          761 extern        int        mount(int, int, char*, int, char*);
          762 extern        int        unmount(char*, char*);
          763 */
          764 extern        int        noted(int);
          765 extern        int        notify(void(*)(void*, char*));
          766 extern        int        noteenable(char*);
          767 extern        int        notedisable(char*);
          768 extern        int        notifyon(char*);
          769 extern        int        notifyoff(char*);
          770 extern        int        p9open(char*, int);
          771 extern        int        fd2path(int, char*, int);
          772 extern        int        p9pipe(int*);
          773 /*
          774  * use defs from <unistd.h>
          775 extern        long        pread(int, void*, long, vlong);
          776 extern        long        preadv(int, IOchunk*, int, vlong);
          777 extern        long        pwrite(int, void*, long, vlong);
          778 extern        long        pwritev(int, IOchunk*, int, vlong);
          779 extern        long        read(int, void*, long);
          780  */
          781 extern        long        readn(int, void*, long);
          782 /* extern        long        readv(int, IOchunk*, int); <unistd.h> */
          783 extern        int        remove(const char*);
          784 /* extern        void*        sbrk(ulong); <unistd.h> */
          785 /* extern        long        oseek(int, long, int); */
          786 extern        vlong        p9seek(int, vlong, int);
          787 /* give up
          788 extern        long        segattach(int, char*, void*, ulong);
          789 extern        int        segbrk(void*, void*);
          790 extern        int        segdetach(void*);
          791 extern        int        segflush(void*, ulong);
          792 extern        int        segfree(void*, ulong);
          793 */
          794 extern        int        p9sleep(long);
          795 /* extern        int        stat(char*, uchar*, int); give up */
          796 extern        Waitmsg*        p9wait(void);
          797 extern        Waitmsg*        p9waitfor(int);
          798 extern        Waitmsg*        waitnohang(void);
          799 extern        int        p9waitpid(void);
          800 /* <unistd.h>
          801 extern        long        write(int, void*, long);
          802 extern        long        writev(int, IOchunk*, int);
          803 */
          804 extern        long        p9write(int, void*, long);
          805 /* extern        int        wstat(char*, uchar*, int); give up */
          806 extern        ulong        rendezvous(ulong, ulong);
          807 
          808 #ifndef NOPLAN9DEFINES
          809 #define alarm                p9alarm
          810 #define        dup                p9dup
          811 #define        exec                p9exec
          812 #define        execl        p9execl
          813 #define        seek                p9seek
          814 #define sleep                p9sleep
          815 #define wait                p9wait
          816 #define waitpid                p9waitpid
          817 /* #define fork                p9fork */
          818 #define rfork                p9rfork
          819 /* #define access                p9access */
          820 #define create                p9create
          821 #undef open
          822 #define open                p9open
          823 #undef close
          824 #define close                p9close
          825 #define pipe                p9pipe
          826 #define        waitfor                p9waitfor
          827 #define write                p9write
          828 #endif
          829 
          830 extern        Dir*        dirstat(char*);
          831 extern        Dir*        dirfstat(int);
          832 extern        int        dirwstat(char*, Dir*);
          833 extern        int        dirfwstat(int, Dir*);
          834 extern        long        dirread(int, Dir**);
          835 extern        void        nulldir(Dir*);
          836 extern        long        dirreadall(int, Dir**);
          837 /* extern        int        getpid(void); <unistd.h> */
          838 /* extern        int        getppid(void); */
          839 extern        void        rerrstr(char*, uint);
          840 extern        char*        sysname(void);
          841 extern        void        werrstr(char*, ...);
          842 extern        char*        getns(void);
          843 extern        char*        get9root(void);
          844 extern        char*        unsharp(char*);
          845 extern        int        sendfd(int, int);
          846 extern        int        recvfd(int);
          847 extern        int        post9pservice(int, char*, char*);
          848 extern        int        chattyfuse;
          849 
          850 /* external names that we don't want to step on */
          851 #ifndef NOPLAN9DEFINES
          852 #define main        p9main
          853 #endif
          854 
          855 #ifdef VARARGCK
          856 #pragma        varargck        type        "lld"        vlong
          857 #pragma        varargck        type        "llx"        vlong
          858 #pragma        varargck        type        "lld"        uvlong
          859 #pragma        varargck        type        "llx"        uvlong
          860 #pragma        varargck        type        "ld"        long
          861 #pragma        varargck        type        "lx"        long
          862 #pragma        varargck        type        "ld"        ulong
          863 #pragma        varargck        type        "lx"        ulong
          864 #pragma        varargck        type        "d"        int
          865 #pragma        varargck        type        "x"        int
          866 #pragma        varargck        type        "c"        int
          867 #pragma        varargck        type        "C"        int
          868 #pragma        varargck        type        "d"        uint
          869 #pragma        varargck        type        "x"        uint
          870 #pragma        varargck        type        "c"        uint
          871 #pragma        varargck        type        "C"        uint
          872 #pragma        varargck        type        "f"        double
          873 #pragma        varargck        type        "e"        double
          874 #pragma        varargck        type        "g"        double
          875 #pragma        varargck        type        "lf"        long double
          876 #pragma        varargck        type        "le"        long double
          877 #pragma        varargck        type        "lg"        long double
          878 #pragma        varargck        type        "s"        char*
          879 #pragma        varargck        type        "q"        char*
          880 #pragma        varargck        type        "S"        Rune*
          881 #pragma        varargck        type        "Q"        Rune*
          882 #pragma        varargck        type        "r"        void
          883 #pragma        varargck        type        "%"        void
          884 #pragma        varargck        type        "n"        int*
          885 #pragma        varargck        type        "p"        void*
          886 #pragma        varargck        type        "<"        void*
          887 #pragma        varargck        type        "["        void*
          888 #pragma        varargck        type        "H"        void*
          889 #pragma        varargck        type        "lH"        void*
          890 
          891 #pragma        varargck        flag        ' '
          892 #pragma        varargck        flag        '#'
          893 #pragma        varargck        flag        '+'
          894 #pragma        varargck        flag        ','
          895 #pragma        varargck        flag        '-'
          896 #pragma        varargck        flag        'u'
          897 
          898 #pragma        varargck        argpos        fmtprint        2
          899 #pragma        varargck        argpos        fprint        2
          900 #pragma        varargck        argpos        print        1
          901 #pragma        varargck        argpos        runeseprint        3
          902 #pragma        varargck        argpos        runesmprint        1
          903 #pragma        varargck        argpos        runesnprint        3
          904 #pragma        varargck        argpos        runesprint        2
          905 #pragma        varargck        argpos        seprint        3
          906 #pragma        varargck        argpos        smprint        1
          907 #pragma        varargck        argpos        snprint        3
          908 #pragma        varargck        argpos        sprint        2
          909 #pragma        varargck        argpos        sysfatal        1
          910 #pragma        varargck        argpos        p9syslog        3
          911 #pragma        varargck        argpos        werrstr        1
          912 #endif
          913 
          914 /* compiler directives on plan 9 */
          915 #define        SET(x)        ((x)=0)
          916 #define        USED(x)        if(x){}else{}
          917 #ifdef __GNUC__
          918 #        if __GNUC__ >= 3
          919 #                undef USED
          920 #                define USED(x) ((void)(x))
          921 #        endif
          922 #endif
          923 
          924 /* command line */
          925 extern char        *argv0;
          926 extern void __fixargv0(void);
          927 #define        ARGBEGIN        for((argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\
          928                             argv[0] && argv[0][0]=='-' && argv[0][1];\
          929                             argc--, argv++) {\
          930                                 char *_args, *_argt;\
          931                                 Rune _argc;\
          932                                 _args = &argv[0][1];\
          933                                 if(_args[0]=='-' && _args[1]==0){\
          934                                         argc--; argv++; break;\
          935                                 }\
          936                                 _argc = 0;\
          937                                 while(*_args && (_args += chartorune(&_argc, _args)))\
          938                                 switch(_argc)
          939 #define        ARGEND                SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
          940 #define        ARGF()                (_argt=_args, _args="",\
          941                                 (*_argt? _argt: argv[1]? (argc--, *++argv): 0))
          942 #define        EARGF(x)        (_argt=_args, _args="",\
          943                                 (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
          944 
          945 #define        ARGC()                _argc
          946 
          947 #if defined(__cplusplus)
          948 }
          949 #endif
          950 #endif        /* _LIB9_H_ */