Blame tests/benchmarks/bench_scp.c

Packit 6c0a39
/* bench_scp.c
Packit 6c0a39
 *
Packit 6c0a39
 * This file is part of the SSH Library
Packit 6c0a39
 *
Packit 6c0a39
 * Copyright (c) 2011 by Aris Adamantiadis
Packit 6c0a39
 *
Packit 6c0a39
 * The SSH Library is free software; you can redistribute it and/or modify
Packit 6c0a39
 * it under the terms of the GNU Lesser General Public License as published by
Packit 6c0a39
 * the Free Software Foundation; either version 2.1 of the License, or (at your
Packit 6c0a39
 * option) any later version.
Packit 6c0a39
 *
Packit 6c0a39
 * The SSH Library is distributed in the hope that it will be useful, but
Packit 6c0a39
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 6c0a39
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit 6c0a39
 * License for more details.
Packit 6c0a39
 *
Packit 6c0a39
 * You should have received a copy of the GNU Lesser General Public License
Packit 6c0a39
 * along with the SSH Library; see the file COPYING.  If not, write to
Packit 6c0a39
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
Packit 6c0a39
 * MA 02111-1307, USA.
Packit 6c0a39
 */
Packit 6c0a39
Packit 6c0a39
#include "benchmarks.h"
Packit 6c0a39
#include <libssh/libssh.h>
Packit 6c0a39
#include <stdio.h>
Packit 6c0a39
Packit 6c0a39
#define SCPDIR "/tmp/"
Packit 6c0a39
#define SCPFILE "scpbenchmark"
Packit 6c0a39
Packit 6c0a39
/** @internal
Packit 6c0a39
 * @brief benchmarks a scp upload using an
Packit 6c0a39
 * existing SSH session.
Packit 6c0a39
 * @param[in] session Open SSH session
Packit 6c0a39
 * @param[in] args Parsed command line arguments
Packit 6c0a39
 * @param[out] bps The calculated bytes per second obtained via benchmark.
Packit 6c0a39
 * @return 0 on success, -1 on error.
Packit 6c0a39
 */
