函数unix_find_other()根据给定的地址找到目标插口sock数据结构,其代码也在
net/unix/af_unix.c中:
static unix_socket *unix_find_other(struct sockaddr_un *sunname, int len,
int type, unsigned hash, int *error)
{
unix_socket *u;
struct nameidata nd;
int err = 0;
if (sunname->sun_path[0]) {
if (path_init(sunname->sun_path,
LOOKUP_POSITIVE|LOOKUP_FOLLOW, &nd))
err = path_walk(sunname->sun_path, &nd);
if (err)
goto fail;
err = permission(nd.dentry->d_inode,MAY_WRITE);
if (err)
goto put_fail;
err = -ECONNREFUSED;
if (!S_ISSOCK(nd.dentry->d_inode->i_mode))
goto put_fail;
u=unix_find_socket_byinode(nd.dentry->d_inode);
if (!u)
goto put_fail;
path_release(&nd);
err=-EPROTOTYPE;
if (u->type != type) {
sock_put(u);
goto fail;
}
} else {
err = -ECONNREFUSED;
u=unix_find_socket_byname(sunname, len, type, hash);
if (!u)
goto fail;
}
return u;
put_fail:
path_release(&nd);
fail:
*error=err;
return NULL;
}
可见,对于常规的以文件路径名为代表的插口地址,要先通过文件系统的操作 path_init() 和path_walk() 在文件系统中找到其目录项和索引节点,并在内存中建立其相应的dentry 结构以及inode结构。