summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/sock_any.c36
-rw-r--r--common/sock_any.h3
2 files changed, 38 insertions, 1 deletions
diff --git a/common/sock_any.c b/common/sock_any.c
index 7a128f2..acac8ee 100644
--- a/common/sock_any.c
+++ b/common/sock_any.c
@@ -237,3 +237,39 @@ int sock_any_pton(const char* addr, struct sockaddr_any* any, int defport)
return -1;
}
+int sock_any_ntop(struct sockaddr_any* any, char* addr, size_t addrlen)
+{
+ int len = 0;
+
+ switch(any->s.a.sa_family)
+ {
+ case AF_UNIX:
+ len = strlen(any->s.un.sun_path);
+ if(addrlen < len + 1)
+ {
+ errno = ENOSPC;
+ return -1;
+ }
+
+ strcpy(addr, any->s.un.sun_path);
+ break;
+
+ case AF_INET:
+ if(inet_ntop(any->s.a.sa_family, &(any->s.in.sin_addr), addr, addrlen) == NULL)
+ return -1;
+ break;
+
+#ifdef HAVE_INET6
+ case AF_INET6:
+ if(inet_ntop(any->s.a.sa_family, &(any->s.in6.sin6_addr), addr, addrlen) == NULL)
+ return -1;
+ break;
+#endif
+
+ default:
+ errno = EAFNOSUPPORT;
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/common/sock_any.h b/common/sock_any.h
index 5d733b1..693bd2a 100644
--- a/common/sock_any.h
+++ b/common/sock_any.h
@@ -23,10 +23,11 @@ struct sockaddr_any
size_t namelen;
};
-#define SANY_ADDR(any) (&((any).s.a))
+#define SANY_ADDR(any) ((any).s.a)
#define SANY_LEN(any) ((any).namelen)
#define SANY_TYPE(any) ((any).s.a.sa_family)
int sock_any_pton(const char* addr, struct sockaddr_any* any, int defport);
+int sock_any_ntop(struct sockaddr_any* any, char* addr, size_t addrlen);
#endif /* __SOCK_ANY_H__ */