libc.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_ */