Packit 6c0a39
int benchmarks_scp_up (ssh_session session, struct argument_s *args,
Packit 6c0a39
    float *bps){
Packit 6c0a39
  unsigned long bytes;
Packit 6c0a39
  struct timestamp_struct ts;
Packit 6c0a39
  float ms=0.0;
Packit 6c0a39
  unsigned long total=0;
Packit 6c0a39
  ssh_scp scp;
Packit 6c0a39
Packit 6c0a39
  bytes = args->datasize * 1024 * 1024;
Packit 6c0a39
  scp = ssh_scp_new(session,SSH_SCP_WRITE,SCPDIR);
Packit 6c0a39
  if(scp == NULL)
Packit 6c0a39
    goto error;
Packit 6c0a39
  if(ssh_scp_init(scp)==SSH_ERROR)
Packit 6c0a39
    goto error;
Packit 6c0a39
  if(ssh_scp_push_file(scp,SCPFILE,bytes,0777) != SSH_OK)
Packit 6c0a39
    goto error;
Packit 6c0a39
  if(args->verbose>0)
Packit 6c0a39
    fprintf(stdout,"Starting upload of %lu bytes now\n",bytes);
Packit 6c0a39
  timestamp_init(&ts);
Packit 6c0a39
  while(total < bytes){
Packit 6c0a39
    unsigned long towrite = bytes - total;
Packit 6c0a39
    int w;
Packit 6c0a39
    if(towrite > args->chunksize)
Packit 6c0a39
      towrite = args->chunksize;
Packit 6c0a39
    w=ssh_scp_write(scp,buffer,towrite);
Packit 6c0a39
    if(w == SSH_ERROR)
Packit 6c0a39
      goto error;
Packit 6c0a39
    total += towrite;
Packit 6c0a39
  }
Packit 6c0a39
  ms=elapsed_time(&ts);
Packit 6c0a39
  *bps=8000 * (float)bytes / ms;
Packit 6c0a39
  if(args->verbose > 0)
Packit 6c0a39
    fprintf(stdout,"Upload took %f ms for %lu bytes, at %f bps\n",ms,
Packit 6c0a39
        bytes,*bps);
Packit 6c0a39
  ssh_scp_close(scp);
Packit 6c0a39
  ssh_scp_free(scp);
Packit 6c0a39
  return 0;
Packit 6c0a39
error:
Packit 6c0a39
  fprintf(stderr,"Error during scp upload : %s\n",ssh_get_error(session));
Packit 6c0a39
  if(scp){
Packit 6c0a39
    ssh_scp_close(scp);
Packit 6c0a39
    ssh_scp_free(scp);
Packit 6c0a39
  }
Packit 6c0a39
  return -1;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
/** @internal
Packit 6c0a39
 * @brief benchmarks a scp download using an
Packit 6c0a39
 * existing SSH session.
Packit 6c0a39
 * @param[in] session Open SSH session
Packit 6c0a39
 * @param[in] args Parsed command line arguments
Packit 6c0a39
 * @param[out] bps The calculated bytes per second obtained via benchmark.
Packit 6c0a39
 * @return 0 on success, -1 on error.
Packit 6c0a39
 */
Packit 6c0a39
int benchmarks_scp_down (ssh_session session, struct argument_s *args,
Packit 6c0a39
    float *bps){
Packit 6c0a39
  unsigned long bytes;
Packit 6c0a39
  struct timestamp_struct ts;
Packit 6c0a39
  float ms=0.0;
Packit 6c0a39
  unsigned long total=0;
Packit 6c0a39
  ssh_scp scp;
Packit 6c0a39
  int r;
Packit 6c0a39
  size_t size;
Packit 6c0a39
Packit 6c0a39
  bytes = args->datasize * 1024 * 1024;
Packit 6c0a39
  scp = ssh_scp_new(session,SSH_SCP_READ,SCPDIR SCPFILE);
Packit 6c0a39
  if(scp == NULL)
Packit 6c0a39
    goto error;
Packit 6c0a39
  if(ssh_scp_init(scp)==SSH_ERROR)
Packit 6c0a39
    goto error;
Packit 6c0a39
  r=ssh_scp_pull_request(scp);
Packit 6c0a39
  if(r == SSH_SCP_REQUEST_NEWFILE){
Packit 6c0a39
    size=ssh_scp_request_get_size(scp);
Packit 6c0a39
    if(bytes > size){
Packit 6c0a39
      printf("Only %zd bytes available (on %lu requested).\n",size,bytes);
Packit 6c0a39
      bytes = size;
Packit 6c0a39
    }
Packit 6c0a39
    if(size > bytes){
Packit 6c0a39
      printf("File is %zd bytes (on %lu requested). Will cut the end\n",size,bytes);
Packit 6c0a39
    }
Packit 6c0a39
    if(args->verbose>0)
Packit 6c0a39
      fprintf(stdout,"Starting download of %lu bytes now\n",bytes);
Packit 6c0a39
    timestamp_init(&ts);
Packit 6c0a39
    ssh_scp_accept_request(scp);
Packit 6c0a39
    while(total < bytes){
Packit 6c0a39
      unsigned long toread = bytes - total;
Packit 6c0a39
      if(toread > args->chunksize)
Packit 6c0a39
        toread = args->chunksize;
Packit 6c0a39
      r=ssh_scp_read(scp,buffer,toread);
Packit 6c0a39
      if(r == SSH_ERROR || r == 0)
Packit 6c0a39
        goto error;
Packit 6c0a39
      total += r;
Packit 6c0a39
    }
Packit 6c0a39
    ms=elapsed_time(&ts);
Packit 6c0a39
    *bps=8000 * (float)bytes / ms;
Packit 6c0a39
    if(args->verbose > 0)
Packit 6c0a39
      fprintf(stdout,"download took %f ms for %lu bytes, at %f bps\n",ms,
Packit 6c0a39
          bytes,*bps);
Packit 6c0a39
  } else {
Packit 6c0a39
    fprintf(stderr,"Expected SSH_SCP_REQUEST_NEWFILE, got %d\n",r);
Packit 6c0a39
    goto error;
Packit 6c0a39
  }
Packit 6c0a39
  ssh_scp_close(scp);
Packit 6c0a39
  ssh_scp_free(scp);
Packit 6c0a39
  return 0;
Packit 6c0a39
error:
Packit 6c0a39
  fprintf(stderr,"Error during scp download : %s\n",ssh_get_error(session));
Packit 6c0a39
  if(scp){
Packit 6c0a39
    ssh_scp_close(scp);
Packit 6c0a39
    ssh_scp_free(scp);
Packit 6c0a39
  }
Packit 6c0a39
  return -1;
Packit 6c0a39
}