lxc move_fd MACRO 관련 질문...

gyoonus의 이미지

안녕하세요... 뉴비입니다..

lxc 분석하다가 ... 질문이 하나 있어서~ 문의드립니다.

#define move_fd(fd)                         \
	({                                  \
		int __internal_fd__ = (fd); \
		(fd) = -EBADF;              \
		__internal_fd__;            \
	})
 
int lxc_unix_connect_type(struct sockaddr_un *addr, int type)
{
	__do_close int fd = -EBADF;
	int ret;
	ssize_t len;
 
	fd = socket(AF_UNIX, type | SOCK_CLOEXEC, 0);
	if (fd < 0)
		return syserror("Failed to open new AF_UNIX socket");
 
	if (addr->sun_path[0] == '\0')
		len = strlen(&addr->sun_path[1]);
	else
		len = strlen(&addr->sun_path[0]);
 
	ret = connect(fd, (struct sockaddr *)addr,
		      offsetof(struct sockaddr_un, sun_path) + len);
	if (ret < 0)
		return syserror("Failed to bind new AF_UNIX socket");
 
	return move_fd(fd);
}

굳이 왜 move_fd 메크로를 활용해서 __internal_fd__의 값을 보내는 걸까요...
알려주시면 감사하겠습니다...

익명 사용자의 이미지

그렇게 안 하면 int fd__do_close가 지정되어 있어서 반환되기 전에 fd가 닫혀버리거든요.

fd에 의해 닫히는 일을 막기 위해서 여기에 -EBADF를 집어넣고, 원래 값은 백업해뒀다가 반환하는거죠.

gyoonus의 이미지

감사해요!!!