udevd init_udevd_socket
udevdのinit_udevd_socket関数の解析メモ
static int init_udevd_socket(void)
{
struct sockaddr_un saddr;
socklen_t addrlen;
const int feature_on = 1;
int retval;
memset(&saddr, 0x00, sizeof(saddr));
AF_LOCALはAF_UNIXと同じ
Windowsでも使うため一般的な名前としてAF_LOCALを使う
saddr.sun_family = AF_LOCAL;
先頭をNULL文字にすると抽象名前空間となる。
AF_UNIX(AF_LOCAL)ソケットでのみ使用できる。
抽象名前空間の実装はLinux2.2以降から。
JM Manpage of UNIXを参照のこと
/* use abstract namespace for socket path */
strcpy(&saddr.sun_path[1], UDEVD_CTRL_SOCK_PATH);
addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
if (udevd_sock == -1) {
err("error getting socket: %s", strerror(errno));
return -1;
}
/* the bind takes care of ensuring only one copy running */
retval = bind(udevd_sock, (struct sockaddr *) &saddr, addrlen);
if (retval < 0) {
err("bind failed: %s", strerror(errno));
close(udevd_sock);
udevd_sock = -1;
return -1;
}
SO_PASSCREDはmsgの補助メッセージとして信任状を受信できるようにする。
信任状は以下の型
struct ucred {
pid_t pid; /* process id of the sending process */
uid_t uid; /* user id of the sending process */
gid_t gid; /* group id of the sending process */
};
補助メッセージはsendmsg()とrecvmsg()で送受信する。
JM Manpage of UNIXを参照のこと
/* enable receiving of the sender credentials */
setsockopt(udevd_sock, SOL_SOCKET, SO_PASSCRED, &feature_on, sizeof(feature_on));
return 0;
}
{
struct sockaddr_un saddr;
socklen_t addrlen;
const int feature_on = 1;
int retval;
memset(&saddr, 0x00, sizeof(saddr));
AF_LOCALはAF_UNIXと同じ
Windowsでも使うため一般的な名前としてAF_LOCALを使う
saddr.sun_family = AF_LOCAL;
先頭をNULL文字にすると抽象名前空間となる。
AF_UNIX(AF_LOCAL)ソケットでのみ使用できる。
抽象名前空間の実装はLinux2.2以降から。
JM Manpage of UNIXを参照のこと
/* use abstract namespace for socket path */
strcpy(&saddr.sun_path[1], UDEVD_CTRL_SOCK_PATH);
addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
if (udevd_sock == -1) {
err("error getting socket: %s", strerror(errno));
return -1;
}
/* the bind takes care of ensuring only one copy running */
retval = bind(udevd_sock, (struct sockaddr *) &saddr, addrlen);
if (retval < 0) {
err("bind failed: %s", strerror(errno));
close(udevd_sock);
udevd_sock = -1;
return -1;
}
SO_PASSCREDはmsgの補助メッセージとして信任状を受信できるようにする。
信任状は以下の型
struct ucred {
pid_t pid; /* process id of the sending process */
uid_t uid; /* user id of the sending process */
gid_t gid; /* group id of the sending process */
};
補助メッセージはsendmsg()とrecvmsg()で送受信する。
JM Manpage of UNIXを参照のこと
/* enable receiving of the sender credentials */
setsockopt(udevd_sock, SOL_SOCKET, SO_PASSCRED, &feature_on, sizeof(feature_on));
return 0;
}
0 件のコメント:
コメントを投稿