forgotten files

This commit is contained in:
rsc 2005-01-13 04:56:07 +00:00
parent 79af2b89fa
commit 3940506bcc
10 changed files with 5356 additions and 0 deletions

29
bin/sig Executable file
View file

@ -0,0 +1,29 @@
#!/usr/local/plan9/bin/rc
# Usage: sig key ...
# prints out function signatures by grepping the manual
*=`{echo $*|tr A-Z a-z|tr -dc 'a-z0-9_ \012'} # fold case, delete funny chars
if(~ $#* 0){
echo Usage: sig function ... >[1=2]
exit 1
}
for (i) {
files=`{9 grep -il '[ ]\*?'$i'\(' $PLAN9/man/man3/*.3*}
for(j in $files) {
{echo .nr LL 20i; 9 sed -n '/^.SH SYNOPSIS/,/^.SH.*DESCR/p' $j } |
9 nroff -man |
9 sed '
:a
/,$/ {
N
s/\n//
}
ta
s/[ ]+/ /g' |
9 grep -i -e '[ ]\*?'$i'\(' | sed 's/^[ +]/ /'
}
}
exit 0

246
lib/bclib Executable file
View file

@ -0,0 +1,246 @@
scale = 50
define e(x) {
auto a, b, c, d, e, g, w, y, t, r
r = ibase
ibase = A
t = scale
scale = t + .434*x + 1
w = 0
if(x<0) {
x = -x
w = 1
}
y = 0
while(x>2) {
x /= 2
y++
}
a = 1
b = 1
c = b
d = 1
e = 1
for(a=1; 1; a++) {
b *= x
c = c*a+b
d *= a
g = c/d
if(g == e) {
g = g/1
while(y--) {
g *= g
}
scale = t
if(w==1) {
ibase = r
return 1/g
}
ibase = r
return g/1
}
e = g
}
}
define l(x) {
auto a, b, c, d, e, f, g, u, s, t, r, z
r = ibase
ibase = A
if(x <= 0) {
z = 1-10^scale
ibase = r
return z
}
t = scale
f = 1
scale += scale(x) - length(x) + 1
s = scale
while(x > 2) {
s += (length(x)-scale(x))/2 + 1
if(s>0) {
scale = s
}
x = sqrt(x)
f *= 2
}
while(x < .5) {
s += (length(x)-scale(x))/2 + 1
if(s>0) {
scale = s
}
x = sqrt(x)
f *= 2
}
scale = t + length(f) - scale(f) + 1
u = (x-1)/(x+1)
scale += 1.1*length(t) - 1.1*scale(t)
s = u*u
b = 2*f
c = b
d = 1
e = 1
for(a=3; 1; a=a+2){
b *= s
c = c*a + d*b
d *= a
g = c/d
if(g==e) {
scale = t
ibase = r
return u*c/d
}
e = g
}
}
define s(x) {
auto a, b, c, s, t, y, p, n, i, r
r = ibase
ibase = A
t = scale
y = x/.7853
s = t + length(y) - scale(y)
if(s<t) {
s = t
}
scale = s
p = a(1)
scale = 0
if(x>=0) {
n = (x/(2*p)+1)/2
}
if(x<0) {
n = (x/(2*p)-1)/2
}
x -= 4*n*p
if(n%2 != 0) {
x = -x
}
scale = t + length(1.2*t) - scale(1.2*t)
y = -x*x
a = x
b = 1
s = x
for(i=3; 1; i+=2) {
a *= y
b *= i*(i-1)
c = a/b
if(c==0){
scale = t
ibase = r
return s/1
}
s += c
}
}
define c(x) {
auto t, r
r = ibase
ibase = A
t = scale
scale = scale+1
x = s(x + 2*a(1))
scale = t
ibase = r
return x/1
}
define a(x) {
auto a, b, c, d, e, f, g, s, t, r, z
r = ibase
ibase = A
if(x==0) {
return 0
}
if(x==1) {
z = .7853981633974483096156608458198757210492923498437764/1
ibase = r
if(scale<52) {
return z
}
}
t = scale
f = 1
while(x > .5) {
scale++
x = -(1 - sqrt(1.+x*x))/x
f *= 2
}
while(x < -.5) {
scale++
x = -(1 - sqrt(1.+x*x))/x
f *= 2
}
s = -x*x
b = f
c = f
d = 1
e = 1
for(a=3; 1; a+=2) {
b *= s
c = c*a + d*b
d *= a
g = c/d
if(g==e) {
scale = t
ibase = r
return x*c/d
}
e = g
}
}
define j(n,x) {
auto a,b,c,d,e,g,i,s,k,t,r
r = ibase
ibase = A
t = scale
k = 1.36*x + 1.16*t - n
k = length(k) - scale(k)
if(k>0) {
scale += k
}
s = -x*x/4
if(n<0) {
n = -n
x = -x
}
a = 1
c = 1
for(i=1; i<=n; i++) {
a *= x
c *= 2*i
}
b = a
d = 1
e = 1
for(i=1; 1; i++) {
a *= s
b = b*i*(n+i) + a
c *= i*(n+i)
g = b/c
if(g==e) {
scale = t
ibase = r
return g/1
}
e = g
}
}

19
man/man1/9.1 Normal file
View file

@ -0,0 +1,19 @@
.TH 9 1
.SH NAME
9 \- run Plan 9 commands
.SH SYNOPSIS
.B .
.B 9
.PP
.B 9
.I cmd
[
.I args
\&...
]
.SH DESCRIPTION
XXX
.SH SOURCE
.B \*9/bin/9
.SH SEE ALSO
.IR intro (1)

119
man/man3/9p-cmdbuf.3 Normal file
View file

@ -0,0 +1,119 @@
.TH 9P-CMDBUF 3
.SH NAME
Cmdbuf, parsecmd, respondcmderror, lookupcmd \- control message parsing
.SH SYNOPSIS
.ft L
.nf
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
.fi
.PP
.ft L
.nf
.ta \w'\fL1234'u +\w'\fL12345678'u
typedef struct Cmdbuf
{
char *buf;
char **f;
int nf;
} Cmdbuf;
typedef struct Cmdtab
{
int index;
char *cmd;
int narg;
};
Cmdbuf *parsecmd(char *p, int n)
Cmdtab *lookupcmd(Cmdbuf *cb, Cmdtab *tab, int ntab)
void respondcmderror(Req *r, Cmdbuf *cb, char *fmt, ...)
.fi
.SH DESCRIPTION
These data structures and functions provide parsing of textual control messages.
.PP
.I Parsecmd
treats the
.I n
bytes at
.I p
(which need not be NUL-terminated) as a UTF string and splits it
using
.I tokenize
(see
.IR getfields (3)).
It returns a
.B Cmdbuf
structure holding pointers to each field in the message.
.PP
.I Lookupcmd
walks through the array
.IR ctab ,
which has
.I ntab
entries,
looking for the first
.B Cmdtab
that matches the parsed command.
(If the parsed command is empty,
.I lookupcmd
returns nil immediately.)
A
.B Cmdtab
matches the command if
.I cmd
is equal to
.IB cb -> f [0]
or if
.I cmd
is
.LR * .
Once a matching
.B Cmdtab
has been found, if
.I narg
is not zero, then the parsed command
must have exactly
.I narg
fields (including the command string itself).
If the command has the wrong number of arguments,
.I lookupcmd
returns nil.
Otherwise, it returns a pointer to the
.B Cmdtab
entry.
If
.I lookupcmd
does not find a matching command at all,
it returns nil.
Whenever
.I lookupcmd
returns nil, it sets the system error string.
.PP
.I Respondcmderror
resoponds to request
.I r
with an error of the form
`\fIfmt\fB:\fI cmd\fR,'
where
.I fmt
is the formatted string and
.I cmd
is a reconstruction of the parsed command.
Fmt
is often simply
.B "%r" .
.SH EXAMPLES
This interface is not used in any distributed 9P servers.
It was lifted from the Plan 9 kernel.
Almost any Plan 9 kernel driver
.RB ( /sys/src/9/*/dev*.c
on Plan 9)
is a good example.
.SH SOURCE
.B \*9/src/lib9p/parse.c
.SH SEE ALSO
.IR 9p (3)

