27#include <netinet/in.h>
31#include <sys/socket.h>
42static char ipv4mapprefix[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff};
58 if ((fdflags = ofdflags =
fcntl(fd, F_GETFL, 0)) == -1) {
63 fdflags |= O_NONBLOCK;
65 fdflags &= ~O_NONBLOCK;
68 if (fdflags != ofdflags)
69 if (
fcntl(fd, F_SETFL, fdflags) == -1) {
88ssize_t
readt(
int socket,
void *
data,
const size_t length,
int setnonblocking,
93 struct timeval
now, end, tv;
106 (void)gettimeofday(&
now, NULL);
108 end.tv_sec += timeout;
111 while (stored < length) {
112 len =
recv(socket, (
char *)
data + stored, length - stored, 0);
120 if (socket >= FD_SETSIZE) {
125 FD_SET(socket, &rfds);
132 while ((ret =
select(socket + 1, &rfds, NULL, NULL,
133 timeout ? &tv : NULL)) < 1) {
144 (void)gettimeofday(&
now, NULL);
146 if (
now.tv_sec > end.tv_sec
148 (
now.tv_sec == end.tv_sec &&
now.tv_usec >= end.tv_usec)) {
153 if (
now.tv_usec > end.tv_usec) {
154 tv.tv_usec = 1000000 + end.tv_usec -
now.tv_usec;
155 tv.tv_sec = end.tv_sec -
now.tv_sec - 1;
157 tv.tv_usec = end.tv_usec -
now.tv_usec;
158 tv.tv_sec = end.tv_sec -
now.tv_sec;
162 FD_SET(socket, &rfds);
195 if (setnonblocking) {
201 if (len == -1 && stored == 0)
222ssize_t
writet(
int socket,
void *
data,
const size_t length,
int setnonblocking,
227 struct timeval
now, end, tv;
231 if (setnonblocking) {
238 (void)gettimeofday(&
now, NULL);
240 end.tv_sec += timeout;
242 while (stored < length) {
243 len =
write(socket, (
char *)
data + stored, length - stored);
251 if (socket >= FD_SETSIZE) {
257 FD_SET(socket, &rfds);
261 while ((ret =
select(socket + 1, &rfds, NULL, NULL, &tv)) < 1) {
268 if (errno == EINTR) {
269 (void)gettimeofday(&
now, NULL);
271 if (
now.tv_sec >= end.tv_sec &&
now.tv_usec >= end.tv_usec) {
276 if (
now.tv_usec > end.tv_usec) {
277 tv.tv_usec = 1000000 + end.tv_usec -
now.tv_usec;
278 tv.tv_sec = end.tv_sec -
now.tv_sec - 1;
280 tv.tv_usec = end.tv_usec -
now.tv_usec;
281 tv.tv_sec = end.tv_sec -
now.tv_sec;
285 FD_SET(socket, &rfds);
311 if (setnonblocking) {
317 if (len == -1 && stored == 0)
339 static char ip4[INET_ADDRSTRLEN];
340 static char ip6[INET6_ADDRSTRLEN];
342 switch (
sa->sa_family) {
344 const struct sockaddr_in *sai4 = (
const struct sockaddr_in *)
sa;
346 if ((inet_ntop(AF_INET, &(sai4->sin_addr), ip4, INET_ADDRSTRLEN)) == NULL) {
354 const struct sockaddr_in6 *sai6 = (
const struct sockaddr_in6 *)
sa;
356 if ((inet_ntop(AF_INET6, &(sai6->sin6_addr), ip6, INET6_ADDRSTRLEN)) == NULL) {
363 return strrchr(ip6,
':') + 1;
370 return "getip_string ERROR";
385 if (
sa->sa_family == AF_INET) {
386 const struct sockaddr_in *sai4 = (
const struct sockaddr_in *)
sa;
387 return ntohs(sai4->sin_port);
389 const struct sockaddr_in6 *sai6 = (
const struct sockaddr_in6 *)
sa;
390 return ntohs(sai6->sin6_port);
409 switch (
sa->sa_family) {
415 struct sockaddr_in *
si = (
struct sockaddr_in *)
sa;
417 uint32_t nmask =
mask ? ~((1 << (32 -
mask)) - 1) : 0;
418 si->sin_addr.s_addr &= htonl(nmask);
427 int i, maskbytes, maskbits;
428 struct sockaddr_in6 *si6 = (
struct sockaddr_in6 *)
sa;
440 maskbytes = (128 -
mask) / 8;
443 for (i = maskbytes - 1; i >= 0; i--) {
444 si6->sin6_addr.s6_addr[15 - i] = 0;
448 si6->sin6_addr.s6_addr[15 - maskbytes] &= ~((1 << (8 - maskbits)) - 1);
470int compare_ip(
const struct sockaddr *sa1,
const struct sockaddr *sa2)
477 ret = strcmp(ip1, ip2);
512 if (!strchr(
p,
':')) {
522 if (strchr(
p,
'.')) {
545 if ((s = strchr(*address,
']')) == NULL) {
668 numafter *
sizeof(
struct pollfd));
683#define CMSG_SPACE(len) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(len))
697 struct cmsghdr *cmsgp = NULL;
700 struct pollfd pollfds[1];
702 pollfds[0].events = POLLIN;
703 memset(&msgh, 0,
sizeof(msgh));
704 memset(
buf, 0,
sizeof(
buf));
705 msgh.msg_name = NULL;
706 msgh.msg_namelen = 0;
709 iov[0].iov_base = dbuf;
710 iov[0].iov_len =
sizeof(dbuf);
711 msgh.msg_control =
buf;
712 msgh.msg_controllen =
sizeof(
buf);
717 ret = poll(pollfds, 1, 2000);
718 }
while (ret == -1 && errno == EINTR);
724 ret = recvmsg(fd, &msgh, 0);
727 ret = recvmsg(fd, &msgh, 0);
728 }
while (ret == -1 && errno == EINTR);
735 for (cmsgp = CMSG_FIRSTHDR(&msgh); cmsgp != NULL;
736 cmsgp = CMSG_NXTHDR(&msgh, cmsgp)) {
737 if (cmsgp->cmsg_level == SOL_SOCKET && cmsgp->cmsg_type == SCM_RIGHTS) {
738 return *(
int *) CMSG_DATA(cmsgp);
742 if (ret ==
sizeof(
int)) {
744 errno = *(
int *)dbuf;
761 struct cmsghdr *cmsgp = NULL;
773 memset(&msgh, 0,
sizeof(msgh));
774 memset(
buf, 0, size);
775 msgh.msg_name = NULL;
776 msgh.msg_namelen = 0;
779 iov[0].iov_base = &er;
780 iov[0].iov_len =
sizeof(er);
781 msgh.msg_control =
buf;
782 msgh.msg_controllen = size;
783 cmsgp = CMSG_FIRSTHDR(&msgh);
784 cmsgp->cmsg_level = SOL_SOCKET;
785 cmsgp->cmsg_type = SCM_RIGHTS;
786 cmsgp->cmsg_len =
CMSG_LEN(
sizeof(fd));
787 *((
int *)CMSG_DATA(cmsgp)) = fd;
788 msgh.msg_controllen = cmsgp->cmsg_len;
791 ret = sendmsg(socket, &msgh, 0);
792 }
while (ret == -1 && errno == EINTR);
static char buf[MAXPATHLEN+1]
Definition afppasswd.c:85
static struct savedt sa
Definition appl.c:32
static struct savedt si
Definition desktop.c:307
size_t p
Definition dircache.c:306
#define EC_CLEANUP
Definition errchk.h:28
#define EC_EXIT_STATUS(a)
Definition errchk.h:20
#define EC_INIT
Definition errchk.h:18
#define EC_EXIT
Definition errchk.h:29
#define EC_NULL(a)
Definition errchk.h:168
#define EC_FAIL
Definition errchk.h:21
#define data
Definition hash.c:52
#define mask
Definition hash.c:66
Netatalk utility functions.
asev_fdtype
Definition include/atalk/util.h:187
#define AFP_ASSERT(b)
Definition include/atalk/util.h:55
#define LOG(log_level, type,...)
Definition logger.h:148
@ logtype_cnid
Definition logger.h:36
@ logtype_dsi
Definition logger.h:38
@ logtype_afpd
Definition logger.h:37
@ log_warning
Definition logger.h:21
@ log_error
Definition logger.h:20
@ log_debug
Definition logger.h:24
static long now(void)
Definition macip.c:191
static unsigned char port
Definition pap.c:534
ssize_t readt(int socket, void *data, const size_t length, int setnonblocking, int timeout)
non-blocking drop-in replacement for read with timeout using select
Definition socket.c:88
const char * getip_string(const struct sockaddr *sa)
convert an IPv4 or IPv6 address to a static string using inet_ntop
Definition socket.c:337
static char ipv4mapprefix[]
Definition socket.c:42
int compare_ip(const struct sockaddr *sa1, const struct sockaddr *sa2)
compare IP addresses for equality
Definition socket.c:470
bool asev_add_fd(struct asev *asev, int fd, enum asev_fdtype fdtype, void *private, int protocol)
Add a fd to a dynamic pollfd array and associated data array.
Definition socket.c:604
bool asev_del_fd(struct asev *asev, int fd)
Remove fd from asev.
Definition socket.c:632
int tokenize_ip_port(const char *ipurl, char **address, char **port)
Tokenize IP(4/6) addresses with an optional port into address and port.
Definition socket.c:502
#define CMSG_SPACE(len)
Definition socket.c:683
unsigned int getip_port(const struct sockaddr *sa)
return port number from struct sockaddr
Definition socket.c:383
struct asev * asev_init(int max)
Definition socket.c:574
void apply_ip_mask(struct sockaddr *sa, int mask)
apply netmask to IP (v4 or v6)
Definition socket.c:407
int send_fd(int socket, int fd)
Definition socket.c:756
ssize_t writet(int socket, void *data, const size_t length, int setnonblocking, int timeout)
non-blocking drop-in replacement for read with timeout using select
Definition socket.c:222
int recv_fd(int fd, int nonblocking)
Receive a fd on a suitable socket.
Definition socket.c:692
int setnonblock(int fd, int cmd)
set or unset non-blocking IO on a fd
Definition socket.c:53
atalk socket event data
Definition include/atalk/util.h:192
int protocol
Definition include/atalk/util.h:196
enum asev_fdtype fdtype
Definition include/atalk/util.h:193
void * private
Definition include/atalk/util.h:194
atalk socket event
Definition include/atalk/util.h:202
int max
Definition include/atalk/util.h:205
int used
Definition include/atalk/util.h:206
struct asev_data * data
Definition include/atalk/util.h:204
struct pollfd * fdset
Definition include/atalk/util.h:203
#define fcntl
Definition test_afppasswd.c:47
#define write
Definition test_migrate.c:41
#define select
Definition test_socket_helpers.c:40
#define recv
Definition test_socket_helpers.c:39
#define CMSG_LEN(len)
Definition usockfd.h:31