示例#1
0
int main( int argc, char **argv )
{
  Analysis *scmanal = new Analysis( 3, 2, 0, "", argc, argv );

  char output_comment[ 256 ];
  snprintf( output_comment, 256, "(%s) + (%s)", scmanal->get_comment( 0 ),
	    scmanal->get_comment( 1 ) );
  scmanal->set_comment( 2, output_comment );

  if ( scmanal->get_type( 0 ) != scmanal->get_type( 1 ) ) {
    fprintf( stderr, "%s: Input file types differ.\n", argv[ 0 ] );
    exit( 1 );
  }

  if ( scmanal->get_length( 0 ) != scmanal->get_length( 1 ) ) {
    fprintf( stderr, "%s: Input file sizes differ.\n", argv[ 0 ] );
    if ( scmanal->get_type( 0 ) != TIME_DOMAIN ) {
      exit( 1 );
    }
  }

  size_t length = MINVAL( scmanal->get_length( 0 ), scmanal->get_length( 1 ) );

  if ( (scmanal->get_begin( 0 ) != scmanal->get_begin( 1 ))
       || (scmanal->get_compl_begin( 0 ) != scmanal->get_compl_begin( 1 ))
       || (scmanal->get_compl_end( 0 ) != scmanal->get_compl_end( 1 ))) {
    fprintf( stderr, "%s: Input file spans differ.\n", argv[ 0 ] );
    exit( 1 );
  }

  if ( ( scmanal->get_end( 0 ) != scmanal->get_end( 1 ) )
       && ( scmanal->get_type( 0 ) != TIME_DOMAIN ) ) {
    fprintf( stderr, "%s: Input file ends differ.\n", argv[ 0 ] );
    exit( 1 );    
  }

  double min_end = MINVAL( scmanal->get_end( 0 ), scmanal->get_end( 1 ) );

  scmanal->set_type( 2, scmanal->get_type( 0 ) );
  scmanal->set_begin( 2, scmanal->get_begin( 0 ) );
  scmanal->set_end( 2, min_end );
  scmanal->set_compl_begin( 2, scmanal->get_compl_begin( 0 ) );
  scmanal->set_compl_end( 2, scmanal->get_compl_end( 0 ) );

  scmanal->make_outputs( length );
  double
    *input_1 = scmanal->get_file( 0 ), 
    *input_2 = scmanal->get_file( 1 ),
    *output = scmanal->get_file( 2 );

  for ( uint i = 0; i < length; i++ ) {
    output[ i ] = input_1[ i ] + input_2[ i ];
  }

  delete scmanal;
}
示例#2
0
Atom atom_init_integer(DeviceIntPtr dev, char* name, int nvalues, int* values, int size) {
	Atom atom;
	int i;
	uint8_t uvals8[MAX_INT_VALUES];
	uint16_t uvals16[MAX_INT_VALUES];
	uint32_t uvals32[MAX_INT_VALUES];
	pointer uvals;
	nvalues = MINVAL(MAX_INT_VALUES, nvalues);

	switch(size) {
	case 8:
		for (i = 0; i < nvalues; i++) {
			uvals8[i] = values[i];
		}
		uvals = uvals8;
		break;
	case 16:
		for (i = 0; i < nvalues; i++) {
			uvals16[i] = values[i];
		}
		uvals = uvals16;
		break;
	default:
		for (i = 0; i < nvalues; i++) {
			uvals32[i] = values[i];
		}
		uvals = uvals32;
		break;
	}

	atom = MakeAtom(name, strlen(name), TRUE);
	XIChangeDeviceProperty(dev, atom, XA_INTEGER, size, PropModeReplace, nvalues, uvals, FALSE);
	XISetDevicePropertyDeletable(dev, atom, FALSE);
	return atom;
}
示例#3
0
/*
 * Return value:
 *   ERROR: -1
 *   NOT FOUND: 0
 *   FOUND: matching line number
 */
