2007年4月26日木曜日

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

■ 参考資料

JM Manpage of UNIX
JM Manpage of SEND
JM Manpage of RECV

0 件のコメント: