Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
#include
#include
#include
#include
#include
#include
#include
#include
#include
union fdmsg {
struct cmsghdr h;
char buf[CMSG_SPACE(sizeof(int))];
};
int main(int argc, char** argv) {
int lsock = socket(PF_UNIX, SOCK_STREAM, 0);
if(lsock == -1) {
printf("socket\n");
exit(1);
}
struct sockaddr_un addr;
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, "/home/chris/mysock");
int ret = connect(lsock, (struct sockaddr*)&addr, sizeof(addr.sun_family) + strlen(addr.sun_path));
if(ret == -1) {
printf("connect\n");
exit(1);
}
struct iovec iov;
struct msghdr msg;
char data;
union fdmsg cmsg;
struct cmsghdr* h;
msg.msg_control = cmsg.buf;
msg.msg_controllen = sizeof(union fdmsg);
msg.msg_name = 0;
msg.msg_namelen = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_flags = 0;
iov.iov_base = &data;
iov.iov_len = 1;
h = CMSG_FIRSTHDR(&msg);
h->cmsg_len = CMSG_LEN(sizeof(int));
h->cmsg_level = SOL_SOCKET;
h->cmsg_type = SCM_RIGHTS;
*((int*)CMSG_DATA(h)) = -1;
ret = recvmsg(lsock, &msg, 0);
if(ret <= 0) {
printf("recvmsg\n");
exit(1);
}
h = CMSG_FIRSTHDR(&msg);
// The website illustrating this process suggested the kernel might realloc
// our buffer, though this seems illogical.
int readfd = *((int*)CMSG_DATA(h));
printf("Successfully received file descriptor\n");
char* shm = mmap(0, 10, PROT_READ | PROT_WRITE, MAP_SHARED, readfd, 0);
if(shm == (char*)-1) {
printf("mmap\n");
exit(1);
}
printf("Got shared memory at %p\n", shm);
while(1) {
printf("SHM currently says: %s\nPress any key to re-read\n", shm);
getchar();
}
return 0;
}