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; }
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; }
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; }