mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-03 16:30:29 +00:00
Increased the size of the sun_path field in a sockaddr_un structure to match the standard of 108 characters. Modified the bind/connect/sendto to adjust to this change
This commit is contained in:
parent
f2b8cbdfb9
commit
5f2fce90e8
6 changed files with 41 additions and 19 deletions
|
@ -41,10 +41,10 @@ int bind(int fd, const void *addr, uint32_t addrsize) {
|
|||
if (!IsBsd()) {
|
||||
return sys_bind(fd, addr, addrsize);
|
||||
} else {
|
||||
struct sockaddr_in_bsd addr2;
|
||||
assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd));
|
||||
memcpy(&addr2, addr, sizeof(struct sockaddr_in));
|
||||
sockaddr2bsd(&addr2);
|
||||
char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */
|
||||
assert(addrsize <= sizeof(addr2));
|
||||
memcpy(&addr2, addr, addrsize);
|
||||
sockaddr2bsd(&addr2[0]);
|
||||
return sys_bind(fd, &addr2, addrsize);
|
||||
}
|
||||
} else if (__isfdkind(fd, kFdSocket)) {
|
||||
|
|
|
@ -23,14 +23,13 @@
|
|||
#include "libc/sysv/errfuns.h"
|
||||
|
||||
int sys_connect(int fd, const void *addr, uint32_t addrsize) {
|
||||
if (addrsize != sizeof(struct sockaddr_in)) return einval();
|
||||
if (!IsBsd()) {
|
||||
return __sys_connect(fd, addr, addrsize);
|
||||
} else {
|
||||
struct sockaddr_in_bsd addr2;
|
||||
assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd));
|
||||
memcpy(&addr2, addr, sizeof(struct sockaddr_in));
|
||||
sockaddr2bsd(&addr2);
|
||||
return sys_connect(fd, &addr2, addrsize);
|
||||
char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */
|
||||
assert(addrsize <= sizeof(addr2));
|
||||
memcpy(&addr2, addr, addrsize);
|
||||
sockaddr2bsd(&addr2[0]);
|
||||
return __sys_connect(fd, &addr2, addrsize);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ struct msghdr_bsd {
|
|||
struct sockaddr_un_bsd {
|
||||
uint8_t sun_len; /* sockaddr len including NUL on freebsd but excluding it on openbsd/xnu */
|
||||
uint8_t sun_family;
|
||||
char sun_path[14];
|
||||
char sun_path[108];
|
||||
};
|
||||
|
||||
struct SockFd {
|
||||
|
|
|
@ -47,16 +47,15 @@
|
|||
*/
|
||||
ssize_t sendto(int fd, const void *buf, size_t size, uint32_t flags,
|
||||
const void *opt_addr, uint32_t addrsize) {
|
||||
assert(sizeof(struct sockaddr_in) == sizeof(struct sockaddr_in_bsd));
|
||||
if (!IsWindows()) {
|
||||
if (!IsBsd() || !opt_addr) {
|
||||
return sys_sendto(fd, buf, size, flags, opt_addr, addrsize);
|
||||
} else {
|
||||
struct sockaddr_in_bsd addr2;
|
||||
if (addrsize != sizeof(addr2)) return einval();
|
||||
memcpy(&addr2, opt_addr, sizeof(struct sockaddr_in));
|
||||
sockaddr2bsd(&addr2);
|
||||
return sys_sendto(fd, buf, size, flags, &addr2, addrsize);
|
||||
char addr2[sizeof(struct sockaddr_un_bsd)]; /* sockaddr_un_bsd is the largest */
|
||||
if (addrsize > sizeof(addr2)) return einval();
|
||||
memcpy(&addr2, opt_addr, addrsize);
|
||||
sockaddr2bsd(&addr2[0]);
|
||||
return sys_sendto(fd, buf, size, flags, &addr2[0], addrsize);
|
||||
}
|
||||
} else if (__isfdkind(fd, kFdSocket)) {
|
||||
return sys_sendto_nt(&g_fds.p[fd], (struct iovec[]){{buf, size}}, 1, flags,
|
||||
|
|
|
@ -42,7 +42,7 @@ struct sockaddr_in { /* Linux+NT ABI */
|
|||
|
||||
struct sockaddr_un {
|
||||
uint16_t sun_family; /* AF_UNIX */
|
||||
char sun_path[14];/* path */
|
||||
char sun_path[108];/* path */
|
||||
};
|
||||
|
||||
struct sockaddr_storage {
|
||||
|
|
|
@ -75,7 +75,12 @@ static void __openlog() {
|
|||
log_fd = RegisterEventSourceA(NULL, log_ident);
|
||||
} else {
|
||||
log_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
|
||||
if (log_fd >= 0) connect(log_fd, (void *)&log_addr, sizeof(log_addr));
|
||||
if (log_fd >= 0) {
|
||||
int rc = connect(log_fd, (void *)&log_addr, sizeof(log_addr));
|
||||
if (rc < 0) {
|
||||
printf("ERR: connect(openlog) failed: %s (errno=%d)\n", strerror(errno), errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -147,6 +152,8 @@ void vsyslog(int priority, const char *message, va_list ap) {
|
|||
* - First try to send it to syslogd
|
||||
* - If fails and LOG_CONS is provided, writes to /dev/console
|
||||
*/
|
||||
|
||||
#if 0
|
||||
if (send(log_fd, buf, l, 0) < 0 && (!is_lost_conn(errno)
|
||||
|| connect(log_fd, (void *)&log_addr, sizeof(log_addr)) < 0
|
||||
|| send(log_fd, buf, l, 0) < 0)
|
||||
|
@ -157,6 +164,23 @@ void vsyslog(int priority, const char *message, va_list ap) {
|
|||
close(fd);
|
||||
}
|
||||
}
|
||||
#else
|
||||
int rc = send(log_fd, buf, l, 0);
|
||||
if (rc < 0) {
|
||||
printf("ERR: send(1) failed: %s (errno=%d)\n", strerror(errno), errno);
|
||||
if (!is_lost_conn(errno)) {
|
||||
rc = connect(log_fd, (void *)&log_addr, sizeof(log_addr));
|
||||
if (rc < 0) {
|
||||
printf("ERR: connect(syslog) failed: %s (errno=%d)\n", strerror(errno), errno);
|
||||
} else {
|
||||
rc = send(log_fd, buf, l, 0);
|
||||
if (rc < 0) {
|
||||
printf("ERR: send(2) failed: %s (errno=%d)\n", strerror(errno), errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
uint16_t evtType;
|
||||
uint32_t evtID;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue