X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/82ba25cfeb78751b8218c72f1685998d28004efc..971e56892e36f3351b123200dc1df5b7845aebd7:/server/servutil.c diff --git a/server/servutil.c b/server/servutil.c index e4772c4c..b6fbf5b8 100644 --- a/server/servutil.c +++ b/server/servutil.c @@ -121,4 +121,69 @@ int mystrieq(const char *x, const char *y) } } +/*----- Address handling --------------------------------------------------*/ + +const struct addrfam aftab[] = { +#define DEF(af) { AF_##af, #af }, + ADDRFAM(DEF) +#undef DEF +}; + +/* --- @afix@ --- * + * + * Arguments: @int af@ = an address family code + * + * Returns: The index of the address family's record in @aftab@, or @-1@. + */ + +int afix(int af) +{ + int i; + + for (i = 0; i < NADDRFAM; i++) + if (af == aftab[i].af) return (i); + return (-1); +} + +/* --- @addrsz@ --- * + * + * Arguments: @const addr *a@ = a network address + * + * Returns: The size of the address, for passing into the sockets API. + */ + +socklen_t addrsz(const addr *a) +{ + switch (a->sa.sa_family) { + case AF_INET: return (sizeof(a->sin)); + default: abort(); + } +} + +/* --- @getport@, @setport@ --- * + * + * Arguments: @addr *a@ = a network address + * @unsigned port@ = port number to set + * + * Returns: --- + * + * Use: Retrieves or sets the port number in an address structure. + */ + +unsigned getport(addr *a) +{ + switch (a->sa.sa_family) { + case AF_INET: return (ntohs(a->sin.sin_port)); break; + default: abort(); + } +} + +void setport(addr *a, unsigned port) +{ + switch (a->sa.sa_family) { + case AF_INET: a->sin.sin_port = htons(port); break; + default: abort(); + } +} + /*----- That's all, folks -------------------------------------------------*/