The damn thing finished. Let's see what it did.
authorArt Cancro <ajc@citadel.org>
Sat, 6 Jan 2024 00:01:38 +0000 (19:01 -0500)
committerArt Cancro <ajc@citadel.org>
Sat, 6 Jan 2024 00:01:38 +0000 (19:01 -0500)
citadel/server/locate_host.c

index 635862f41b952e2a95ea732bae43064ec75f84e3..5ed4c3ea1ef743c2d5057efdc1a818e7934c2eb7 100644 (file)
@@ -1,6 +1,6 @@
 // Functions which handle hostname/address lookups and resolution
 //
-// Copyright (c) 1987-2023 by the citadel.org team
+// Copyright (c) 1987-2024 by the citadel.org team
 //
 // This program is open source software.  Use, duplication, or disclosure
 // is subject to the terms of the GNU General Public License, version 3.
@@ -28,7 +28,7 @@
 #include "domain.h"
 #include "locate_host.h"
 
-/* START: some missing macros on OpenBSD 3.9 */
+// START: some missing macros on OpenBSD 3.9
 #ifndef NS_CMPRSFLGS
 #define NS_CMPRSFLGS   0xc0
 #endif
 #ifndef NS_GET16
 #  define NS_GET16 GETSHORT
 #endif
-/* END: some missing macros on OpenBSD 3.9 */
+// END: some missing macros on OpenBSD 3.9
 
 
-/*
- * Given an open client socket, return the host name and IP address at the other end.
- * (IPv4 and IPv6 compatible)
- */
-void locate_host(char *tbuf, size_t n, char *abuf, size_t na, int client_socket)
-{
+// Given an open client socket, return the host name and IP address at the other end.
+// (IPv4 and IPv6 compatible)
+void locate_host(char *tbuf, size_t n, char *abuf, size_t na, int client_socket) {
        struct sockaddr_in6 clientaddr;
        unsigned int addrlen = sizeof(clientaddr);
 
@@ -61,11 +58,10 @@ void locate_host(char *tbuf, size_t n, char *abuf, size_t na, int client_socket)
        getnameinfo((struct sockaddr *)&clientaddr, addrlen, tbuf, n, NULL, 0, 0);
        getnameinfo((struct sockaddr *)&clientaddr, addrlen, abuf, na, NULL, 0, NI_NUMERICHOST);
 
-       /* Convert IPv6-mapped IPv4 addresses back to traditional dotted quad.
-        *
-        * Other code here, such as the RBL check, will expect IPv4 addresses to be represented
-        * as dotted-quad, even if they come in over a hybrid IPv6/IPv4 socket.
-        */
+       // Convert IPv6-mapped IPv4 addresses back to traditional dotted quad.
+       //
+       // Other code here, such as the RBL check, will expect IPv4 addresses to be represented
+       // as dotted-quad, even if they come in over a hybrid IPv6/IPv4 socket.
        if ( (strlen(abuf) > 7) && (!strncasecmp(abuf, "::ffff:", 7)) ) {
                if (!strcmp(abuf, tbuf)) strcpy(tbuf, &tbuf[7]);
                strcpy(abuf, &abuf[7]);
@@ -73,10 +69,8 @@ void locate_host(char *tbuf, size_t n, char *abuf, size_t na, int client_socket)
 }
 
 
-/*
- * RBL check written by Edward S. Marshall [http://rblcheck.sourceforge.net]
- */
-#define RESULT_SIZE 4096 /* What is the longest result text we support? */
+// RBL check written by Edward S. Marshall [http://rblcheck.sourceforge.net]
+#define RESULT_SIZE 4096 // What is the longest result text we support?
 int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
        int a, b, c;
        char *result = NULL;
@@ -91,12 +85,12 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
        char *p = NULL;
        static int res_initted = 0;
 
-       if (!res_initted) {             /* only have to do this once */
+       if (!res_initted) {             // only have to do this once
                res_init();
                res_initted = 1;
        }
 
-       /* Make our DNS query. */
+       // Make our DNS query.
        answer = fixedans;
        if (server_shutting_down) {
                if (txtbuf != NULL) {
@@ -106,7 +100,7 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
        }
        len = res_query(domain, C_IN, T_A, answer, PACKETSZ);
 
-       /* Was there a problem? If so, the domain doesn't exist. */
+       // Was there a problem? If so, the domain doesn't exist.
        if (len == -1) {
                if (txtbuf != NULL) {
                        strcpy(txtbuf, "");
@@ -137,10 +131,9 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
        result = (char *) malloc(RESULT_SIZE);
        result[0] = '\0';
 
-       /* Make another DNS query for textual data; this shouldn't
-        * be a performance hit, since it'll now be cached at the
-        * nameserver we're using.
-        */
+       // Make another DNS query for textual data; this shouldn't
+       // be a performance hit, since it'll now be cached at the
+       // nameserver we're using.
        len = res_query(domain, C_IN, T_TXT, answer, PACKETSZ);
        if (server_shutting_down) {
                if (txtbuf != NULL) {
@@ -151,7 +144,7 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
                return (1);
        }
 
-       /* Just in case there's no TXT record... */
+       // Just in case there's no TXT record...
        if (len ==(-1)) {
                if (txtbuf != NULL) {
                        snprintf(txtbuf, txtbufsize, "Message rejected due to known spammer source IP address");
@@ -161,7 +154,7 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
                return(1);
        }
 
-       /* Skip the header and the address we queried. */
+       // Skip the header and the address we queried.
        cp = answer + sizeof( HEADER );
        while( *cp != '\0' ) {
                a = *cp++;
@@ -169,24 +162,22 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
                        cp++;
        }
 
-       /* This seems to be a bit of magic data that we need to
-        * skip. I wish there were good online documentation
-        * for programming for libresolv, so I'd know what I'm
-        * skipping here. Anyone reading this, feel free to
-        * enlighten me.
-        */
+       // This seems to be a bit of magic data that we need to
+       // skip. I wish there were good online documentation
+       // for programming for libresolv, so I'd know what I'm
+       // skipping here. Anyone reading this, feel free to
+       // enlighten me.
        cp += 1 + NS_INT16SZ + NS_INT32SZ;
 
-       /* Skip the type, class and ttl. */
+       // Skip the type, class and ttl.
        cp += (NS_INT16SZ * 2) + NS_INT32SZ;
 
-       /* Get the length and end of the buffer. */
+       // Get the length and end of the buffer.
        NS_GET16(c, cp);
        cend = cp + c;
 
-       /* Iterate over any multiple answers we might have. In
-        * this context, it's unlikely, but anyway.
-        */
+       // Iterate over any multiple answers we might have. In
+       // this context, it's unlikely, but anyway.
        rp = (u_char *) result;
        rend = (u_char *) result + RESULT_SIZE - 1;
        while (cp < cend && rp < rend) {
@@ -205,7 +196,7 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
                long len;
                len = snprintf(txtbuf, txtbufsize, "%s", result);
        
-               /* Remove nonprintable characters */
+               // Remove nonprintable characters
                for (p = txtbuf; *p != '\0'; p++) {
                        if (!isprint(*p)) {
                                memmove (p,
@@ -220,12 +211,9 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) {
 }
 
 
-/*
- * Check to see if the client host is on some sort of spam list (RBL)
- * If spammer, returns nonzero and places reason in 'message_to_spammer'
- */
-int rbl_check(char *cs_addr, char *message_to_spammer)
-{
+// Check to see if the client host is on some sort of spam list (RBL)
+// If spammer, returns nonzero and places reason in 'message_to_spammer'
+int rbl_check(char *cs_addr, char *message_to_spammer) {
        char tbuf[256] = "";
        int suffix_pos = 0;
        int rbl;
@@ -238,7 +226,7 @@ int rbl_check(char *cs_addr, char *message_to_spammer)
 
        rc = 0;
        strcpy(message_to_spammer, "ok");
-       gettimeofday(&tx_start, NULL);          /* start a stopwatch for performance timing */
+       gettimeofday(&tx_start, NULL);          // start a stopwatch for performance timing
 
        if ((strchr(cs_addr, '.')) && (!strchr(cs_addr, ':'))) {
                int a1, a2, a3, a4;
@@ -253,17 +241,17 @@ int rbl_check(char *cs_addr, char *message_to_spammer)
                char workbuf[sizeof tbuf];
                char *ptr;
 
-               /* tedious code to expand and reverse an IPv6 address */
+               // tedious code to expand and reverse an IPv6 address
                safestrncpy(tbuf, cs_addr, sizeof tbuf);
                num_colons = haschar(tbuf, ':');
                if ((num_colons < 2) || (num_colons > 7))
-                       goto finish_rbl;        /* badly formed address */
+                       goto finish_rbl;        // badly formed address
 
-               /* expand the "::" shorthand */
+               // expand the "::" shorthand
                while (num_colons < 7) {
                        ptr = strstr(tbuf, "::");
                        if (!ptr)
-                               goto finish_rbl;                                /* badly formed address */
+                               goto finish_rbl;                                // badly formed address
 
                        ++ptr;
                        strcpy(workbuf, ptr);
@@ -272,7 +260,7 @@ int rbl_check(char *cs_addr, char *message_to_spammer)
                        ++num_colons;
                }
 
-               /* expand to 32 hex characters with no colons */
+               // expand to 32 hex characters with no colons
                strcpy(workbuf, tbuf);
                strcpy(tbuf, "00000000000000000000000000000000");
                for (i=0; i<8; ++i) {
@@ -284,7 +272,7 @@ int rbl_check(char *cs_addr, char *message_to_spammer)
                        goto finish_rbl;
                }
 
-               /* now reverse it and add dots */
+               // now reverse it and add dots
                strcpy(workbuf, tbuf);
                for (i=0; i<32; ++i) {
                        tbuf[i*2] = workbuf[31-i];
@@ -294,17 +282,17 @@ int rbl_check(char *cs_addr, char *message_to_spammer)
                suffix_pos = 64;
        }
        else {
-               goto finish_rbl;        /* unknown address format */
+               goto finish_rbl;        // unknown address format
        }
 
-       /* See if we have any RBL domains configured */
+       // See if we have any RBL domains configured
        num_rbl = get_hosts(rbl_domains, "rbl");
        if (num_rbl < 1)
        {
                goto finish_rbl;
        }
 
-       /* Try all configured RBL's */
+       // Try all configured RBL's
         for (rbl=0; rbl<num_rbl; ++rbl) {
                 extract_token(&tbuf[suffix_pos], rbl_domains, rbl, '|', (sizeof tbuf - suffix_pos));
 
@@ -315,7 +303,7 @@ int rbl_check(char *cs_addr, char *message_to_spammer)
                }
        }
 finish_rbl:
-       /* How long did this transaction take? */
+       // How long did this transaction take?
        gettimeofday(&tx_finish, NULL);
 
        syslog(LOG_WARNING, "rbl: %s [%ld.%06ld] %s",
@@ -329,12 +317,10 @@ finish_rbl:
 }
                        
 
-/*
- * Convert a host name to a dotted quad address. 
- * Returns zero on success or nonzero on failure.
- *
- * FIXME this is obviously not IPv6 compatible.
- */
+// Convert a host name to a dotted quad address. 
+// Returns zero on success or nonzero on failure.
+//
+// FIXME this is obviously not IPv6 compatible.
 int hostname_to_dotted_quad(char *addr, char *host) {
        struct hostent *ch;
        const char *i;