## diffname ip/kio.c 1997/0327
## diff -e /dev/null /n/emeliedump/1997/0327/sys/src/brazil/ip/kio.c
0a
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "../port/error.h"
#include "kernel.h"
#define validaddr(a, b, c)
long
kclose(int fd)
{
if(waserror())
return -1;
/*
* Take no reference on the chan because we don't really need the
* data structure, and are calling fdtochan only for error checks.
* fdclose takes care of processes racing through here.
*/
fdtochan(fd, -1, 0, 0);
fdclose(fd, 0);
poperror();
return 0;
}
long
kopen(char *path, int mode)
{
int fd;
Chan *c = 0;
if(waserror()) {
if(c)
cclose(c);
return -1;
}
openmode(mode);
validaddr((ulong)path, 1, 0);
c = namec(path, Aopen, mode, 0);
fd = newfd(c);
poperror();
return fd;
}
long
kread(int fd, void *va, long n)
{
int dir;
Chan *c;
if(waserror())
return -1;
validaddr((ulong)va, n, 1);
c = fdtochan(fd, OREAD, 1, 1);
if(waserror()) {
cclose(c);
nexterror();
}
dir = c->qid.path&CHDIR;
if(dir) {
n -= n%DIRLEN;
if(c->offset%DIRLEN || n==0)
error(Etoosmall);
}
if(dir && c->mnt)
n = unionread(c, va, n);
else if(devchar[c->type] != L'M')
n = devtab[c->type]->read(c, va, n, c->offset);
else
n = mntread9p(c, va, n, c->offset);
lock(c);
c->offset += n;
unlock(c);
poperror();
cclose(c);
poperror();
return n;
}
long
kseek(int fd, int offset, int whence)
{
Chan *c;
char buf[DIRLEN];
Dir dir;
long off;
if(waserror())
return -1;
c = fdtochan(fd, -1, 1, 1);
if(waserror()) {
cclose(c);
nexterror();
}
if(c->qid.path & CHDIR)
error(Eisdir);
if(devchar[c->type] == '|')
error(Eisstream);
off = 0;
switch(whence) {
case 0:
off = c->offset = offset;
break;
case 1:
lock(c); /* lock for read/write update */
c->offset += offset;
off = c->offset;
unlock(c);
break;
case 2:
devtab[c->type]->stat(c, buf);
convM2D(buf, &dir);
c->offset = dir.length + offset;
off = c->offset;
break;
}
poperror();
cclose(c);
poperror();
return off;
}
long
kwrite(int fd, void *va, long n)
{
Chan *c;
if(waserror())
return -1;
validaddr((ulong)va, n, 0);
c = fdtochan(fd, OWRITE, 1, 1);
if(waserror()) {
cclose(c);
nexterror();
}
if(c->qid.path & CHDIR)
error(Eisdir);
n = devtab[c->type]->write(c, va, n, c->offset);
lock(c);
c->offset += n;
unlock(c);
poperror();
cclose(c);
poperror();
return n;
}
/* Set kernel error string */
void
kerrstr(char *err)
{
if(up != nil)
strncpy(up->error, err, ERRLEN);
}
/* Get kernel error string */
void
kgerrstr(char *err)
{
char *s;
s = "<no-up>";
if(up != nil)
s = up->error;
strncpy(err, s, ERRLEN);
}
/* Set kernel error string, using formatted print */
void
kwerrstr(char *fmt, ...)
{
va_list arg;
char buf[256];
va_start(arg, fmt);
doprint(buf, buf+sizeof(buf), fmt, arg);
va_end(arg);
strncpy(up->error, buf, ERRLEN);
}
.
## diffname ip/kio.c 1997/0408
## diff -e /n/emeliedump/1997/0327/sys/src/brazil/ip/kio.c /n/emeliedump/1997/0408/sys/src/brazil/ip/kio.c
109c
if(devtab[c->type]->dc == '|')
.
74c
else if(devtab[c->type]->dc != L'M')
.
## diffname ip/kio.c 1998/0319
## diff -e /n/emeliedump/1997/0408/sys/src/brazil/ip/kio.c /n/emeliedump/1998/0319/sys/src/brazil/ip/kio.c
126c
c->offset = dir.length2 + offset; /* BOTCH */
.
115c
off = offset;
c->offset = offset;
.
91c
kseek(int fd, vlong offset, int whence)
.
## diffname ip/kio.c 1998/0321
## diff -e /n/emeliedump/1998/0319/sys/src/brazil/ip/kio.c /n/emeliedump/1998/0321/sys/src/brazil/ip/kio.c
127c
c->offset = dir.length1 + offset; /* BOTCH */
.
## diffname ip/kio.c 1998/0326
## diff -e /n/emeliedump/1998/0321/sys/src/brazil/ip/kio.c /n/emeliedump/1998/0326/sys/src/brazil/ip/kio.c
127c
c->offset = dir.length + offset;
.
## diffname ip/kio.c 1998/0829
## diff -e /n/emeliedump/1998/0326/sys/src/brazil/ip/kio.c /n/emeliedump/1998/0829/sys/src/brazil/ip/kio.c
72c
if(dir && c->mh)
.
## diffname ip/kio.c 2000/1111 # deleted
## diff -e /n/emeliedump/1998/0829/sys/src/brazil/ip/kio.c /n/emeliedump/2000/1111/sys/src/9/ip/kio.c
1,199d
|