26
26
#include <stdlib.h>
27
27
#include <errno.h>
28
28
#include <stdio.h>
29
+ #ifdef HAVE_STRING_H
30
+ #include <string.h>
31
+ #endif
29
32
30
33
#ifndef MAXPATHLEN
31
34
#warning no system max path length detected
@@ -87,6 +90,7 @@ main(int argc, char **argv) {
87
90
exit (1 );
88
91
}
89
92
93
+ #if defined(SO_PASSCRED )
90
94
/* set the SO_PASSCRED option so we can pass uid */
91
95
/* XXX: according to the unix(1) manual this shouldn't be needed
92
96
on the sending side? */
@@ -95,6 +99,15 @@ main(int argc, char **argv) {
95
99
setsockopt (sock , SOL_SOCKET , SO_PASSCRED , (void * ) & one ,
96
100
sizeof (one ));
97
101
}
102
+ #elif defined(LOCAL_CREDS )
103
+ {
104
+ int one = 1 ;
105
+ setsockopt (sock , SOL_SOCKET , LOCAL_CREDS , (void * ) & one ,
106
+ sizeof (one ));
107
+ }
108
+ #else
109
+ #error Cannot pass credentials
110
+ #endif
98
111
99
112
if (connect (sock , (struct sockaddr * ) & addr ,
100
113
sizeof (struct sockaddr_un )) != 0 ) {
@@ -124,21 +137,36 @@ main(int argc, char **argv) {
124
137
{
125
138
struct msghdr msg = { 0 };
126
139
struct iovec iov = { buf , buf_len };
127
- struct ucred ouruser = { 0 };
128
140
struct cmsghdr * cmsg ;
129
- char cmsgbuf [CMSG_SPACE (sizeof (ouruser ))];
141
+ #if defined(SCM_CREDENTIALS )
142
+ struct ucred ouruser = { 0 };
143
+ char cmsgbuf [sizeof (ouruser )];
130
144
131
145
ouruser .uid = getuid ();
132
146
ouruser .gid = getgid ();
133
147
ouruser .pid = getpid ();
148
+ #elif defined(SCM_CREDS )
149
+ struct cmsgcred ouruser = { 0 };
150
+ char cmsgbuf [2 * 4096 ];
151
+
152
+ ouruser .cmcred_uid = getuid ();
153
+ ouruser .cmcred_gid = getgid ();
154
+ ouruser .cmcred_pid = getpid ();
155
+ #else
156
+ #error cannot encode credentials
157
+ #endif
134
158
135
159
msg .msg_control = cmsgbuf ;
136
160
msg .msg_controllen = sizeof (cmsgbuf );
137
161
138
162
cmsg = CMSG_FIRSTHDR (& msg );
139
163
cmsg -> cmsg_len = CMSG_LEN (sizeof (ouruser ));
140
164
cmsg -> cmsg_level = SOL_SOCKET ;
141
- cmsg -> cmsg_type = SCM_CREDENTIALS ;
165
+ #if defined(SCM_CREDENTIALS )
166
+ cmsg -> cmsg_type = SCM_CREDENTIALS ;
167
+ #elif defined(SCM_CREDS )
168
+ cmsg -> cmsg_type = SCM_CREDS ;
169
+ #endif
142
170
memcpy (CMSG_DATA (cmsg ), & ouruser , sizeof (ouruser ));
143
171
144
172
msg .msg_name = NULL ;
0 commit comments