connect 函数

函数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结构。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值