1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
/*
* functions (possibly) linked in, complete, from libc.
*/
/*
* mem routines
*/
extern void *memccpy(void*, void*, int, long);
extern void *memset(void*, int, long);
extern int memcmp(void*, void*, long);
extern void *memmove(void*, void*, long);
extern void *memchr(void*, int, long);
/*
* string routines
*/
extern char *strcat(char*, char*);
extern char *strchr(char*, char);
extern int strcmp(char*, char*);
extern char *strcpy(char*, char*);
extern char *strncat(char*, char*, long);
extern char *strncpy(char*, char*, long);
extern int strncmp(char*, char*, long);
extern long strlen(char*);
extern int atoi(char*);
enum
{
UTFmax = 3, /* maximum bytes per rune */
Runesync = 0x80, /* cannot represent part of a UTF sequence */
Runeself = 0x80, /* rune and UTF sequences are the same (<) */
Runeerror = 0x80, /* decoding error in UTF */
};
/*
* rune routines
*/
extern int runetochar(char*, Rune*);
extern int chartorune(Rune*, char*);
extern char* utfrune(char*, long);
extern int utflen(char*);
extern int abs(int);
/*
* print routines
*/
typedef
struct
{
char* out; /* pointer to next output */
char* eout; /* pointer to end */
int f1;
int f2;
int f3;
int chr;
} Fconv;
extern void strconv(char*, Fconv*);
extern int numbconv(va_list*, Fconv*);
extern char *doprint(char*, char*, char*, va_list);
extern int fmtinstall(int, int (*)(va_list*, Fconv*));
extern int sprint(char*, char*, ...);
extern int snprint(char*, int, char*, ...);
extern int print(char*, ...);
/*
* one-of-a-kind
*/
extern long strtol(char*, char**, int);
extern ulong strtoul(char*, char**, int);
extern vlong strtovl(char*, char**, int);
extern char etext[];
extern char edata[];
extern char end[];
/*
* Syscall data structures
*/
#define MORDER 0x0003 /* mask for bits defining order of mounting */
#define MREPL 0x0000 /* mount replaces object */
#define MBEFORE 0x0001 /* mount goes before others in union directory */
#define MAFTER 0x0002 /* mount goes after others in union directory */
#define MCREATE 0x0004 /* permit creation in mounted directory */
#define MRECOV 0x0008 /* perform recovery if mount channel is lost */
#define MCACHE 0x0010 /* cache some data */
#define MMASK 0x001F /* all bits on */
#define OREAD 0 /* open for read */
#define OWRITE 1 /* write */
#define ORDWR 2 /* read and write */
#define OEXEC 3 /* execute, == read but check execute permission */
#define OTRUNC 16 /* or'ed in (except for exec), truncate file first */
#define OCEXEC 32 /* or'ed in, close on exec */
#define ORCLOSE 64 /* or'ed in, remove on close */
#define NCONT 0 /* continue after note */
#define NDFLT 1 /* terminate after note */
#define NSAVE 2 /* clear note but hold state */
#define NRSTR 3 /* restore saved state */
typedef struct Qid Qid;
typedef struct Dir Dir;
typedef struct Waitmsg Waitmsg;
#define ERRLEN 64
#define DIRLEN 116
#define NAMELEN 28
struct Qid
{
ulong path;
ulong vers;
};
struct Dir
{
char name[NAMELEN];
char uid[NAMELEN];
char gid[NAMELEN];
Qid qid;
ulong mode;
long atime;
long mtime;
Length;
short type;
short dev;
};
struct Waitmsg
{
char pid[12]; /* of loved one */
char time[3*12]; /* of loved one and descendants */
char msg[ERRLEN];
};
|