Files @ 7c0e60f07a51
Branch filter:

Location: DistRen/src/client/libdistren.c

binki
Server and client will connect and send DISTREN_REQUEST_VERSION packets immediately.
/*
  Copyright 2010 Nathan Phillip Brink, Ethan Zonca, Matt Orlando

  This file is a part of DistRen.

  DistRen is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  DistRen is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU Affero General Public License for more details.

  You should have received a copy of the GNU Affero General Public License
  along with DistRen.  If not, see <http://www.gnu.org/licenses/>.
*/

/*
  Implementation of distren_* functions from distren.h excluding distren_job_* functions.
 */

#include "common/config.h"
#include "common/options.h"
#include "common/protocol.h"
#include "common/remoteio.h"
#include "common/request.h"

#include "libdistren.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * Handle common cleanup actions for distren_init().
 */
static void distren_init_cleanup(distren_t distren);

int distren_init(distren_t *handle)
{
  int tmp;

  struct distren_request *req;
  void *data;

  if(!handle)
    return 1;

  *handle = malloc(sizeof(struct distren));
  if(!*handle)
    return 1;

  memset(*handle, 0, sizeof(struct distren));

  /* now the environment is ready for general use */
  if(_distren_getoptions(*handle))
    {
      fprintf(stderr, "error getting configuration\n");
      distren_init_cleanup(*handle);
      return 1;
    }

  tmp = remoteio_open_server(&(*handle)->rem,
			     (*handle)->options->remoteio,
			     (remoteio_read_handle_func_t)&libdistren_remoteio_read_handle,
			     *handle,
			     (remoteio_close_handle_func_t)&libdistren_remoteio_close_handle,
			     (*handle)->server);
  if(tmp)
    {
      fprintf(stderr, "error: unable to connect to server\n");

      distren_init_cleanup(*handle);
      return 1;
    }

  /* send off a DISTREN_REQUEST_VERSION to the server */
  tmp = distren_request_version(&req, &data, DISTREN_SERVERTYPE_CLIENT, PACKAGE_STRING);
  if(tmp)
    {
      fprintf(stderr, "error: unable to allocate request");

      distren_init_cleanup(*handle);
      return 1;
    }
  distren_request_send((*handle)->rem, req, data);
  distren_request_free_with_data(req, data);

  while((*handle)->rem
	&& (*handle)->state == DISTREN_STATE_VERSION)
      multiio_poll((*handle)->multiio, 500);

  if(!(*handle)->rem)
    {
      distren_init_cleanup(*handle);
      return 1;
    }

  return 0;
}

static void distren_init_cleanup(distren_t distren)
{
  if(distren->rem)
    remoteio_close(distren->rem);
  distren->rem = NULL;
  distren_free(distren);
}

/**
 * @todo Stub
 */
int distren_submit_file(distren_t handle, distren_job_t *job, const char *filename)
{
  return 1;
}

int distren_free(distren_t handle)
{
  if(handle->rem)
    remoteio_close(handle->rem);
  free(handle);
  return 0;
}