+ if( len > PACKETSZ )
+ {
+ answer = malloc(len);
+ need_to_free_answer = 1;
+ len = res_query(domain, C_IN, T_A, answer, len);
+ if( len == -1 ) {
+ if (txtbuf != NULL) {
+ snprintf(txtbuf, txtbufsize,
+ "Message rejected due to known spammer source IP address");
+ }
+ if (need_to_free_answer) free(answer);
+ return(1);
+ }
+ }
+ if (server_shutting_down)
+ {
+ if (txtbuf != NULL)
+ snprintf(txtbuf, txtbufsize, "System shutting down");
+ if (need_to_free_answer) free(answer);
+ return (1);
+ }
+
+ 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.
+ */
+ len = res_query(domain, C_IN, T_TXT, answer, PACKETSZ);
+ if (server_shutting_down)
+ {
+ if (txtbuf != NULL) {
+ snprintf(txtbuf, txtbufsize, "System shutting down");
+ }
+ if (need_to_free_answer) free(answer);
+ free(result);
+ return (1);
+ }
+
+ /* 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");
+ }
+ if (need_to_free_answer) free(answer);
+ free(result);
+ return(1);
+ }
+
+ /* Skip the header and the address we queried. */
+ cp = answer + sizeof( HEADER );
+ while( *cp != '\0' )
+ {
+ a = *cp++;
+ while( a-- )
+ 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.
+ */
+ cp += 1 + NS_INT16SZ + NS_INT32SZ;