204
man/man3/9p-fid.3 Normal file
View file

@ -0,0 +1,204 @@
.TH 9P-FID 3
.SH NAME
Fid, Fidpool, allocfidpool, freefidpool, allocfid, closefid, lookupfid, removefid,
Req, Reqpool, allocreqpool, freereqpool, allocreq, closereq, lookupreq, removereq \- 9P fid, request tracking
.SH SYNOPSIS
.ft L
.nf
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
.fi
.PP
.ft L
.nf
.ta \w'\fL 'u +\w'\fLulong 'u
typedef struct Fid
{
ulong fid;
char omode; /* -1 if not open */
char *uid;
Qid qid;
File *file;
void *aux;
\fI...\fP
} Fid;
.fi
.PP
.ft L
.nf
.ta \w'\fL 'u +\w'\fLulong 'u
typedef struct Req
{
ulong tag;
Fcall ifcall;
Fcall ofcall;
Req *oldreq;
void *aux;
\fI...\fP
} Req;
.fi
.PP
.ft L
.nf
.ta \w'\fLFidpool* 'u
Fidpool* allocfidpool(void (*destroy)(Fid*))
void freefidpool(Fidpool *p)
Fid* allocfid(Fidpool *p, ulong fid)
Fid* lookupfid(Fidpool *p, ulong fid)
void closefid(Fid *f)
void removefid(Fid *f)
.fi
.PP
.ft L
.nf
.ta \w'\fLReqpool* 'u
Reqpool* allocreqpool(void (*destroy)(Req*))
void freereqpool(Reqpool *p)
Req* allocreq(Reqpool *p, ulong tag)
Req* lookupreq(Reqpool *p, ulong tag)
void closereq(Req *f)
void removereq(Req *r)
.fi
.SH DESCRIPTION
These routines provide management of
.B Fid
and
.B Req
structures from
.BR Fidpool s
and
.BR Reqpool s.
They are primarily used by the 9P server loop
described in
.IR 9p (3).
.PP
.B Fid
structures are intended to represent
active fids in a 9P connection, as
.B Chan
structures do in the Plan 9 kernel.
The
.B fid
element is the integer fid used in the 9P
connection.
.B Omode
is the mode under which the fid was opened, or
.B -1
if this fid has not been opened yet.
Note that in addition to the values
.BR OREAD ,
.BR OWRITE ,
and
.BR ORDWR ,
.B omode
can contain the various flags permissible in
an open call.
To ignore the flags, use
.BR omode&OMASK .
.B Omode
should not be changed by the client.
The fid derives from a successful authentication by
.BR uid .
.B Qid
contains the qid returned in the last successful
.B walk
or
.B create
transaction involving the fid.
In a file tree-based server, the
.BR Fid 's
.B file
element points at a
.B File
structure
(see
.IR 9p-file (3))
corresponding to the fid.
The
.B aux
member is intended for use by the
client to hold information specific to a particular
.BR Fid .
With the exception of
.BR aux ,
these elements should be treated
as read-only by the client.
.PP
.I Allocfidpool
creates a new
.BR Fidpool .
.I Freefidpool
destroys such a pool.
.I Allocfid
returns a new
.B Fid
whose fid number is
.IR fid .
There must not already be an extant
.B Fid
with that number in the pool.
Once a
.B Fid
has been allocated, it can be looked up by
fid number using
.IR lookupfid .
.BR Fid s
are reference counted: both
.I allocfid
and
.I lookupfid
increment the reference count on the
.B Fid
structure before
returning.
When a reference to a
.B Fid
is no longer needed,
.I closefid
should be called to note the destruction of the reference.
When the last reference to a
.B Fid
is removed, if
.I destroy
(supplied when creating the fid pool)
is not zero, it is called with the
.B Fid
as a parameter.
It should perform whatever cleanup is necessary
regarding the
.B aux
element.
.I Removefid
is equivalent to
.I closefid
but also removes the
.B Fid
from the pool.
Note that due to lingering references,
the return of
.I removefid
may not mean that
.I destroy
has been called.
.PP
.IR Allocreqpool ,
.IR freereqpool ,
.IR allocreq ,
.IR lookupreq ,
.IR closereq ,
and
.I removereq
are analogous but
operate on
.BR Reqpool s
and
.B Req
structures.
.SH SOURCE
.B \*9/src/lib9p
.SH SEE ALSO
.IR 9p (3),
.IR 9p-file (3)

