Exemplo n.º 1
0
static int
server_exec_cmd(int sock, char *cmd)
{
	int argc = 0;
	char *argv[MAXARGS];
	char *save, *p, *nil;
	server_function_t *sf;
	int r;

	log_debug("server_exec_cmd: %s", cmd);

	for (nil = cmd; (p = strtok_r(nil, " ", &save)) && argc < MAXARGS; nil = NULL, ++argc)
	{
		argv[argc] = p;
	}

	if (argc == MAXARGS)
	{
		server_reply(sock, "Too many arguments");
		log_error("server_exec_cmd: Too many arguments");
		return -1;
	}

	sf = sht_lookup(&server_function_table, argv[0]);
	if (sf == NULL)
	{
		sf = sht_lookup(&server_function_table, "help");
		if (sf == NULL)
		{
			log_die(EX_SOFTWARE, "server_exec_cmd: help not found. This is impossible hence fatal.");
		}
	}

	r = sf->sf_callback(sock, argc, argv);
	switch (r)
	{
	case 0:
		server_reply(sock, "CLOSE");
		break;
	case -1:
		log_error("server_exec_cmd: %s failed", argv[0]);
		server_reply(sock, "ERROR");
		break;
	default:
		server_ok(sock);
		break;
	}

	return r;
}
Exemplo n.º 2
0
int
server_data_cmd(int sock, char *cmd, char **buffer)
{
	char recv[RECV_BUFFER];
	int n, size, completed;

	log_debug("server_data_cmd: command '%s'", cmd);
	if (server_reply(sock, cmd) == -1)
	{
		log_error("server_data_cmd: server_reply failed");
		return -1;
	}

	n = read(sock, recv, sizeof recv);
	if (n == -1)
	{
		log_sys_error("server_data_cmd: read");
		return -1;
	}

	size = atoi(recv);
	if (size < 0 || size > MAX_BUFFER)
	{
		log_error("server_data_cmd: bad buffer size");
		return -1;
	}

	*buffer = (char *) malloc(size + 1);
	if (*buffer == NULL)
	{
		log_sys_error("server_data_cmd: malloc");
		return -1;
	}

	if (server_ok(sock))
	{
		log_error("server_data_cmd: server_ok failed");
		return -1;
	}

	for (completed = 0; size > completed; completed += n)
	{
		n = read(sock, *buffer + completed, size - completed);
		if (n == -1)
		{
			log_sys_error("server_data_cmd: read");
			return -1;
		}
	}

	(*buffer)[completed] = 0;

	if (server_check(sock))
	{
		log_error("server_data_cmd: server_check failed");
		return -1;
	}

	return 0;
}
Exemplo n.º 3
0
static int
server_output(int sock, char *buffer, int size)
{
	int n;

	if (server_reply(sock, "%d", size) == -1)
	{
		log_error("server_output: server_reply failed");
		return -1;
	}

	if (server_check(sock))
	{
		log_error("server_output: server_check failed");
		return -1;
	}

	n = write(sock, buffer, size);
	if (n == -1)
	{
		log_sys_error("server_output: write");
		return -1;
	}

	return n;
}
Exemplo n.º 4
0
int
server_help(int sock, int argc, char **argv)
{
	server_function_t *func;
	char buffer[RECV_BUFFER];

	if (strncmp(argv[0], "help", 4))
	{
		server_reply(sock, "Unknown command");
	}
	server_reply(sock, "HELP:");

	for (func = server_functions; func->sf_name; ++func)
	{
		util_concat(buffer, sizeof buffer, func->sf_name, "\t", func->sf_help, NULL);
		server_reply(sock, buffer);
	}
	
	return 1;
}
Exemplo n.º 5
0
int
server_greylist_pass(int sock, int argc, char **argv)
{
	if (argc != 4)
	{
		server_reply(sock, "Usage: %s source from rcpt", argv[0]);
		return -1;
	}

	switch(greylist_pass(argv[1], argv[2], argv[3]))
	{
	case -1:
		log_error("server_greylist_pass: greylist_pass failed");
		return -1;
	case 0:
		server_reply(sock, "Not found");
	default:
		break;
	}

	return 1;
}
Exemplo n.º 6
0
int main(){

    lib_init();

    socket_t * serverSocket = socket_new();
    socket_bind(serverSocket, 5000);
    socket_listen(serverSocket);

    film_maker_t*  film_makers[FILM_MAKERS_AMOUNT];

     for (int i = 0; i < FILM_MAKERS_AMOUNT; i++) {
        film_makers[i] = film_maker_new();

    }

       parse(film_makers,"XML_format.xml");


    while(1) {
        socket_t * clientSocket = socket_accept(serverSocket);
        char buf[102400];

        if(socket_read(clientSocket, buf, 102400) == 0) {
            socket_close(clientSocket);
            socket_free(clientSocket);
            puts("Skipping empty request");
            continue;
        }



        http_request_t req = http_request_parse(buf);

        server_reply(clientSocket, req, film_makers);
//puts("fghj");

        socket_close(clientSocket);
        socket_free(clientSocket);
    }

    for (int i = 0; i < 3; i++)
        film_maker_free(film_makers[i]);

    socket_close(serverSocket);
    socket_free(serverSocket);
          lib_free();
        return 0;
}
Exemplo n.º 7
0
int
server_cmd(int sock, char *cmd)
{
	log_debug("server_cmd: command '%s'", cmd);
	if (server_reply(sock, cmd) == -1)
	{
		log_error("server_data_cmd: server_reply failed");
		return -1;
	}

	if (server_check(sock))
	{
		log_sys_error("server_data_cmd: server_check failed");
		return -1;
	}

	return 0;
}
Exemplo n.º 8
0
int main()
{
    lib_init();
    socket_t * server = socket_new();
    socket_bind(server, 5000);
    socket_listen(server);

    char buf[10000];
    char pathBuf[256];
    socket_t * client = NULL;
    while(1)
    {
        client = socket_accept(server);
        socket_read(client, buf, sizeof(buf));
        http_request_t rs;
        rs = http_request_parse(buf);
        server_reply(client,rs);

    }
    socket_free(server);
    socket_free(client);
    lib_free();
    return 0;
}
Exemplo n.º 9
0
/** Process incoming request message */
static
void server_request(server_t *srv,
		    tport_t *tport,
		    msg_t *request,
		    void *arg,
		    su_time_t now)
{
  nth_site_t *site = NULL, *subsite = NULL;
  msg_t *response;
  http_t *http = http_object(request);
  http_host_t *h;
  char const *host, *port, *path, *subpath = NULL;

  /* Disable streaming */
  if (msg_is_streaming(request)) {
    msg_set_streaming(request, (enum msg_streaming_status)0);
    return;
  }

  /* Create a response message */
  response = server_msg_create(srv, 0, NULL, 0, NULL, NULL);
  tport_tqueue(tport, response, TAG_END());

  if (http && http->http_flags & MSG_FLG_TIMEOUT) {
    server_reply(srv, tport, request, response, 400, "Request timeout");
    return;
  } else if (http && http->http_flags & MSG_FLG_TOOLARGE) {
    server_reply(srv, tport, request, response, HTTP_413_ENTITY_TOO_LARGE);
    return;
  } else if (!http || !http->http_request ||
	     (http->http_flags & MSG_FLG_ERROR)) {
    server_reply(srv, tport, request, response, HTTP_400_BAD_REQUEST);
    return;
  }

  if (http->http_request->rq_version != http_version_1_0 &&
      http->http_request->rq_version != http_version_1_1) {
    server_reply(srv, tport, request, response, HTTP_505_HTTP_VERSION);
    return;
  }

  h = http->http_host;

  if (h) {
    host = h->h_host, port = h->h_port;
  }
  else if (http->http_request->rq_url->url_host) {
    host = http->http_request->rq_url->url_host;
    port = http->http_request->rq_url->url_port;
  }
  else
    host = NULL, port = NULL;

  path = http->http_request->rq_url->url_path;

  if (host)
    site = *site_get_host(&srv->srv_sites, host, port);

  if (site == NULL && !srv->srv_sites->site_strict)
    site = srv->srv_sites;

  if (path == NULL)
    path = "";

  if (path[0])
    subsite = site_get_subdir(site, path, &subpath);

  if (subsite)
    subsite->site_access = now;
  else
    site->site_access = now;

  if (subsite && subsite->site_isdir && subpath == site_nodir_match) {
    /* Answer with 301 */
    http_location_t loc[1];
    http_location_init(loc);

    *loc->loc_url = *site->site_url;

    if (site->site_wildcard) {
      if (http->http_host) {
	loc->loc_url->url_host = http->http_host->h_host;
	loc->loc_url->url_port = http->http_host->h_port;
      }
      else {
	tp_name_t const *tpn = tport_name(tport); assert(tpn);
	loc->loc_url->url_host = tpn->tpn_canon;
	if (strcmp(url_port_default((enum url_type_e)loc->loc_url->url_type), tpn->tpn_port))
	  loc->loc_url->url_port = tpn->tpn_port;
      }
    }

    loc->loc_url->url_root = 1;
    loc->loc_url->url_path = subsite->site_url->url_path;

    msg_header_add_dup(response, NULL, (msg_header_t *)loc);

    server_reply(srv, tport, request, response, HTTP_301_MOVED_PERMANENTLY);
  }
  else if (subsite)
    nth_site_request(srv, subsite, tport, request, http, subpath, response);
  else if (site)
    nth_site_request(srv, site, tport, request, http, path, response);
  else
    /* Answer with 404 */
    server_reply(srv, tport, request, response, HTTP_404_NOT_FOUND);
}
Exemplo n.º 10
0
static
void nth_site_request(server_t *srv,
		      nth_site_t *site,
		      tport_t *tport,
		      msg_t *request,
		      http_t *http,
		      char const *path,
		      msg_t *response)
{
  auth_mod_t *am = site->site_auth;
  nth_request_t *req;
  auth_status_t *as;
  struct auth_info *ai;
  size_t size = (am ? (sizeof *as) + (sizeof *ai) : 0) + (sizeof *req);
  int status;

  req = su_zalloc(srv->srv_home, size);

  if (req == NULL) {
    server_reply(srv, tport, request, response, HTTP_500_INTERNAL_SERVER);
    return;
  }

  if (am)
    as = auth_status_init(req + 1, sizeof *as), ai = (void *)(as + 1);
  else
    as = NULL, ai = NULL;

  req->req_server = srv;
  req->req_method = http->http_request->rq_method;
  req->req_method_name = http->http_request->rq_method_name;
  req->req_url = http->http_request->rq_url;
  req->req_version = http->http_request->rq_version;

  req->req_tport = tport_incref(tport);
  req->req_request = request;
  req->req_response = response;

  req->req_status = 100;
  req->req_close =
    !srv->srv_persistent
    || http->http_request->rq_version != http_version_1_1
    || (http->http_connection &&
	msg_params_find(http->http_connection->k_items, "close"));

  if (am) {
    static auth_challenger_t const http_server_challenger[] =
      {{ HTTP_401_UNAUTHORIZED, http_www_authenticate_class }};

    req->req_as = as;

    as->as_method = http->http_request->rq_method_name;
    as->as_uri = path;

    if (http->http_payload) {
      as->as_body = http->http_payload->pl_data;
      as->as_bodylen = http->http_payload->pl_len;
    }

    auth_mod_check_client(am, as,
			  http->http_authorization,
			  http_server_challenger);

    if (as->as_status == 100) {
      /* Stall transport - do not read more requests */
      if (tport_queuelen(tport) * 2 >= srv->srv_queuesize)
	tport_stall(tport);

      as->as_callback = nth_authentication_result;
      as->as_magic = ai;
      ai->site = site;
      ai->req = req;
      ai->http = http;
      ai->path = path;
      return;
    }
    else if (as->as_status) {
      assert(as->as_status >= 200);
      nth_request_treply(req, as->as_status, as->as_phrase,
			 HTTPTAG_HEADER((http_header_t *)as->as_response),
			 HTTPTAG_HEADER((http_header_t *)as->as_info),
			 TAG_END());
      nth_request_destroy(req);
      return;
    }
  }

  req->req_in_callback = 1;
  status = site->site_callback(site->site_magic, site, req, http, path);
  req->req_in_callback = 0;

  if (status != 0 && (status < 100 || status >= 600))
    status = 500;

  if (status != 0 && req->req_status < 200) {
    nth_request_treply(req, status, NULL, TAG_END());
  }

  if (req->req_status < 100) {
    /* Stall transport - do not read more requests */
    if (tport_queuelen(tport) * 2 >= srv->srv_queuesize)
      tport_stall(tport);
  }

  if (status >= 200 || req->req_destroyed)
    nth_request_destroy(req);
}