Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/*
 * stubs to make bootstrap kernels link, copies of a few functions
 * to avoid including system calls yet have access to i/o functions,
 * and some convenience routines.
 */
#include        "u.h"
#include        "../port/lib.h"
#include        "mem.h"
#include        "dat.h"
#include        "fns.h"
#include        "../port/error.h"

void (*proctrace)(Proc*, int, vlong);

/* devmnt.c */

void
muxclose(Mnt *)
{
}

Chan*
mntauth(Chan *, char *)
{
        return nil;
}

long
mntversion(Chan *, char *, int, int)
{
        return 0;
}

/* swap.c */

Image swapimage;

void
putswap(Page *)
{
}

void
dupswap(Page *)
{
}

void
kickpager(void)
{
}

int
swapcount(ulong)
{
        return 0;
}

void
pagersummary(void)
{
}

void
setswapchan(Chan *)
{
}

/* devenv.c */

void
closeegrp(Egrp *)
{
}

void
ksetenv(char *, char *, int)
{
}

/* devproc.c */

Segment*
data2txt(Segment *s)
{
        Segment *ps;

        ps = newseg(SG_TEXT, s->base, s->size);
        ps->image = s->image;
        incref(ps->image);
        ps->fstart = s->fstart;
        ps->flen = s->flen;
        ps->flushme = 1;
        return ps;
}

/* sysproc.c */

int
return0(void*)
{
        return 0;
}

/* syscallfmt.c */
void
syscallfmt(int, ulong, va_list)
{
}

void
sysretfmt(int, va_list, long, uvlong, uvlong)
{
}

/* sysfile.c */

int
newfd(Chan *)
{
        return -1;
}

void
validstat(uchar *s, int n)
{
        int m;
        char buf[64];

        if(statcheck(s, n) < 0)
                error(Ebadstat);
        /* verify that name entry is acceptable */
        s += STATFIXLEN - 4*BIT16SZ;    /* location of first string */
        /*
         * s now points at count for first string.
         * if it's too long, let the server decide; this is
         * only for his protection anyway. otherwise
         * we'd have to allocate and waserror.
         */
        m = GBIT16(s);
        s += BIT16SZ;
        if(m+1 > sizeof buf)
                return;
        memmove(buf, s, m);
        buf[m] = '\0';
        /* name could be '/' */
        if(strcmp(buf, "/") != 0)
                validname(buf, 0);
}

Chan*
fdtochan(int fd, int mode, int chkmnt, int iref)
{
        Chan *c;
        Fgrp *f;

        c = 0;
        f = up->fgrp;

        lock(f);
        if(fd<0 || f->nfd<=fd || (c = f->fd[fd])==0) {
                unlock(f);
                error(Ebadfd);
        }
        if(iref)
                incref(c);
        unlock(f);

        if(chkmnt && (c->flag&CMSG)) {
                if(iref)
                        cclose(c);
                error(Ebadusefd);
        }

        if(mode<0 || c->mode==ORDWR)
                return c;

        if((mode&OTRUNC) && c->mode==OREAD) {
                if(iref)
                        cclose(c);
                error(Ebadusefd);
        }

        if((mode&~OTRUNC) != c->mode) {
                if(iref)
                        cclose(c);
                error(Ebadusefd);
        }

        return c;
}

int
openmode(ulong o)
{
        o &= ~(OTRUNC|OCEXEC|ORCLOSE);
        if(o > OEXEC)
                error(Ebadarg);
        if(o == OEXEC)
                return OREAD;
        return o;
}

int
bind(char *old, char *new, int flag)
{
        int ret;
        Chan *c0, *c1;

        if((flag&~MMASK) || (flag&MORDER)==(MBEFORE|MAFTER))
                error(Ebadarg);

        c0 = namec(old, Abind, 0, 0);
        if(waserror()){
                cclose(c0);
                return -1;
        }

        c1 = namec(new, Amount, 0, 0);
        if(waserror()){
                cclose(c1);
                nexterror();
        }

        ret = cmount(&c0, c1, flag, nil);

        poperror();
        cclose(c1);
        poperror();
        cclose(c0);
        return ret;
}

long
unmount(char *name, char *old)
{
        Chan *cmount, *cmounted;

        cmounted = 0;
        cmount = namec(old, Amount, 0, 0);
        if(waserror()) {
                cclose(cmount);
                if(cmounted)
                        cclose(cmounted);
                return -1;
        }

        if(name)
                /*
                 * This has to be namec(..., Aopen, ...) because
                 * if name is something like /srv/cs or /fd/0,
                 * opening it is the only way to get at the real
                 * Chan underneath.
                 */
                cmounted = namec(name, Aopen, OREAD, 0);
        cunmount(cmount, cmounted);
        poperror();
        cclose(cmount);
        if(cmounted)
                cclose(cmounted);
        return 0;
}

long
chdir(char *dir)
{
        Chan *c;

        if (waserror())
                return -1;
        c = namec(dir, Atodir, 0, 0);
        if (up->dot)
                cclose(up->dot);
        up->dot = c;
        poperror();
        return 0;
}

Chan *
namecopen(char *name, int mode)
{
        Chan *c;

        if (waserror())
                return nil;
        c = namec(name, Aopen, mode, 0);
        poperror();
        return c;
}

Chan *
enamecopen(char *name, int mode)
{
        Chan *c;

        c = namecopen(name, mode);
        if (c == nil)
                panic("can't open %s", name);
        return c;
}

Chan *
nameccreate(char *name, int mode)
{
        Chan *c;

        if (waserror())
                return nil;
        c = namec(name, Acreate, mode, 0);
        poperror();
        return c;
}

Chan *
enameccreate(char *name, int mode)
{
        Chan *c;

        c = nameccreate(name, mode);
        if (c == nil)
                panic("can't create %s", name);
        return c;
}

int
myreadn(Chan *c, void *vp, long n)
{
        char *p = vp;
        long nn;

        while(n > 0) {
                nn = devtab[c->type]->read(c, p, n, c->offset);
                if(nn == 0)
                        break;
                c->offset += nn;
                p += nn;
                n -= nn;
        }
        return p - (char *)vp;
}

int
readfile(char *file, void *buf, int len)
{
        int n;
        Chan *cc;

        cc = nil;
        if (waserror()) {
                if (cc)
                        cclose(cc);
                return -1;
        }
        cc = namecopen(file, OREAD);
        if (cc == nil)
                error("no such file");
        n = myreadn(cc, buf, len);
        poperror();
        cclose(cc);
        return n;
}

static int
dumpfile(char *file)
{
        int n;
        char *buf;

        buf = smalloc(Maxfile + 1);
        n = readfile(file, buf, Maxfile);
        if (n < 0)
                return -1;
        buf[n] = 0;
        print("%s (%d bytes):\n", file, n);
        print("%s\n", buf);
        free(buf);
        return 0;
}

/* main.c */

void
fpx87restore(FPsave*)
{
}

void
fpx87save(FPsave*)
{
}

void
fpssesave(FPsave *)
{
}

void
fpsserestore(FPsave *)
{
}

ulong
l2be(long l)
{
        uchar *cp;

        cp = (uchar*)&l;
        return (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | cp[3];
}