223
man/man3/9p-file.3 Normal file
View file

@ -0,0 +1,223 @@
.TH 9P-FILE 3
.SH NAME
Tree, alloctree, freetree,
File, createfile, closefile, removefile, walkfile,
opendirfile, readdirfile, closedirfile, hasperm \- in-memory file hierarchy
.SH SYNOPSIS
.ft L
.nf
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
.fi
.PP
.ft L
.nf
.ta \w'\fLFile 'u
typedef struct File
{
Ref;
Dir;
void *aux;
\fI...\fP
} File;
.fi
.PP
.ft L
.nf
.ta \w'\fLTree 'u
typedef struct Tree
{
File *root;
\fI...\fP
} Tree;
.fi
.PP
.ft L
.nf
.ta \w'\fLReaddir* 'u +4n +4n
Tree* alloctree(char *uid, char *gid, ulong mode,
void (*destroy)(File*))
void freetree(Tree *tree)
File* createfile(File *dir, char *name, char *uid,
ulong mode, void *aux)
int removefile(File *file)
void closefile(File *file)
File* walkfile(File *dir, char *path)
Readdir* opendirfile(File *dir)
long readdirfile(Readdir *rdir, char *buf, long n)
void closedirfile(Readdir *rdir)
int hasperm(File *file, char *uid, int p)
.fi
.SH DESCRIPTION
.BR File s
and
.BR Tree s
provide an in-memory file hierarchy
intended for use in 9P file servers.
.PP
.I Alloctree
creates a new tree of files, and
.I freetree
destroys it.
The root of the tree
(also the
.B root
element in the structure)
will have mode
.I mode
and be owned by user
.I uid
and group
.IR gid .
.I Destroy
is used when freeing
.B File
structures and is described later.
.PP
.BR File s
(including directories)
other than the root are created using
.IR createfile ,
which attempts to create a file named
.I name
in the directory
.IR dir .
If created, the file will have owner
.I uid
and have a group inherited from
the directory.
.I Mode
and the permissions of
.I dir
are used to calculate the permission bits for
the file as described in
.IR open (9p).
It is permissible for
.I name
to be a slash-separated path rather than a single element.
.PP
.I Removefile
removes a file from the file tree.
The file will not be freed until the last
reference to it has been removed.
Directories may only be removed when empty.
.I Removefile
returns zero on success, \-1 on error.
It is correct to consider
.I removefile
to be
.I closefile
with the side effect of removing the file
when possible.
.PP
.I Walkfile
evaluates
.I path
relative to the directory
.IR dir ,
returning the resulting file,
or zero if the named file or any intermediate element
does not exist.
.PP
The
.B File
structure's
.B aux
pointer may be used by the client
for
.RB per- File
storage.
.BR File s
are reference-counted: if not zero,
.I destroy
(specified in the call to
.IR alloctree )
will be called for each file when its
last reference is removed or when the tree is freed.
.I Destroy
should take care of any necessary cleanup related to
.BR aux .
When creating new file references by copying pointers,
call
.I incref
(see
.IR lock (3))
to update the reference count.
To note the removal of a reference to a file, call
.IR closefile .
.I Createfile
and
.I walkfile
return new references.
.IR Removefile ,
.IR closefile ,
and
.I walkfile
(but not
.IR createfile )
consume the passed reference.
.PP
Directories may be read, yielding a directory entry structure
(see
.IR stat (9p))
for each file in the directory.
In order to allow concurrent reading of directories,
clients must obtain a
.B Readdir
structure by calling
.I opendirfile
on a directory.
Subsequent calls to
.I readdirfile
will each yield an integral number of machine-independent
stat buffers, until end of directory.
When finished, call
.I closedirfile
to free the
.BR Readdir .
.PP
.I Hasperm
does simplistic permission checking; it assumes only
one-user groups named by uid and returns non-zero if
.I uid
has permission
.I p
(a bitwise-or of
.BR AREAD ,
.BR AWRITE
and
.BR AEXEC )
according to
.IB file ->mode \fR.
9P servers written using
.B File
trees will do standard permission checks automatically;
.I hasperm
may be called explicitly to do additional checks.
A 9P server may link against a different
.I hasperm
implementation to provide more complex groups.
.SH EXAMPLE
The following code correctly handles references
when elementwise walking a path and creating a file.
.IP
.EX
f = tree->root;
incref(f);
for(i=0; i<n && f!=nil; i++)
f = walkfile(f, elem[i]);
if(f == nil)
return nil;
nf = createfile(f, "foo", "nls", 0666, nil);
closefile(f);
return nf;
.EE
.SH SOURCE
.B \*9/src/lib9p/file.c
.SH SEE ALSO
.IR 9p (3)
.SH BUGS
The reference counting is cumbersome.

