Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/* Copyright © Coraid, Inc. 2006.  All rights reserved. */
#include <u.h>
#include <libc.h>
#include "cec.h"

int     fd = -1;
int     cfd = -1;
int     efd = -1;

int
netopen0(char *e)
{
        char buf[128], ctl[13];
        int n;

        snprint(buf, sizeof buf, "%s/clone", e);
        if((efd = open(buf, ORDWR)) == -1)
                return -1;
        memset(ctl, 0, sizeof ctl);
        if(read(efd, ctl, sizeof ctl) < 0)
                return -1;
        n = atoi(ctl);
        snprint(buf, sizeof buf, "connect %d", Etype);
        if(write(efd, buf, strlen(buf)) != strlen(buf))
                return -1;
        snprint(buf, sizeof buf, "%s/%d/ctl", e, n);
        if((cfd = open(buf, ORDWR)) < 0)
                return -1;
        snprint(buf, sizeof buf, "nonblocking");
        if(write(cfd, buf, strlen(buf)) != strlen(buf))
                return -1;
        snprint(buf, sizeof buf, "%s/%d/data", e, n);
        fd = open(buf, ORDWR);
        return fd;
}

void
netclose(void)
{
        close(efd);
        close(cfd);
        close(fd);
        efd = -1;
        cfd = -1;
        fd = -1;
}

int
netopen(char *e)
{
        int r;

        if((r = netopen0(e)) >= 0)
                return r;
        perror("netopen");
        netclose();
        return -1;
}

/* what if len < netlen? */
int
netget(void *v, int len)
{
        int l;

        l = read(fd, v, len);
        if(debug && l > 0){
                fprint(2, "read %d bytes\n", l);
                dump((uchar*)v, l);
        }
        if (l <= 0)
                return 0;
        return l;
}

int
netsend(void *v, int len)
{
        uchar *p;

        p = v;
        if (debug) {
                fprint(2, "sending %d bytes\n", len);
                dump(p, len);
        }
        if (len < 60)
                len = 60;       /* mintu */
        return write(fd, p, len);
}