1

X サーバーに接続するための独自のコードを作成しようとしています。xauth を実行して必要なマジック クッキーを取得し、次のコードを記述して接続の確立をテストしました。

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main()
{  
  int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

  struct sockaddr_un serv_addr;
  memset((void*)&serv_addr, 0, sizeof(serv_addr));
  serv_addr.sun_family = AF_UNIX;
  strcpy(serv_addr.sun_path, "/tmp/.X11-unix/X0");
  int servlen = 17 + sizeof(serv_addr.sun_family);

  int err = connect(sockfd, (struct sockaddr*)&serv_addr, servlen);

  char arr[] = {108, 0, // 'l' for little-endian
                11, 0, // X version
                0, 0,  // X minor version
                18, 0, // length of auth protocol name
                16, 0, // length of auth protocol data
                0, 0, // padding
                77, 73, 84, 45, 77, 65, 71, 73, 67, 45, 67, 79, 79, 75, 73, 69, 45, 49, // MIT-MAGIC-COOKIE-1
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                223, 88, 218, 121, 215, 6, 185, 105, 137, 80, 105, 252, 49, 109, 38,  200, // data from .Xauthority
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

  ssize_t bytes_written = write(sockfd, arr, sizeof(arr));
  printf("%d\n", bytes_written);

  uint8_t buf[5000];
  ssize_t bytes_read = read(sockfd, buf, 5000);
  printf("%d\n", bytes_read);

  unsigned char k;
  for(k = 0; k < 40; k++) {
    printf("%c", buf[k]);
  }
  return 0;
}

X サーバーは問題なく応答しますが、理由として「無効な MIT-MAGIC-COOKIE-1 キー」という認証失敗メッセージが表示されます。私が与えているキーは、.Xauthority ファイル (df58da79d706b969895069fc316d26c8、誰かがチェックしたい場合に備えて!) のものと同じです。

4

1 に答える 1