126
man/man3/9p-intmap.3 Normal file
View file

@ -0,0 +1,126 @@
.TH 9P-INTMAP 3
.SH NAME
Intmap, allocmap, freemap, insertkey, caninsertkey, lookupkey,
deletekey \- integer to data structure maps
.SH SYNOPSIS
.ft L
.nf
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
.fi
.PP
.ft L
.nf
.ta \w'\fLIntmap* 'u
Intmap* allocmap(void (*inc)(void*))
void freemap(Intmap *map, void (*dec)(void*))
void* lookupkey(Intmap *map, ulong key)
void* insertkey(Intmap *map, ulong key, void *val)
int caninsertkey(Intmap *map, ulong key, void *val)
void* lookupkey(Intmap *map, ulong key)
void* deletekey(Intmap *map, ulong key)
.fi
.SH DESCRIPTION
An
.B Intmap
is an arbitrary mapping from integers to pointers.
.I Allocmap
creates a new map, and
.I freemap
destroys it.
The
.I inc
function is called each time a new pointer is added
to the map; similarly,
.I dec
is called on each pointer left in the map
when it is being freed.
Typically these functions maintain reference counts.
New entries are added to the map by calling
.IR insertkey ,
which will return the previous value
associated with the given
.IR key ,
or zero if there was no previous value.
.I Caninsertkey
is like
.I insertkey
but only inserts
.I val
if there is no current mapping.
It returns 1 if
.I val
was inserted, 0 otherwise.
.I Lookupkey
returns the pointer associated with
.IR key ,
or zero if there is no such pointer.
.I Deletekey
removes the entry for
.I id
from the map, returning the
associated pointer, if any.
.PP
Concurrent access to
.BR Intmap s
is safe,
moderated via a
.B QLock
stored in the
.B Intmap
structure.
.PP
In anticipation of the storage of reference-counted
structures, an increment function
.I inc
may be specified
at map creation time.
.I Lookupkey
calls
.I inc
(if non-zero)
on pointers before returning them.
If the reference count adjustments were
left to the caller (and thus not protected by the lock),
it would be possible to accidentally reclaim a structure
if, for example, it was deleted from the map and its
reference count decremented between the return
of
.I insertkey
and the external increment.
.IR Insertkey
and
.IR caninsertkey
do
.I not
call
.I inc
when inserting
.I val
into the map, nor do
.I insertkey
or
.I deletekey
call
.I inc
when returning old map entries.
The rationale is that calling
an insertion function transfers responsibility for the reference
to the map, and responsibility is given back via the return value of
.I deletekey
or the next
.IR insertkey .
.PP
.BR Intmap s
are used by the 9P library to implement
.BR Fidpool s
and
.BR Reqpool s.
.SH SOURCE
.B \*9/src/lib9p/intmap.c
.SH SEE ALSO
.IR 9p (3),
.IR 9p-fid (3)

1
proto/allproto Normal file
View file

@ -0,0 +1 @@
+

1447
src/cmd/sed.c Normal file

File diff suppressed because it is too large Load diff

2942
src/cmd/yacc.c Normal file

File diff suppressed because it is too large Load diff