Example #1
0
int dcload_unlink(vfs_handler_t * dummy, const char *fn) {
  int oldirq = 0;
  int ret;

  net_lock();

  STOPIRQ;
  ret = sc_unlink(fn);
  STARTIRQ;

  net_unlock();
  return ret;
}
Example #2
0
int dcload_rename(vfs_handler_t * dummy, const char *fn1, const char *fn2) {
  int oldirq = 0;
  int ret;

  net_lock();

  /* really stupid hack, since I didn't put rename() in dcload */

  STOPIRQ;
  ret = sc_link(fn1, fn2);

  if (!ret)
    ret = sc_unlink(fn1);
  STARTIRQ;

  net_unlock();
  return ret;
}
Example #3
0
static int
bind_unix_socket(struct socket *sock, struct cpt_sock_image *si,
                 cpt_context_t *ctx)
{
    int err;
    char *name;
    struct sockaddr* addr;
    int addrlen;
    struct sockaddr_un sun;
    struct nameidata nd;

    if ((addrlen = si->cpt_laddrlen) <= 2)
        return 0;

    nd.path.dentry = NULL;
    name = ((char*)si->cpt_laddr) + 2;
    addr = (struct sockaddr *)si->cpt_laddr;

    if (name[0]) {
        if (path_lookup(name, 0, &nd))
            nd.path.dentry = NULL;

        if (si->cpt_deleted) {
            if (nd.path.dentry == NULL &&
                    sock->ops->bind(sock, addr, addrlen) == 0) {
                sc_unlink(name);
                return 0;
            }

            addr = (struct sockaddr*)&sun;
            addr->sa_family = AF_UNIX;
            name = ((char*)addr) + 2;
            err = select_deleted_name(name, ctx);
            if (err)
                goto out;
            addrlen = 2 + strlen(name);
        } else if (nd.path.dentry) {
            if (!S_ISSOCK(nd.path.dentry->d_inode->i_mode)) {
                eprintk_ctx("bind_unix_socket: not a socket dentry\n");
                err = -EINVAL;
                goto out;
            }
            sc_unlink(name);
        }
    }

    err = sock->ops->bind(sock, addr, addrlen);

    if (!err && name[0]) {
        if (nd.path.dentry) {
            sc_chown(name, nd.path.dentry->d_inode->i_uid,
                     nd.path.dentry->d_inode->i_gid);
            sc_chmod(name, nd.path.dentry->d_inode->i_mode);
        }
        if (si->cpt_deleted)
            sc_unlink(name);
    }

out:
    if (nd.path.dentry)
        path_put(&nd.path);
    return err;
}