Blame tests/sftp_stress/main.c

Packit 6c0a39
/*
Packit 6c0a39
 * main.c
Packit 6c0a39
 *
Packit 6c0a39
 *  Created on: 22 juin 2009
Packit 6c0a39
 *      Author: aris
Packit 6c0a39
 */
Packit 6c0a39
#include <stdio.h>
Packit 6c0a39
#include <libssh/libssh.h>
Packit 6c0a39
#include <libssh/sftp.h>
Packit 6c0a39
#include <time.h>
Packit 6c0a39
#include <stdlib.h>
Packit 6c0a39
#include <fcntl.h>
Packit 6c0a39
#include <signal.h>
Packit 6c0a39
#include <pthread.h>
Packit 6c0a39
#define TEST_READ 1
Packit 6c0a39
#define TEST_WRITE 2
Packit 6c0a39
#define NTHREADS 3
Packit 6c0a39
#define FILESIZE 100000
Packit 6c0a39
unsigned char samplefile[FILESIZE];
Packit 6c0a39
volatile int stop=0;
Packit 6c0a39
Packit 6c0a39
const char* hosts[]={"localhost","barebone"};
Packit 6c0a39
void signal_stop(){
Packit 6c0a39
  stop=1;
Packit 6c0a39
  printf("Stopping...\n");
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
SSH_SESSION *connect_host(const char *hostname);
Packit 6c0a39
int sftp_test(SSH_SESSION *session, int test);
Packit 6c0a39
Packit 6c0a39
int docycle(const char *host, int test){
Packit 6c0a39
  SSH_SESSION *session=connect_host(host);
Packit 6c0a39
  int ret=SSH_ERROR;
Packit 6c0a39
  if(!session){
Packit 6c0a39
    printf("connect failed\n");
Packit 6c0a39
  } else {
Packit 6c0a39
    printf("Connected\n");
Packit 6c0a39
    ret=sftp_test(session,test);
Packit 6c0a39
    if(ret != SSH_OK){
Packit 6c0a39
      printf("Error in sftp\n");
Packit 6c0a39
    }
Packit 6c0a39
    ssh_disconnect(session);
Packit 6c0a39
  }
Packit 6c0a39
  return ret;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int thread(){
Packit 6c0a39
  while(docycle(hosts[rand()%2],TEST_WRITE) == SSH_OK)
Packit 6c0a39
    if(stop)
Packit 6c0a39
      break;
Packit 6c0a39
  return 0;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int main(int argc, char **argv){
Packit 6c0a39
  int i;
Packit 6c0a39
  pthread_t threads[NTHREADS];
Packit 6c0a39
  ssh_init();
Packit 6c0a39
  srand(time(NULL));
Packit 6c0a39
  for(i=0;i
Packit 6c0a39
    samplefile[i]=rand() & 0xff;
Packit 6c0a39
  signal(SIGTERM,signal_stop);
Packit 6c0a39
  signal(SIGINT,signal_stop);
Packit 6c0a39
Packit 6c0a39
  for(i=0;i
Packit 6c0a39
    srand(i);
Packit 6c0a39
    pthread_create(&threads[i],NULL,(void *) thread, NULL);
Packit 6c0a39
  }
Packit 6c0a39
  for(i=0;i
Packit 6c0a39
    pthread_join(threads[i],NULL);
Packit 6c0a39
  }
Packit 6c0a39
  ssh_finalize();
Packit 6c0a39
  printf("Ended\n");
Packit 6c0a39
  return 0;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
SSH_SESSION *connect_host(const char *hostname){
Packit 6c0a39
  SSH_SESSION *session;
Packit 6c0a39
  SSH_OPTIONS *options;
Packit 6c0a39
  int auth=0;
Packit 6c0a39
  int state;
Packit 6c0a39
Packit 6c0a39
  options=ssh_options_new();
Packit 6c0a39
  ssh_options_set_host(options,hostname);
Packit 6c0a39
  session=ssh_new();
Packit 6c0a39
  ssh_set_options(session,options);
Packit 6c0a39
  if(ssh_connect(session)){
Packit 6c0a39
    fprintf(stderr,"Connection failed : %s\n",ssh_get_error(session));
Packit 6c0a39
    ssh_disconnect(session);
Packit 6c0a39
    return NULL;
Packit 6c0a39
  }
Packit 6c0a39
Packit 6c0a39
  state = ssh_session_is_known_server(session);
Packit 6c0a39
  switch(state){
Packit 6c0a39
    case SSH_SERVER_KNOWN_OK:
Packit 6c0a39
      break; /* ok */
Packit 6c0a39
    case SSH_SERVER_KNOWN_CHANGED:
Packit 6c0a39
      fprintf(stderr,"Host key for server changed : server's one is now :\n");
Packit 6c0a39
      fprintf(stderr,"For security reason, connection will be stopped\n");
Packit 6c0a39
      ssh_disconnect(session);
Packit 6c0a39
      ssh_finalize();
Packit 6c0a39
      return NULL;
Packit 6c0a39
    case SSH_SERVER_FOUND_OTHER:
Packit 6c0a39
      fprintf(stderr,"The host key for this server was not found but an other type of key exists.\n");
Packit 6c0a39
      fprintf(stderr,"An attacker might change the default server key to confuse your client"
Packit 6c0a39
          "into thinking the key does not exist\n"
Packit 6c0a39
          "We advise you to rerun the client with -d or -r for more safety.\n");
Packit 6c0a39
      ssh_disconnect(session);
Packit 6c0a39
      ssh_finalize();
Packit 6c0a39
      return NULL;
Packit 6c0a39
    case SSH_SERVER_NOT_KNOWN:
Packit 6c0a39
      fprintf(stderr,"The server is unknown. Leaving now");
Packit 6c0a39
      ssh_disconnect(session);
Packit 6c0a39
      return NULL;
Packit 6c0a39
    case SSH_SERVER_ERROR:
Packit 6c0a39
      fprintf(stderr,"%s",ssh_get_error(session));
Packit 6c0a39
      ssh_disconnect(session);
Packit 6c0a39
      return NULL;
Packit 6c0a39
  }
Packit 6c0a39
Packit 6c0a39
  ssh_userauth_none(session, NULL);
Packit 6c0a39
Packit 6c0a39
  auth=ssh_userauth_autopubkey(session, NULL);
Packit 6c0a39
  if(auth==SSH_AUTH_ERROR){
Packit 6c0a39
    fprintf(stderr,"Authenticating with pubkey: %s\n",ssh_get_error(session));
Packit 6c0a39
    ssh_disconnect(session);
Packit 6c0a39
    return NULL;
Packit 6c0a39
  }
Packit 6c0a39
  if(auth!=SSH_AUTH_SUCCESS){
Packit 6c0a39
    fprintf(stderr,"Authentication failed: %s\n",ssh_get_error(session));
Packit 6c0a39
    ssh_disconnect(session);
Packit 6c0a39
    return NULL;
Packit 6c0a39
  }
Packit 6c0a39
  ssh_log(session, SSH_LOG_FUNCTIONS, "Authentication success");
Packit 6c0a39
  return session;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int sftp_test(SSH_SESSION *session, int test){
Packit 6c0a39
  SFTP_SESSION *sftp=sftp_new(session);
Packit 6c0a39
  SFTP_FILE *file;
Packit 6c0a39
  int wrote=0;
Packit 6c0a39
  char name[128];
Packit 6c0a39
  if(sftp == NULL)
Packit 6c0a39
    return SSH_ERROR;
Packit 6c0a39
  if(sftp_init(sftp)<0){
Packit 6c0a39
    printf("problem initializing sftp : %s\n",ssh_get_error(session));
Packit 6c0a39
    return SSH_ERROR;
Packit 6c0a39
  }
Packit 6c0a39
  if(test==TEST_WRITE){
Packit 6c0a39
    snprintf(name,sizeof(name),"/tmp/libsshstress%d",rand());
Packit 6c0a39
    file=sftp_open(sftp,name,O_RDWR|O_CREAT,0777);
Packit 6c0a39
    if(!file){
Packit 6c0a39
      printf("Failed to open file : %s\n",ssh_get_error(session));
Packit 6c0a39
      sftp_free(sftp);
Packit 6c0a39
      return SSH_ERROR;
Packit 6c0a39
    }
Packit 6c0a39
    while(wrote
Packit 6c0a39
      int max=FILESIZE-wrote;
Packit 6c0a39
      int towrite=rand()%max + 1;
Packit 6c0a39
      int ret=sftp_write(file,&samplefile[wrote],towrite);
Packit 6c0a39
      if(ret<=0){
Packit 6c0a39
        printf("Problem while writing : %s\n",ssh_get_error(session));
Packit 6c0a39
        sftp_free(sftp);
Packit 6c0a39
        return SSH_ERROR;
Packit 6c0a39
      }
Packit 6c0a39
      if(ret != towrite){
Packit 6c0a39
        printf("Asked to write %d, wrote %d\n",towrite,ret);
Packit 6c0a39
      }
Packit 6c0a39
      wrote += ret;
Packit 6c0a39
    }
Packit 6c0a39
    sftp_close(file);
Packit 6c0a39
  }
Packit 6c0a39
  sftp_free(sftp);
Packit 6c0a39
  return SSH_OK;
Packit 6c0a39
}