Solaris 11.3 ucred_getprojid行为不正确?

时间:2016-04-22 07:44:13

标签: solaris

我已经编写了一对TCP客户端/服务器,每个客户端/服务器在另一个上调用getpeerucred,然后调用ucred_getprojid打印出他们各自对等方的项目ID。我看到以下结果:

  1. 在任何不同的区域内(全局或zlogin到任何单个区域),客户端/服务器对都会报告来自其对等方的正确项目ID。

      

    #/ usr / bin / id -p
      uid = 0(root)gid = 0(root)projid = 1(user.root)
      #./bind 5000
      绑定到港口:5000
      项目编号:10
      ---------------
      $ / usr / bin / id -p
      uid = 100(rpaisley)gid = 10(staff)projid = 10(group.staff)
      $ ./connect 127.0.0.1 5000
      项目编号:1

  2. 使用两个不同标记的区域启用Trusted Extensions(如果存在任何支配关系似乎无关紧要,相同的行为适用),则跨多级端口报告{{ 1}}既不正确,也不是ucred_getprojid手册页中声明项目ID不可用的0

      

    #/ usr / bin / id -p
      uid = 0(root)gid = 0(root)projid = 1(user.root)
      #。/ bin/bind 2000
      绑定到港口:2000
      项目编号:0
      ---------------
      $ / usr / bin / id -p
      uid = 100(rpaisley)gid = 10(staff)projid = 10(group.staff)
      $ ./bin/connect 10.10.10.1 2000
      项目编号:0

  3. 服务器(名为-1)的源代码如下。计划需要bind

    -ltsol -lsocket -lnsl

    客户端的源代码(名为#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <ucred.h> #include <unistd.h> int main(int argc, char **argv) { if(2 != argc) { fprintf(stderr, "Usage: %s <port>\n", *argv); return EXIT_FAILURE; } int port; char unused; if(1 != sscanf(argv[1], "%d%c", &port, &unused)) { fprintf(stderr, "Failed to parse port: %s\n", argv[1]); return EXIT_FAILURE; } int s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if(-1 == s) { perror("socket"); return EXIT_FAILURE; } struct sockaddr_in local; memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; local.sin_addr.s_addr = htonl(INADDR_ANY); local.sin_port = htons(port); printf("Binding to port: %d\n", port); if(-1 == bind(s, (struct sockaddr *)&local, sizeof(local))) { perror("bind"); close(s); return EXIT_FAILURE; } if(-1 == listen(s, 1)) { perror("listen"); close(s); return EXIT_FAILURE; } int c; struct sockaddr_in client; unsigned int clientlen = sizeof(client); c = accept(s, (struct sockaddr *)&client, &clientlen); if(-1 == c) { perror("accept"); close(s); return EXIT_FAILURE; } close(s); ucred_t *cred = NULL; if(-1 == getpeerucred(c, &cred)) { perror("getpeerucred"); close(c); return EXIT_FAILURE; } printf("project id: %d\n", ucred_getprojid(cred)); ucred_free(cred); close(c); return EXIT_SUCCESS; } )程序需要connect

    -ltsol -lsocket -lnsl

0 个答案:

没有答案