int search_file(struct filter_settings *current_settings, char *search_filename, char *target_string, int strlen_target_string, char start_wildcard, char *start_wildcard_matches, char end_wildcard, char *end_wildcard_matches)
{
    int return_value;
    FILE *tmp_file;
    char tmp_buf[MAX_FILE_BUF + 1];
    int line_num;
    int i;
    int strlen_buf;
    char lower_start_wildcard;
    char lower_end_wildcard;
    char lower_target_string[MAX_BUF + 1];
    int strlen_lower_target_string;

    return_value = 0;

    if ((target_string != NULL) &&
            (strlen_target_string > 0))
    {
        if ((tmp_file = fopen(search_filename, "r")) != NULL)
        {
            line_num = 0;

            lower_start_wildcard = (start_wildcard != '\0') ? tolower((int)start_wildcard) : start_wildcard;
            lower_end_wildcard = (end_wildcard != '\0') ? tolower((int)end_wildcard) : end_wildcard;

            strlen_lower_target_string = MINVAL(MAX_BUF, strlen_target_string);
            for (i = 0; i < strlen_lower_target_string; i++)
                lower_target_string[i] = tolower((int)target_string[i]);

            while (!feof(tmp_file) &&
                    (line_num < MAX_FILE_LINES))
            {
                if ((fscanf(tmp_file, "%" STRINGIFY(MAX_FILE_BUF) "[^\r\n]", tmp_buf) == 1) &&
                        (tmp_buf[0] != COMMENT_DELIMITER) &&
                        ((strlen_buf = strlen(tmp_buf)) > 0) &&
                        examine_entry(lower_target_string, strlen_lower_target_string, tmp_buf, strlen_buf, lower_start_wildcard, start_wildcard_matches, lower_end_wildcard, end_wildcard_matches))
                {
                    return_value = line_num + 1;
                    break;
                }

                fscanf(tmp_file, "%*1[\r\n]");
                line_num++;
            }

            if (line_num == MAX_FILE_LINES)
                SPAMDYKE_LOG_VERBOSE(current_settings, LOG_VERBOSE_FILE_TOO_LONG "%s", MAX_FILE_LINES, search_filename);

            fclose(tmp_file);
        }
        else
        {
            SPAMDYKE_LOG_ERROR(current_settings, LOG_ERROR_OPEN_SEARCH "%s: %s", search_filename, strerror(errno));
            return_value = -1;
        }
    }

    return(return_value);
}
示例#4
0
文件: rbuf.c 项目: kmekler/symblog
/* Flush RBUF's buffer to WHERE.  Flush MAXSIZE bytes at most.
   Returns the number of bytes actually copied.  If the buffer is
   empty, 0 is returned.  */
int
rbuf_flush (struct rbuf *rbuf, char *where, int maxsize)
{
  if (!rbuf->buffer_left)
    return 0;
  else
    {
      int howmuch = MINVAL (rbuf->buffer_left, maxsize);

      if (where)
	memcpy (where, rbuf->buffer_pos, howmuch);
      rbuf->buffer_left -= howmuch;
      rbuf->buffer_pos += howmuch;
      return howmuch;
    }
}
示例#5
0
/*
 * Return value:
 *   NOT FOUND: 0
 *   FOUND: 1
 */
