Exemple #1
0
int sys_pipe2_hdlr(int paddr, int flags)
{
    int *pfd = (int*)paddr;
    struct fnode *rd, *wr;
    struct pipe_priv *pp;
    pp = kalloc(sizeof (struct pipe_priv));
    if (!pp) {
        return -ENOMEM;
    }

    rd = fno_create(&mod_pipe, "", &PIPE_ROOT);
    if (!rd) {
        goto fail_rd;
    }
    wr = fno_create(&mod_pipe, "", &PIPE_ROOT);
    if (!wr) {
        goto fail_wr;
    }

    pfd[0] = task_filedesc_add(rd);
    pfd[1] = task_filedesc_add(wr);

    if (pfd[0] < 0 || pfd[1] < 0) {
        goto fail_all;
    }

    task_fd_setmask(pfd[0], O_RDONLY);
    task_fd_setmask(pfd[1], O_WRONLY);

    rd->priv = pp;
    wr->priv = pp;

    pp->fno_r = rd;
    pp->fno_w = wr;
    pp->pid_r = 0;
    pp->pid_w = 0;
    pp->w_off = 0;
    pp->cb = cirbuf_create(PIPE_BUFSIZE);
    if (!pp->cb) {
        goto fail_all;
    }
    return 0;

fail_all:
        fno_unlink(wr);
fail_wr:
        fno_unlink(rd);
fail_rd:
        kfree(pp);
        return -ENOMEM;

}
int sysfs_register(char *name, char *dir,
        int (*do_read)(struct sysfs_fnode *sfs, void *buf, int len),
        int (*do_write)(struct sysfs_fnode *sfs, const void *buf, int len) )
{
    struct fnode *fno = fno_create(&mod_sysfs, name, fno_search(dir));
    struct sysfs_fnode *mfs;
    if (!fno)
        return -1;

    mfs = kalloc(sizeof(struct sysfs_fnode));
    if (mfs) {
        mfs->fnode = fno;
        fno->priv = mfs;
        mfs->do_read = do_read;
        mfs->do_write = do_write;
        return 0;
    }
    return -1;
}