mirror of
				https://github.com/libssh2/libssh2.git
				synced 2025-11-03 22:13:11 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			223 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * util.c
 | 
						|
 *
 | 
						|
 * Copyright (C) 2005 Bert Vermeulen <bert@biot.com>
 | 
						|
 * All rights reserved.
 | 
						|
 *
 | 
						|
 * Redistribution and use in source and binary forms,
 | 
						|
 * with or without modification, are permitted provided
 | 
						|
 * that the following conditions are met:
 | 
						|
 *
 | 
						|
 *   Redistributions of source code must retain the above
 | 
						|
 *   copyright notice, this list of conditions and the
 | 
						|
 *   following disclaimer.
 | 
						|
 *
 | 
						|
 *   Redistributions in binary form must reproduce the above
 | 
						|
 *   copyright notice, this list of conditions and the following
 | 
						|
 *   disclaimer in the documentation and/or other materials
 | 
						|
 *   provided with the distribution.
 | 
						|
 *
 | 
						|
 *   Neither the name of the copyright holder nor the names
 | 
						|
 *   of any other contributors may be used to endorse or
 | 
						|
 *   promote products derived from this software without
 | 
						|
 *   specific prior written permission.
 | 
						|
 *
 | 
						|
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 | 
						|
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 | 
						|
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
						|
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
						|
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 | 
						|
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
						|
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
						|
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
						|
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
						|
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 | 
						|
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 | 
						|
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 | 
						|
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 | 
						|
 * OF SUCH DAMAGE.
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <string.h>
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/socket.h>
 | 
						|
#include <netdb.h>
 | 
						|
#include <stdarg.h>
 | 
						|
#include <errno.h>
 | 
						|
 | 
						|
#include <libssh2.h>
 | 
						|
#include "libssh2-test.h"
 | 
						|
 | 
						|
 | 
						|
extern struct addrinfo *hostai, *cur_ai;
 | 
						|
struct logresults *testlogs = NULL, *cur_testlog;
 | 
						|
struct logentry *logfile = NULL, *cur_logentry;
 | 
						|
 | 
						|
extern struct authdefs auth;
 | 
						|
extern char *progress_message;
 | 
						|
extern int progress, progress_max;
 | 
						|
 | 
						|
 | 
						|
