我已经编写了一对TCP客户端/服务器,每个客户端/服务器在另一个上调用getpeerucred
,然后调用ucred_getprojid
打印出他们各自对等方的项目ID。我看到以下结果:
在任何不同的区域内(全局或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
使用两个不同标记的区域启用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
服务器(名为-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