int find_path(struct filter_settings *current_settings, char *filename, char *envp[], char *return_filename, int size_return_filename)
{
    int return_value;
    int strlen_filename;
    char *path;
    char *tmp_start;
    char *tmp_end;
    char new_filename[MAX_BUF + 1];
    struct stat tmp_stat;

    return_value = 0;

    if ((filename != NULL) &&
            (return_filename != NULL) &&
            (size_return_filename > 0))
    {
        if (stat(filename, &tmp_stat) == 0)
        {
            strlen_filename = MINVAL(size_return_filename, strlen(filename));
            memcpy(return_filename, filename, sizeof(char) * strlen_filename);
            return_filename[strlen_filename] = '\0';

            return_value = 1;
        }
        else if (strchr(filename, DIR_DELIMITER) == NULL)
        {
            if (((path = find_environment_variable(current_settings, envp, ENVIRONMENT_PATH, STRLEN(ENVIRONMENT_PATH), NULL)) == NULL) ||
                    (path[0] == '\0'))
            {
                SPAMDYKE_LOG_EXCESSIVE(current_settings, LOG_DEBUGX_PATH_DEFAULT, DEFAULT_PATH);
                path = DEFAULT_PATH;
            }

            tmp_start = path;
            tmp_end = NULL;
            while (tmp_start != NULL)
            {
                if ((tmp_end = strchr(tmp_start, ':')) != NULL)
                {
                    strlen_filename = snprintf(new_filename, MAX_BUF, "%.*s" DIR_DELIMITER_STR "%s", (int)(tmp_end - tmp_start), tmp_start, filename);
                    tmp_start = tmp_end + 1;
                }
                else
                {
                    strlen_filename = snprintf(new_filename, MAX_BUF, "%s" DIR_DELIMITER_STR "%s", tmp_start, filename);
                    tmp_start = NULL;
                }

                if (stat(new_filename, &tmp_stat) == 0)
                {
                    if (strlen_filename > size_return_filename)
                        strlen_filename = size_return_filename;

                    memcpy(return_filename, new_filename, sizeof(char) * strlen_filename);
                    return_filename[strlen_filename] = '\0';

                    return_value = 1;
                    break;
                }
            }
        }
    }

    return(return_value);
}
示例#6
0
int Process_new_client_connection (const int socket_fd, const char* client_host_name, const char* client_IP, const uint16_t client_port,
								   const char* password, const char* executable)
{
	bool auxres;
	char* line_buffer = NULL;
	size_t line_buffer_len = 0;
	size_t line_len = 0;
	FILE *input_lines, *output_lines;
	char cookie[5];
	char* password_latin;
	char hash[HASH_LEN + 1];
	bool eof_found;

	bool close_requested;
	TEventType event_type;

	char* event;
	char** payload;
	size_t payload_len, payload_buffer_len;

	bool isTCPEvents;
	size_t auxlen;


	errno = 0;


	/* ************************************************************************************** */
	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Promoting socket to FILE...");

	errno = 0;

	/* Promote socket. */
	if ( ( (input_lines = fdopen (socket_fd, "r")) == NULL) ||
			( (output_lines = fdopen (socket_fd, "w")) == NULL))
		return ERROR_PROMOTING_SOCKET_TO_FILE;

	/* Set the buffering to lines for the output file. */
	setlinebuf (output_lines);

	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Success promoting socket to FILE.");
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	/* If the program is signaled to terminate. */
	if (Is_signaled_to_terminate())
		return ERROR_INTERRUPTED;
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Trying to read the \"Magic word\".");

	errno = 0;

	if (!Read_line (input_lines, &line_buffer, &line_buffer_len,
							 &line_len, &eof_found, true, false))
		return ERROR_READING_MAGIC_WORD;

	errno = 0;

	auxres =
		( (line_len == strlen (MAGIC_WORD)) &&
		  (strncmp (line_buffer, MAGIC_WORD, line_len) == 0));

	Free_string (&line_buffer);

	if (!auxres)
		return ERROR_BAD_MAGIC_WORD;

	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Success reading the \"Magic word\".");
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	/* If the program is signaled to terminate. */
	if (Is_signaled_to_terminate())
		return ERROR_INTERRUPTED;
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Generating and sending cookie for password...");

	errno = 0;

	if (!Generate_cookie (cookie, sizeof (cookie)))
		return ERROR_GENERATING_PASSWORD_COOKIE;

	if (!Write_line (output_lines,  cookie))
		return ERROR_WRITING_COOKIE;

	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Success generating and sending cookie for password.");
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	/* If the program is signaled to terminate. */
	if (Is_signaled_to_terminate())
		return ERROR_INTERRUPTED;
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Calculating hash...");

	errno = 0;

	if (!Convert_between_latin15_and_current_locale (password, &password_latin, false))
		return ERROR_CALCULATING_HASH;

	errno = 0;

	auxres = Hash_cookied_password (password_latin, cookie, hash, sizeof (hash));

	Free_string (&password_latin);

	if (!auxres)
		return ERROR_CALCULATING_HASH;

	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Success calculating hash.");
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	/* If the program is signaled to terminate. */
	if (Is_signaled_to_terminate())
		return ERROR_INTERRUPTED;
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Trying to read and match hash from client...");

	if (!Read_line (input_lines, &line_buffer, &line_buffer_len,
							 &line_len, &eof_found, false, false))
		return ERROR_READING_HASH;

	errno = 0;

	auxres = ( (line_len >= HASH_LEN) &&
			(strncasecmp (line_buffer + line_len - HASH_LEN, hash, HASH_LEN) == 0));

	isTCPEvents = (auxres && (line_len >= (HASH_LEN + strlen (TCP_EVENTS_MSG))) &&
				   (strncasecmp (line_buffer, TCP_EVENTS_MSG, strlen (TCP_EVENTS_MSG)) == 0));

	Free_string (&line_buffer);

	if (!auxres)
		return ERROR_HASH_DOES_NOT_MATCH;

	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Success reading and matching hash from client.");
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	/* If the program is signaled to terminate. */
	if (Is_signaled_to_terminate())
		return ERROR_INTERRUPTED;
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Sending \"accept\" message...");

	errno = 0;

	if (!Write_line (output_lines, ACCEPT_MSG))
		return ERROR_WRITING_ACCEPT_MSG;

	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Success sending \"accept\" message.");
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	/* If the program is signaled to terminate. */
	if (Is_signaled_to_terminate())
		return ERROR_INTERRUPTED;
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	Vlogit (tll_debug,
			LOG_MESSAGE_PREAMBLE,
			LOGLEVELNAME (tll_debug),
			PROCESS_P_C (g_daemonized, g_processor),
			getpid(), "Processing events...");


	close_requested = false;
	event_type = tet_unknown;

	event = NULL;
	payload = NULL;
	payload_len = 0;
	payload_buffer_len = 0;

	line_buffer = NULL;

	do
	{
		if ( (!Read_line (input_lines, &line_buffer, &line_buffer_len,
								   &line_len, &eof_found, false, true)) && (!eof_found))
		{
			Free_string_array (&payload, &payload_len, &payload_buffer_len);
			Free_string (&line_buffer);

			/* If the program is signaled to terminate. */
			if (Is_signaled_to_terminate())
				return ERROR_INTERRUPTED;

			return ERROR_READING_EVENT;
		}
		else if (eof_found)
		{

			Free_string_array (&payload, &payload_len, &payload_buffer_len);
			Free_string (&line_buffer);

			break;
		}
		else if (line_buffer_len > MAX_EVENT_LINE_LEN)
		{
			Free_string_array (&payload, &payload_len, &payload_buffer_len);
			Free_string (&line_buffer);

			return ERROR_EVENT_LINE_TOO_LONG;
		}

		/* If the program is signaled to terminate. */
		if (Is_signaled_to_terminate())
			break;

		if (strncasecmp (line_buffer, CLOSE_MSG,
						 MINVAL (line_len, strlen (CLOSE_MSG))) == 0)
		{
			Vlogit (tll_debug,
					LOG_MESSAGE_PREAMBLE,
					LOGLEVELNAME (tll_debug),
					PROCESS_P_C (g_daemonized, g_processor),
					getpid(), "Received: <Close>");

			/* Close requested. */

			Free_string_array (&payload, &payload_len, &payload_buffer_len);
			Free_string (&line_buffer);

			close_requested = true;
		}
		else if (strncasecmp (line_buffer, PAYLOAD_MSG,
							  MINVAL (line_len, strlen (PAYLOAD_MSG))) == 0)
		{
			Vlogit (tll_debug,
					LOG_MESSAGE_PREAMBLE,
					LOGLEVELNAME (tll_debug),
					PROCESS_P_C (g_daemonized, g_processor),
					getpid(), "Received: <Payload>");

			/* Add to payload. */

			if (!Add_string_to_string_array (&payload, &payload_len, &payload_buffer_len,
											 line_buffer + strlen (PAYLOAD_MSG) + 1))
			{
				Free_string_array (&payload, &payload_len, &payload_buffer_len);
				Free_string (&line_buffer);

				return ERROR_ALLOCATING_MEMORY;
			}
		}
		else if ( (payload_len > 0) && (strncasecmp (payload[payload_len - 1], BUTTON_RELEASED_MSG,
										MINVAL (strlen (payload[payload_len - 1]), strlen (BUTTON_RELEASED_MSG))) == 0))
		{
			Vlogit (tll_debug,
					LOG_MESSAGE_PREAMBLE,
					LOGLEVELNAME (tll_debug),
					PROCESS_P_C (g_daemonized, g_processor),
					getpid(), "Received: <Enduring Event - Stop>");

			/* End enduring event. */

			event = line_buffer;
			event_type = tet_end_event;
		}
		else if ( (payload_len > 0) && (strncasecmp (payload[payload_len - 1], WITHOUT_RELEASE_MSG,
										MINVAL (strlen (payload[payload_len - 1]), strlen (WITHOUT_RELEASE_MSG))) == 0))
		{
			Vlogit (tll_debug,
					LOG_MESSAGE_PREAMBLE,
					LOGLEVELNAME (tll_debug),
					PROCESS_P_C (g_daemonized, g_processor),
					getpid(), "Received: <Enduring Event - Start>");

			/* Trigger enduring event. */

			event = line_buffer;
			event_type = tet_enduring_event;
		}
		else
		{
			Vlogit (tll_debug,
					LOG_MESSAGE_PREAMBLE,
					LOGLEVELNAME (tll_debug),
					PROCESS_P_C (g_daemonized, g_processor),
					getpid(), "Received: <Event>");

			/* Trigger event. */

			event = line_buffer;
			event_type = tet_event;
		}

		errno = 0;

		if ( (!Is_signaled_to_terminate()) && (!close_requested) && (event_type != tet_unknown) &&
				(executable != NULL) && (strlen (executable) > 0))
		{
			Vlogit (tll_info,
					LOG_MESSAGE_PREAMBLE,
					LOGLEVELNAME (tll_info),
					PROCESS_P_C (g_daemonized, g_processor),
					getpid(),
					"Executing command...");

			Ignore_or_restore_SIGPIPE_signal (true);

			auxres = Execute_and_report_output (executable, client_host_name, client_IP, client_port,
												(event != NULL) ? event : EMPTY_STRING,
												event_type, payload_len, (const char**) payload,
												&socket_fd, 1);

			Ignore_or_restore_SIGPIPE_signal (false);

			if (!auxres)

			{
				Free_string_array (&payload, &payload_len, &payload_buffer_len);
				Free_string (&line_buffer);

				return ERROR_EXECUTING_COMMAND;
			}

			Vlogit (tll_info,
					LOG_MESSAGE_PREAMBLE,
					LOGLEVELNAME (tll_info),
					PROCESS_P_C (g_daemonized, g_processor),
					getpid(), "Success executing command.");
		}
		else if ( (!close_requested) && (event_type != tet_unknown))
		{
			Vlogit (tll_info,
					LOG_EVENT_NO_COMMAND,
					LOGLEVELNAME (tll_info),
					PROCESS_P_C (g_daemonized, g_processor),
					getpid(), event);
		}

		Free_string (&line_buffer);

		if (event_type != tet_unknown)
		{
			Free_string_array (&payload, &payload_len, &payload_buffer_len);
			close_requested = false;
			event_type = tet_unknown;

			event = NULL;
		}
	}
	while (!Is_signaled_to_terminate() && !close_requested);

	Free_string_array (&payload, &payload_len, &payload_buffer_len);
	Free_string (&line_buffer);
	/* ************************************************************************************** */


	/* ************************************************************************************** */
	/* If the program is signaled to terminate. */
	if (Is_signaled_to_terminate())
		return ERROR_INTERRUPTED;
	else if (close_requested)
	{
		Vlogit (tll_info,
				LOG_MESSAGE_PREAMBLE,
				LOGLEVELNAME (tll_info),
				PROCESS_P_C (g_daemonized, g_processor),
				getpid(), "Client requested close.");
	}
	else
	{
		Vlogit (tll_info,
				LOG_MESSAGE_PREAMBLE,
				LOGLEVELNAME (tll_info),
				PROCESS_P_C (g_daemonized, g_processor),
				getpid(), "Client closed the conection.");
	}
	/* ************************************************************************************** */

	errno = 0;

	return ERROR_SUCESS;
}
示例#7
0
int dns_get(char *target_name, int type, unsigned char *return_answer, int return_answer_length, int verbose)
  {
  static int query_id = 0;
  int return_value;
  int i;
  int dns_socket;
  unsigned char question[PACKETSZ];
  unsigned char answer[PACKETSZ];
  int question_length;
  unsigned short tmp_id;
  int sendto_result;
  int select_result;
  int response_length;
  fd_set read_fds;
  struct timeval tmp_timeval;
  time_t start_time;
  int num_queries;

  return_value = 0;

  if ((dns_socket = dns_initialize(0)) != -1)
    {
    if ((question_length = res_mkquery(QUERY, target_name, C_IN, type, NULL, 0, NULL, question, PACKETSZ)) >= 0)
      {
      tmp_id = htons(query_id);
      query_id++;

      question[0] = ((char *)&tmp_id)[0];
      question[1] = ((char *)&tmp_id)[1];

      start_time = time(NULL);
      num_queries = 0;

      do
        {
        sendto_result = 0;

        if (num_queries < MAX_DNS_QUERIES_PREFERRED)
          {
          if (verbose)
            printf(MSG_SENDING, num_queries, inet_ntoa(_res.nsaddr_list[0].sin_addr), ntohs(_res.nsaddr_list[0].sin_port));

          sendto_result = sendto(dns_socket, question, question_length, 0, (struct sockaddr *)&_res.nsaddr_list[0], sizeof(struct sockaddr));
          }
        else
          for (i = 0; i < _res.nscount; i++)
            {
            if (verbose)
              printf(MSG_SENDING, num_queries, inet_ntoa(_res.nsaddr_list[i].sin_addr), ntohs(_res.nsaddr_list[i].sin_port));

            sendto_result = sendto(dns_socket, question, question_length, 0, (struct sockaddr *)&_res.nsaddr_list[i], sizeof(struct sockaddr));
            }

        num_queries++;

        if (sendto_result == question_length)
          {
          FD_ZERO(&read_fds);
          FD_SET(dns_socket, &read_fds);

          tmp_timeval.tv_sec = MINVAL((TIMEOUT_DNS_QUERY_SECS * MAX_DNS_QUERIES) - (time(NULL) - start_time), TIMEOUT_DNS_QUERY_SECS);
          tmp_timeval.tv_usec = 0;

          while ((tmp_timeval.tv_sec > 0) &&
                 ((select_result = select(dns_socket + 1, &read_fds, NULL, NULL, &tmp_timeval)) > 0))
            {
            if (((response_length = recvfrom(dns_socket, answer, PACKETSZ, 0, NULL, NULL)) > 0) &&
                (answer[0] == question[0]) &&
                (answer[1] == question[1]))
              {
              if (verbose)
                printf(MSG_RECEIVING, response_length);

              memcpy(return_answer, answer, MINVAL(response_length, return_answer_length));
              return_value = MINVAL(response_length, return_answer_length);
              break;
              }
            else if (verbose)
              printf(MSG_MISMATCH);
            }

          if (return_value > 0)
            break;
          }
        else if (sendto_result >= 0)
          printf(ERROR_SENDTO_INCOMPLETE, question_length, sendto_result);
        else
          {
          printf(ERROR_SENDTO, strerror(errno));
          break;
          }
        }
      while (num_queries < MAX_DNS_QUERIES);
      }
    else
      printf(ERROR_MKQUERY, strerror(errno));
    }

  return(return_value);
  }