- 论坛徽章:
- 1
|
都用root用户测试
这是client发送凭证代码:
#define CONTROL_LEN (sizeof(struct cmsghdr) + sizeof(struct ucred))
ssize_t write_cred(int fd, void *ptr, size_t nbytes){
52
53
54 struct ucred *credp = NULL;
55 struct msghdr msg;
56 struct iovec iov[1];
57 struct cmsghdr *cmptr = NULL;
58 int n;
59
60
61
62 if ((cmptr = malloc(CONTROL_LEN)) == NULL)
63 return (-1);
64
65 msg.msg_name = NULL;
66 msg.msg_namelen = 0;
67 iov[0].iov_base = ptr;
68 iov[0].iov_len = nbytes;
69 msg.msg_iov = iov;
70 msg.msg_iovlen = 1;
71 msg.msg_control = cmptr;
72 msg.msg_controllen = CONTROL_LEN;
73 msg.msg_flags = 0;
74
75 cmptr->cmsg_level = SOL_SOCKET;
76 cmptr->cmsg_type = SCM_CREDENTIALS;
77 cmptr->cmsg_len = CMSG_LEN(sizeof(struct ucred));
78
79 credp = (struct ucred *)CMSG_DATA(cmptr);
80
81 credp->uid = geteuid();
82 credp->gid = getegid();
83 credp->pid = getpid();
84
85
86 n = sendmsg(fd, &msg, 0); // gdb 调试到这里一切正常 msg的各个部分都被设置了
87
88 return n;
89 }
这是server的接收凭证的代码:
ssize_t read_cred(int fd, void *ptr, size_t nbytes, struct ucred *ucredptr){
102
103 struct msghdr msg;
104 struct iovec iov[1];
105 struct cmsghdr *cmptr;
106 char control[CONTROL_LEN];
107 int n;
108
109 msg.msg_name = NULL;
110 msg.msg_namelen = 0;
111 iov[0].iov_base = ptr;
112 iov[0].iov_len = nbytes;
113 msg.msg_iov = iov;
114 msg.msg_iovlen = 1;
115 msg.msg_control = control;
116 msg.msg_controllen = CONTROL_LEN;
117 msg.msg_flags = 0;
118
119 if ((n = recvmsg(fd, &msg, 0)) < 0) //在这里返回时n是正确的 但msg_controllen 被设置为0!疑问???????
120 return n;
121
122
123 if (ucredptr != NULL && msg.msg_controllen > 0){
124 cmptr = (struct cmsghdr *)control;
125
126 if (cmptr->cmsg_len < CONTROL_LEN)
127 err_quit("control length = %d", cmptr->cmsg_len);
128
129 if (cmptr->cmsg_level != SOL_SOCKET)
130 err_quit("control level != SOL_SOCKET");
131
132 if (cmptr->cmsg_type != SCM_CREDENTIALS);
133 err_quit("control type != SCM_CREDENTIALS");
134 //ucredptr = (struct ucred *)CMSG_DATA(cmptr);
135
136 memcpy(ucredptr, CMSG_DATA(cmptr), sizeof(struct ucred));
137 }
138
139 return n; |
|