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