struct loglevel {
 | 
						|
     int priority;
 | 
						|
     char *descr;
 | 
						|
} loglevels[] = {
 | 
						|
     {   ERROR, "ERROR" },
 | 
						|
     { WARNING, "WARNING" },
 | 
						|
     {  NORMAL, "NORMAL" },
 | 
						|
     {   DEBUG, "DEBUG" }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void log_line(int priority, char *format, ...)
 | 
						|
{
 | 
						|
     va_list args;
 | 
						|
     struct logentry *entry;
 | 
						|
     char line[MAX_LOGLINE_LEN];
 | 
						|
 | 
						|
     va_start(args, format);
 | 
						|
     vsnprintf(line, MAX_LOGLINE_LEN, format, args);
 | 
						|
     va_end(args);
 | 
						|
 | 
						|
     entry = malloc(sizeof(struct logentry));
 | 
						|
     entry->priority = priority;
 | 
						|
     entry->logline = malloc(strlen(line)+1);
 | 
						|
     strcpy(entry->logline, line);
 | 
						|
     entry->next = NULL;
 | 
						|
 | 
						|
     if(!cur_testlog->log)
 | 
						|
	  cur_testlog->log = entry;
 | 
						|
     else
 | 
						|
	  cur_logentry->next = entry;
 | 
						|
 | 
						|
     cur_logentry = entry;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void init_test(char *msg, int num_items)
 | 
						|
{
 | 
						|
     struct logresults *newtest;
 | 
						|
 | 
						|
     newtest = malloc(sizeof(struct logresults));
 | 
						|
     newtest->description = msg;
 | 
						|
     newtest->num_steps = num_items;
 | 
						|
     newtest->success_steps = 0;
 | 
						|
     newtest->progress = 0;
 | 
						|
     newtest->log = NULL;
 | 
						|
     newtest->next = NULL;
 | 
						|
 | 
						|
     if(!testlogs)
 | 
						|
	  testlogs = newtest;
 | 
						|
     else
 | 
						|
	  cur_testlog->next = newtest;
 | 
						|
 | 
						|
     cur_testlog = newtest;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void increase_progress(void)
 | 
						|
{
 | 
						|
 | 
						|
     cur_testlog->progress++;
 | 
						|
 | 
						|
     printf("Testing %s... %3d/%d\r", cur_testlog->description, cur_testlog->progress, cur_testlog->num_steps);
 | 
						|
     fflush(stdout);
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void step_successful(void)
 | 
						|
{
 | 
						|
 | 
						|
     cur_testlog->success_steps++;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void output_testresults(void)
 | 
						|
{
 | 
						|
     struct logresults *test;
 | 
						|
     struct logentry *logfile;
 | 
						|
     int total_steps, total_success;
 | 
						|
 | 
						|
     printf("\nTest results\n============\n");
 | 
						|
 | 
						|
     total_steps = 0;
 | 
						|
     total_success = 0;
 | 
						|
     test = testlogs;
 | 
						|
     while(test)
 | 
						|
     {
 | 
						|
	  total_steps += test->num_steps;
 | 
						|
	  total_success += test->success_steps;
 | 
						|
	  printf("Test: %s (%d/%d)\n", test->description, test->success_steps, test->num_steps);
 | 
						|
	  logfile = test->log;
 | 
						|
	  while(logfile)
 | 
						|
	  {
 | 
						|
	       printf("  %s", logfile->logline);
 | 
						|
	       logfile = logfile->next;
 | 
						|
	  }
 | 
						|
 | 
						|
	  test = test->next;
 | 
						|
     }
 | 
						|
 | 
						|
     printf("%d/%d steps successful\n", total_success, total_steps);
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int new_socket(void)
 | 
						|
{
 | 
						|
     int sock, res;
 | 
						|
     struct addrinfo hints, *ai;
 | 
						|
 | 
						|
     memset(&hints, 0, sizeof(struct addrinfo));
 | 
						|
     hints.ai_family = PF_INET;
 | 
						|
     hints.ai_socktype = SOCK_STREAM;
 | 
						|
 | 
						|
     if(!hostai)
 | 
						|
     {
 | 
						|
	  res = getaddrinfo(auth.hostname, auth.port, &hints, &hostai);
 | 
						|
	  if(res)
 | 
						|
	  {
 | 
						|
	       printf("unable to resolve %s: %s\n", auth.hostname, gai_strerror(res));
 | 
						|
	       return(-1);
 | 
						|
	  }
 | 
						|
     }
 | 
						|
 | 
						|
     sock = 0;
 | 
						|
     ai = hostai;
 | 
						|
     while(ai)
 | 
						|
     {
 | 
						|
	  sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
 | 
						|
	  if(sock > 0)
 | 
						|
	  {
 | 
						|
	       res = connect(sock, ai->ai_addr, ai->ai_addrlen);
 | 
						|
	       if(res == 0)
 | 
						|
		    break;
 | 
						|
 | 
						|
	       close(sock);
 | 
						|
	       sock = 0;
 | 
						|
	  }
 | 
						|
	  ai = ai->ai_next;
 | 
						|
     }
 | 
						|
 | 
						|
     if(!sock)
 | 
						|
     {
 | 
						|
	  printf("unable to connect: %s\n", strerror(errno));
 | 
						|
	  close(sock);
 | 
						|
	  sock = -1;
 | 
						|
     }
 | 
						|
 | 
						|
     cur_ai = ai;
 | 
						|
 | 
						|
     return(sock);
 | 
						|
}
 | 
						|
 | 
						|
 |