tidy up open_socket and explain need for abstract bind
This commit is contained in:
@@ -44,23 +44,28 @@ size_t strlcpy(char *dst, const char *src, size_t dsize)
|
||||
return(src - osrc - 1); /* count does not include NUL */
|
||||
}
|
||||
|
||||
int open_socket(char * pathname){
|
||||
|
||||
struct sockaddr_un addr;
|
||||
addr.sun_family = AF_UNIX;
|
||||
addr.sun_path[0] = '\0'; /* abstract path */
|
||||
strncpy(&addr.sun_path[1], pathname, sizeof(addr.sun_path) - 2);
|
||||
|
||||
int open_socket(struct sockaddr_un *addr, struct sockaddr_un * peer_addr) {
|
||||
int fd = socket(AF_LOCAL, SOCK_DGRAM, PF_LOCAL);
|
||||
if(fd < 0) {
|
||||
perror("socket");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if((bind(fd, (struct sockaddr *) &addr, sizeof addr)) < 0) {
|
||||
// local address is in the abstract namespace and ok to include
|
||||
// trailing nul bytes
|
||||
if((bind(fd, (struct sockaddr *) addr, sizeof (struct sockaddr_un))) < 0) {
|
||||
perror("bind");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// peer address is in the actual filesystem, so we need to pass
|
||||
// the real length
|
||||
int namelen = sizeof peer_addr->sun_family + strlen(peer_addr->sun_path);
|
||||
if((connect(fd, (struct sockaddr *) peer_addr, namelen)) < 0) {
|
||||
perror("connect");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
@@ -101,15 +106,19 @@ int main(int argc, char **argv)
|
||||
if(!iobuf) return 1;
|
||||
int iobuf_len = encode_args(iobuf, 1024, argc, argv);
|
||||
|
||||
int maxnamelen=sizeof (((struct sockaddr_un *) 0)->sun_path);
|
||||
char *sockname = calloc(maxnamelen, 1);
|
||||
|
||||
/* for sendmsg with peer address to work on the luad side, we need to
|
||||
* bind our connected docket on this side to something, so we create
|
||||
* a hopefully unique abstract name based on the pid and argv */
|
||||
|
||||
struct sockaddr_un my_addr = { AF_UNIX, "" };
|
||||
int maxnamelen = sizeof my_addr.sun_path;
|
||||
pid_t mypid = getpid();
|
||||
memcpy(sockname, (void *) &mypid, sizeof mypid);
|
||||
memcpy(sockname + sizeof mypid, iobuf, maxnamelen - sizeof mypid);
|
||||
memcpy(my_addr.sun_path + 1, (void *) &mypid, sizeof mypid);
|
||||
memcpy(my_addr.sun_path + 1 + sizeof mypid, iobuf, maxnamelen - sizeof mypid - 1);
|
||||
|
||||
struct sockaddr_un peer_addr = { AF_UNIX, "/tmp/mysock" };
|
||||
int socket = open_socket(sockname);
|
||||
connect(socket, (struct sockaddr *) &peer_addr, sizeof peer_addr);
|
||||
int socket = open_socket(&my_addr, &peer_addr);
|
||||
|
||||
struct msghdr msg = { 0 };
|
||||
struct cmsghdr *cmsg;
|
||||
|
||||
Reference in New Issue
Block a user