Пример #1
0
t_bool			do_take(t_server *s, t_user *user, char *buff)
{
  int			pos;
  int			i;
  char			**tab;

  if ((tab = str_to_wordtab(buff, " \n")) == NULL)
    return (false);
  i = 0;
  pos = user->y * s->option->width + user->x;
  while (i < 7)
    {
      if (tab[1] && strcmp(s->map[pos].stone_list[i].name, tab[1]) == 0
	  && s->map[pos].stone_list[i].nb > 0)
	{
	  update_box_content(s, -1, pos);
	  s->map[pos].stone_list[i].nb--;
	  add_stone_to_user(s, user, tab[1]);
	  send_ok(user->fd);
	  gc_do_take(s, user, i);
	  free_wordtab(tab);
	  return (true);
	}
      ++i;
    }
  free_wordtab(tab);
  return (false);
}
Пример #2
0
static void ok_start_game(int fd)
{
    struct game * g = find_game_by_fd(fd);
    if (g) {
        if (g->status == GAME_STATUS_PLAYING) {
            int i;
            for (i = 0; i < g->players_number; i++) {
                if (g->players_conn[i] == fd) {
                    if (!g->players_started[i]) {
                        if (remote_proto_minor[g->players_conn[i]] >= 1)
                            send_ok(fd, "OK_GAME_START");
                        g->players_started[i] = 1;
                        l1(OUTPUT_TYPE_DEBUG, "[%d] entering prio mode", g->players_conn[i]);
                        add_prio(g->players_conn[i]);
                    } else {
                        send_line_log(fd, wn_already_ok_started, "OK_GAME_START");
                    }
                }
            }
        } else {
            send_line_log(fd, wn_not_started, "OK_GAME_START");
        }
    } else {
        l0(OUTPUT_TYPE_ERROR, "Internal error");
        exit(EXIT_FAILURE);
    }
}
Пример #3
0
void Control_Confirmation::on_Applay_clicked()
{
    if(flag){
        emit send_ok(name,Is_Delay,on_off);
    }
    this->accept();
}
Пример #4
0
int		get_objs(int fd, t_scene *scene)
{
  int		i;

  if (send_ok(fd) || (scene->nb_obj = read_number(fd)) <= 0 ||
      !(scene->objs = my_calloc(scene->nb_obj + 1, sizeof(t_obj))))
    return (1);
  i = 0;
  while (i < scene->nb_obj)
    {
      write(1, "Loading objs\n", 13);
      if (send_ok(fd) || read(fd, &scene->objs[i], sizeof(t_obj)) == -1)
	return (1);
      ++i;
    }
  send_ok(fd);
  write(1, "Obj loaded\n", 11);
  return (0);
}
Пример #5
0
/** Add new RR data */
static void
do_data_add(SSL* ssl, struct worker* worker, char* arg)
{
	if(!local_zones_add_RR(worker->daemon->local_zones, arg,
		worker->env.scratch_buffer)) {
		ssl_printf(ssl,"error in syntax or out of memory, %s\n", arg);
		return;
	}
	send_ok(ssl);
}
Пример #6
0
/** do the verbosity command */
static void
do_verbosity(SSL* ssl, char* str)
{
	int val = atoi(str);
	if(val == 0 && strcmp(str, "0") != 0) {
		ssl_printf(ssl, "error in verbosity number syntax: %s\n", str);
		return;
	}
	verbosity = val;
	send_ok(ssl);
}
Пример #7
0
static void kick_player(int fd, struct game * g, char * nick)
{
    int i;
    for (i = 0; i < g->players_number; i++) {
        if (g->players_conn[i] != fd && streq(g->players_nick[i], nick)) {
            send_ok(fd, "KICK");
            send_line_log_push(g->players_conn[i], "KICKED");
            player_part_game_(g->players_conn[i], ok_player_kicked);
            return;
        }
    }
    send_line_log(fd, wn_no_such_player, "KICK");
}
Пример #8
0
/** Remove RR data */
static void
do_data_remove(SSL* ssl, struct worker* worker, char* arg)
{
	uint8_t* nm;
	int nmlabs;
	size_t nmlen;
	if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
		return;
	local_zones_del_data(worker->daemon->local_zones, nm,
		nmlen, nmlabs, LDNS_RR_CLASS_IN);
	free(nm);
	send_ok(ssl);
}
Пример #9
0
/** Add a new zone */
static void
do_zone_add(SSL* ssl, struct worker* worker, char* arg)
{
	uint8_t* nm;
	int nmlabs;
	size_t nmlen;
	char* arg2;
	enum localzone_type t;
	struct local_zone* z;
	if(!find_arg2(ssl, arg, &arg2))
		return;
	if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
		return;
	if(!local_zone_str2type(arg2, &t)) {
		ssl_printf(ssl, "error not a zone type. %s\n", arg2);
		free(nm);
		return;
	}
	lock_quick_lock(&worker->daemon->local_zones->lock);
	if((z=local_zones_find(worker->daemon->local_zones, nm, nmlen, 
		nmlabs, LDNS_RR_CLASS_IN))) {
		/* already present in tree */
		lock_rw_wrlock(&z->lock);
		z->type = t; /* update type anyway */
		lock_rw_unlock(&z->lock);
		free(nm);
		lock_quick_unlock(&worker->daemon->local_zones->lock);
		send_ok(ssl);
		return;
	}
	if(!local_zones_add_zone(worker->daemon->local_zones, nm, nmlen, 
		nmlabs, LDNS_RR_CLASS_IN, t)) {
		lock_quick_unlock(&worker->daemon->local_zones->lock);
		ssl_printf(ssl, "error out of memory\n");
		return;
	}
	lock_quick_unlock(&worker->daemon->local_zones->lock);
	send_ok(ssl);
}
Пример #10
0
/** flush a type */
static void
do_flush_type(SSL* ssl, struct worker* worker, char* arg)
{
	uint8_t* nm;
	int nmlabs;
	size_t nmlen;
	char* arg2;
	uint16_t t;
	if(!find_arg2(ssl, arg, &arg2))
		return;
	if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
		return;
	t = ldns_get_rr_type_by_name(arg2);
	do_cache_remove(worker, nm, nmlen, t, LDNS_RR_CLASS_IN);
	
	free(nm);
	send_ok(ssl);
}
Пример #11
0
int do_dirlist(const char * name, http_state_t * hs, file_t f) {
	char * dl, *dlout;
	dirent_t * d;
	int dlsize, r;

	dl = malloc(65536);
	dlout = dl;

	sprintf(dlout, "<html><head><title>Listing of %s</title></head></html>\n<body bgcolor=\"white\">\n", name);
	dlout += strlen(dlout);

	sprintf(dlout, "<h4>Listing of %s</h4>\n<hr>\n<table>\n", name);
	dlout += strlen(dlout);

	while ((d = fs_readdir(f))) {
		if (d->size >= 0) {
			sprintf(dlout, "<tr><td><a href=\"%s\">%s</a></td><td>%d</td></tr>\n", d->name, d->name, d->size);
			dlout += strlen(dlout);
		} else {
			sprintf(dlout, "<tr><td><a href=\"%s/\">%s/</a></td><td>%d</td></tr>\n", d->name, d->name, d->size);
			dlout += strlen(dlout);
		}
	}

	sprintf(dlout, "</table>\n<hr>\nKOSHttp/1.0 server\n</body></html>\n");
	dlout += strlen(dlout);

	dlsize = strlen(dl);

	send_ok(hs, "text/html");
	dlout = dl;
	while (dlsize > 0) {
		r = write(hs->socket, dlout, dlsize);
		if (r <= 0)
			return -1;
		dlsize -= r;
		dlout += r;
	}

	free(dl);

	return 0;
}
Пример #12
0
/** Remove a zone */
static void
do_zone_remove(SSL* ssl, struct worker* worker, char* arg)
{
	uint8_t* nm;
	int nmlabs;
	size_t nmlen;
	struct local_zone* z;
	if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
		return;
	lock_quick_lock(&worker->daemon->local_zones->lock);
	if((z=local_zones_find(worker->daemon->local_zones, nm, nmlen, 
		nmlabs, LDNS_RR_CLASS_IN))) {
		/* present in tree */
		local_zones_del_zone(worker->daemon->local_zones, z);
	}
	lock_quick_unlock(&worker->daemon->local_zones->lock);
	free(nm);
	send_ok(ssl);
}
Пример #13
0
static void close_game(int fd)
{
    struct game * g = find_game_by_fd(fd);
    if (g) {
        if (g->players_conn[0] == fd) {
            if (g->players_number == 1) {
                send_line_log(fd, wn_alone_in_the_dark, "CLOSE");
                return;
            }
            send_ok(fd, "CLOSE");
            g->status = GAME_STATUS_CLOSED;
            calculate_list_games();
        } else {
            send_line_log(fd, wn_not_creator, "CLOSE");
        }

    } else {
        l0(OUTPUT_TYPE_ERROR, "Internal error");
        exit(EXIT_FAILURE);
    }
}
Пример #14
0
static void
msn_xfer_init(PurpleXfer *xfer)
{
	MsnSlpCall *slpcall;
	/* MsnSlpLink *slplink; */
	char *content;

	pecan_info ("xfer_init");

	slpcall = xfer->data;

	/* Send Ok */
        content = pecan_strdup_printf("SessionID: %lu\r\n\r\n",
                                      slpcall->session_id);

	send_ok(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody",
			content);

	g_free(content);
	msn_slplink_unleash(slpcall->slplink);
}
Пример #15
0
/** remove name rrset from cache */
static void
do_flush_name(SSL* ssl, struct worker* w, char* arg)
{
	uint8_t* nm;
	int nmlabs;
	size_t nmlen;
	if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
		return;
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_A, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_AAAA, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_NS, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_SOA, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_CNAME, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_DNAME, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_MX, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_PTR, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_SRV, LDNS_RR_CLASS_IN);
	do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_NAPTR, LDNS_RR_CLASS_IN);
	
	free(nm);
	send_ok(ssl);
}
Пример #16
0
static void start_game(int fd)
{
    struct game * g = find_game_by_fd(fd);
    if (g) {
        if (g->players_conn[0] == fd) {
            if (g->players_number == 1) {
                send_line_log(fd, wn_alone_in_the_dark, "START");
                return;
            }
            send_ok(fd, "START");
            real_start_game(g);
            calculate_list_games();
            l2(OUTPUT_TYPE_INFO, "running games increments to: %d (%d players)", games_running, players_in_game);
        } else {
            send_line_log(fd, wn_not_creator, "START");
        }

    } else {
        l0(OUTPUT_TYPE_ERROR, "Internal error");
        exit(EXIT_FAILURE);
    }
}
Пример #17
0
static void setoptions(int fd, char* options)
{
    struct game * g = find_game_by_fd(fd);
    if (g) {
        if (g->players_conn[0] == fd) {
            int i;
            char* msg;
            send_ok(fd, "SETOPTIONS");
            msg = asprintf_("OPTIONS: %s,PROTOCOLLEVEL:%d", options, min_protocol_level(g));
            for (i = 0; i < g->players_number; i++)
                if (remote_proto_minor[g->players_conn[i]] >= 1)
                    send_line_log_push(g->players_conn[i], msg);
            free(msg);
        } else {
            send_line_log(fd, wn_not_creator, "SETOPTIONS");
        }

    } else {
        l0(OUTPUT_TYPE_ERROR, "Internal error");
        exit(EXIT_FAILURE);
    }
}
Пример #18
0
static void leader_check_game_start(int fd)
{
    struct game * g = find_game_by_fd(fd);
    if (g) {
        if (g->status == GAME_STATUS_PLAYING) {
            int i;
            for (i = 0; i < g->players_number; i++) {
                if (fd != g->players_conn[i]) {
                    if (!g->players_started[i]) {
                        send_line_log(fd, wn_others_not_ready, "LEADER_CHECK_GAME_START");
                        return;
                    }
                }
            }
            send_ok(fd, "LEADER_CHECK_GAME_START");
        } else {
            send_line_log(fd, wn_not_started, "LEADER_CHECK_GAME_START");
        }
    } else {
        l0(OUTPUT_TYPE_ERROR, "Internal error");
        exit(EXIT_FAILURE);
    }
}
Пример #19
0
static void
handler (ShpHttpRequest request, const gchar * path, const gchar * query,
    GSocketConnection * connection, gpointer user_data)
{
  ShpRest *self = SHP_REST (user_data);
  GOutputStream *out;

  g_debug ("rest: incomming connection");

  out = g_io_stream_get_output_stream (G_IO_STREAM (connection));

  if (request != SHP_HTTP_GET && request != SHP_HTTP_POST) {
    g_debug ("rest: unsupported request type");
    send_error (out, 400, "Invalid request");
    return;
  }

  g_debug ("rest: path: %s, query: %s", path, query);

  if (request == SHP_HTTP_GET && query == NULL) {
    /* no query, just collect data for all sensors belonging to requested
     * path */
    ShpJsonNode *node;
    ResponseData *response_data;

    node = shp_json_node_new_object (NULL);

    response_data = g_new0 (ResponseData, 1);
    response_data->node = node;
    response_data->path = (gchar *)path;

    g_mutex_lock (&self->mutex);
    g_hash_table_foreach (self->devices, json_builder_add_device_objects,
        response_data);
    g_mutex_unlock (&self->mutex);

    g_free (response_data);

    send_ok (out, node);
    shp_json_node_free (node);
  } else if (request == SHP_HTTP_GET) {
    /* create request based on input command */
    ShpMessage *event;

    /* first check if requested path is valid and we know about it */
    g_mutex_lock (&self->mutex);
    event = g_hash_table_lookup (self->devices, path);
    if (event)
      event = g_object_ref (event);
    g_mutex_unlock (&self->mutex);

    if (!event) {
      send_error (out, 400, "Invalid request");
      goto out;
    }

    if (!g_strcmp0 (query, "history")) {
      ShpJsonNode *node;
      ShpJsonNode *array_node;
      ShpJsonNode *object;
      GPtrArray *arr;

      node = shp_json_node_new_object (NULL);
      array_node = shp_json_node_new_array (path);
      shp_json_node_append_element (node, array_node);

      object = shp_json_node_new_object (NULL);
      shp_message_foreach (event, json_builder_add_event_elements, object);
      shp_json_node_append_element (array_node, object);

      g_object_unref (event);

      arr = g_hash_table_lookup (self->history, path);
      if (arr) {
        gint i;
        for (i = 0; i < arr->len; i++) {
          event = g_ptr_array_index (arr, i);
          object = shp_json_node_new_object (NULL);
          shp_message_foreach (event, json_builder_add_event_elements, object);
          shp_json_node_append_element (array_node, object);
        }
      }

      send_ok (out, node);
      shp_json_node_free (node);
    } else {
      send_error (out, 400, "Invalid request");
      g_object_unref (event);
      goto out;
    }
  } else if (request == SHP_HTTP_POST) {
    gchar *event_str;
    ShpMessage *event;
    ShpJsonNode *object;

    event = shp_message_new_command (path);
    if (!event) {
      send_error (out, 400, "Invalid request");
      goto out;
    }

    event_str = shp_message_to_string (event);
    g_debug ("rest: about to post: %s", event_str);
    g_free (event_str);

    object = shp_json_node_new_object (NULL);
    send_ok (out, object);
    shp_json_node_free (object);

    shp_component_post_message (SHP_COMPONENT (self), event);
  }

out:
  return;
}
Пример #20
0
/** flush requestlist */
static void
do_flush_requestlist(SSL* ssl, struct worker* worker)
{
	mesh_delete_all(worker->env.mesh);
	send_ok(ssl);
}
Пример #21
0
/** flush statistics */
static void
do_flush_stats(SSL* ssl, struct worker* worker)
{
	worker_stats_clear(worker);
	send_ok(ssl);
}
Пример #22
0
int main(int argc, char **argv) 
{
  ETERM *tuplep;
  ETERM *fnp, *argp;
  byte buf[1024];

  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

  log = fopen("/tmp/sqlite_port.log", "a+");
  fprintf(log, "******start log (%s)******\n", argv[1]);
  fflush(log);

  rc = sqlite3_open(argv[1], &db);
  if (rc) {
    sqlite3_close(db);
    exit(1);
  }

  erl_init(NULL, 0);

  while (read_cmd(buf) > 0) {
    tuplep = erl_decode(buf);
    fnp = erl_element(1, tuplep);
    argp = erl_element(2, tuplep);
    
    if (strncmp((const char *)ERL_ATOM_PTR(fnp), "close", 5) == 0) {
      fprintf(log, "closing sqlite3_close\n");
      fflush(log);

      sqlite3_close(db);
      break;
    }
    else if (strncmp((const char *)ERL_ATOM_PTR(fnp), "list_tables", 11) == 0) {
      fprintf(log, "calling list_tables\n");

      result = 0;

      rc = sqlite3_exec(db, MASTER_QUERY, list_tables, 0, &zErrMsg);
      if (rc != SQLITE_OK) {
	send_error(zErrMsg);
	sqlite3_free(zErrMsg);
      }
      else if (result != 0)  {
	send_result();
      }
      else {
	// not an error and no results. still need to return something
	send_ok();
      } 

      fflush(log);

    }
    else if (strncmp((const char *)ERL_ATOM_PTR(fnp), "sql_exec", 8) == 0) {
      fprintf(log, "calling sqlite3_exec %s\n", erl_iolist_to_string(argp));

      result = 0;

      rc = sqlite3_exec(db, erl_iolist_to_string(argp), callback, 0, &zErrMsg);
      if (rc != SQLITE_OK) {
	send_error(zErrMsg);
	sqlite3_free(zErrMsg);
      }
      else if (result != 0)  {
	send_result();
      }
      else {
	// not an error and no results. still need to return something
	send_ok();
      } 

      fflush(log);
    }

    erl_free_compound(tuplep);
    erl_free_term(fnp);
    erl_free_term(argp);
  }

  fprintf(log, "******end log******\n");
  fclose(log);
  return 0;
}
Пример #23
0
static void do_set_cfg(void* arg)
{
    PortState* state = (PortState*)arg;

    erl_drv_mutex_lock(G_ENGINE_STATE_LOCK);
    if (G_ENGINE_STATE == ENGINE_STOPPED)
    {
        char* key   = UNPACK_STRING(state->work_buffer, 0);
        const char* value = UNPACK_STRING(state->work_buffer, strlen(key)+1);

        if (strcmp(key, "error_log") == 0)
        {
            if (set_log_file(value) == 0)
            {
                send_ok(state);
            }
            else
            {
                send_error_atom(state, "einval");
            }
        }
        else
        {
            // Check the expected type of the provided key so as to 1. validate it's a good key
            // and 2. know what setter to use.
            ib_cfg_type_t key_type;
            ib_err_t error = ib_cfg_var_get_type(key, &key_type);
            if (error == DB_SUCCESS)
            {
                if (key_type == IB_CFG_TEXT)
                {
                    // HACK: Semantics of setting a text configuration value for innodb changed
                    // to be pointer assignment (from copy) for vsn 1.0.6.6750. So, we strdup the
                    // value to ensure everything works as expected.
                    // TODO: Setup some sort of list of strdup'd values to ensure they all get
                    // cleaned up properly. In typical usage, this isn't going to be a problem
                    // as you only initialize once per run, but it bothers me just the same.
                    error = ib_cfg_set(key, strdup(value));
                }
                else
                {
                    ErlDrvUInt value_i;
                    UNPACK_INT(state->work_buffer, strlen(key)+1, &value_i);
                    error = ib_cfg_set(key, value_i);
                }

            }

            if (error == DB_SUCCESS)
            {
                send_ok(state);
            }
            else
            {
                send_error_str(state, ib_strerror(error));
            }
        }
    }
    else
    {
        send_error_atom(state, "starting");
    }

    erl_drv_mutex_unlock(G_ENGINE_STATE_LOCK);
}
Пример #24
0
static int parse_client_line(const int client_socket, char *msg)
{
  char *token;
  
  /* On récupère le premier mot, s'il est vide, on retourne direct  */
  if (!(token = strtok(msg, " ")))
    return MSG_OK;

  /*****************************************************************************
   *                              CMD_QUIT
   ****************************************************************************/
  if (!strcmp(CMD_QUIT, token))
    {
      send_ok(client_socket, DETAIL_RET_QUIT);
      return MSG_QUIT;
    }
  
  /*****************************************************************************  
   *                          CMD_CREATE_PROCESS 
   ****************************************************************************/
  else if (!strcmp(CMD_CREATE_PROCESS, token))
    {
      char *args[MAX_ARGS];
      char **pc = args;

      /* On récup le nom du prog */
      if (!(token = strtok(NULL, " ")))
	{
	  send_failure(client_socket, DETAIL_RET_CREATE_PROCESS_SYNTAX);
	  return MSG_ERR;
	}
      
      /* strtok renvoie un buffer static, on le copie */
      /* *pc = args[0] = nom du programme */
      if (!(*pc++ = strdup(token))) 
	{
	  perror("strdup");
	  return MSG_ERR;
	}
      
      /* La suite devient optionelle, c'est les arguments */
      while ((token = strtok(NULL, " ")))
	{
	  if ((*pc++ = strdup(token)) == NULL)
	    {
	      perror("strdup");
	      return MSG_ERR;
	    }
	}
      
      *pc = NULL;             /* Fin des arguments */
      
      /* On crée le processus */
      pid_t proc = create_process(args[0], args);

      /* Le processus n'a pas pu être créé */
      if (proc == -1) {
	send_failure(client_socket, DETAIL_RET_CREATE_PROCESS_ERROR);
	return MSG_ERR;
      }

      send_ok(client_socket, itoa(proc));
      return MSG_OK;
    }

  /*****************************************************************************  
   *                          CMD_DESTROY_PROCESS 
   ****************************************************************************/
  else if (!strcmp(CMD_DESTROY_PROCESS, token))
    {
      if ((token = strtok(NULL, " ")) == NULL)
	{
	  send_failure(client_socket, DETAIL_RET_DESTROY_PROCESS_SYNTAX);
	  return MSG_ERR;
	}
      
      pid_t process_to_kill = atoi(token);
      
      if (!process_exists(process_to_kill))
	{
	  send_failure(client_socket, DETAIL_RET_UNKNOWN_PROCESS);
	  return MSG_ERR;
	}
      
      destroy_process(process_to_kill);
      send_ok(client_socket, NULL);
      return MSG_OK;
    }

  /*****************************************************************************  
   *                          CMD_SEND_INPUT      
   ****************************************************************************/
  else if (!strcmp(CMD_SEND_INPUT, token))
    {
      char buffer[MESSAGE_BUFFER_SIZE];
      buffer[0] = '\0';
      
      /* On récup le PID */
      if ((token = strtok(NULL, " ")) == NULL)
	{
	  send_failure(client_socket, DETAIL_RET_SEND_INPUT_SYNTAX);
	  return MSG_ERR;
	}
      
      /* Il existe ? */
      pid_t send_to_process = atoi(token);
      if (!process_exists(send_to_process))
	{
	  send_failure(client_socket, DETAIL_RET_UNKNOWN_PROCESS);
	  return MSG_ERR;
	}
      
      /* Il est déjà terminé ? */
      if (get_return_code(send_to_process) != PROCESS_NOT_TERMINATED)
	{
	  send_failure(client_socket, DETAIL_RET_PROCESS_TERMINATED);
	  return MSG_ERR;
	}

      /* Son stdin est ouvert ? */
      if (!input_open(send_to_process))
	{
	  send_failure(client_socket, DETAIL_RET_INPUT_CLOSE);
	  return MSG_ERR;
	}

      /* On récup' le message à envoyer  */
      /* TODO: Prendre la chaîne telle qu'elle, sans splitter puis merger avec un espace */
      while ((token = strtok(NULL, " ")))
	{
	  strcat(buffer, token);
	  strcat(buffer, " ");
	}
      
      /* Si le message est vide, erreur ! */
      if (strlen(buffer) == 0)
	{
	  send_failure(client_socket, DETAIL_RET_SEND_INPUT_SYNTAX);
	  return MSG_ERR;
        }
      
      /* Sinon on envoie ! */
      send_input(send_to_process, buffer);
      send_ok(client_socket, NULL);
      return MSG_OK;
    }


  /*****************************************************************************  
   *                          CMD_CLOSE_INPUT     
   ****************************************************************************/
  else if (!strcmp(CMD_CLOSE_INPUT, token))
    {
      if ((token = strtok(NULL, " ")) == NULL)
	{
	  send_failure(client_socket, DETAIL_RET_CLOSE_INPUT_SYNTAX);
	  return MSG_ERR;
        }
      
      pid_t process_to_close_input = atoi(token);
      if (!process_exists(process_to_close_input))
	{
	  send_failure(client_socket, DETAIL_RET_UNKNOWN_PROCESS);
	  return MSG_ERR;
	}

      close_input(process_to_close_input);
      send_ok(client_socket, NULL);
      return MSG_OK;
    }
  
  /*****************************************************************************  
   *                          CMD_GET_OUTPUT
   ****************************************************************************/
  else if (!strcmp(CMD_GET_OUTPUT, token))
    {
      if ((token = strtok(NULL, " ")) == NULL)
	{
	  send_failure(client_socket, DETAIL_RET_GET_OUTPUT_SYNTAX);
	  return MSG_ERR;
	}
      
      pid_t process_to_get_output = atoi(token);
      if (!process_exists(process_to_get_output))
	{
	  send_failure(client_socket, DETAIL_RET_UNKNOWN_PROCESS);
	  return MSG_ERR;
        }
     
      get_output(client_socket, process_to_get_output);
      send_ok(client_socket, NULL);
      return MSG_OK;
    }


  /*****************************************************************************  
   *                          CMD_GET_ERROR
   ****************************************************************************/
  else if (!strcmp(CMD_GET_ERROR, token))
    {
      if ((token = strtok(NULL, " ")) == NULL)
	{
	  send_failure(client_socket, DETAIL_RET_GET_ERROR_SYNTAX);
	  return MSG_ERR;
        }
      
      pid_t process_to_get_error = atoi(token);
      if (!process_exists(process_to_get_error))
	{
	  send_failure(client_socket, DETAIL_RET_UNKNOWN_PROCESS);
	  return MSG_ERR;
	}
      
      get_error(client_socket, process_to_get_error);
      send_ok(client_socket, NULL);
      return MSG_OK;
    }


  /*****************************************************************************  
   *                          CMD_GET_RETURN_CODE
   ****************************************************************************/
  else if (!strcmp(CMD_GET_RETURN_CODE, token))
    {
      if ((token = strtok(NULL, " ")) == NULL)
	{
	  send_failure(client_socket, DETAIL_RET_GET_RETURN_CODE_SYNTAX);
	  return MSG_ERR;
        }
      
      pid_t process_to_get_ret = atoi(token);
      if (!process_exists(process_to_get_ret))
	{
	  send_failure(client_socket, DETAIL_RET_UNKNOWN_PROCESS);
	  return MSG_ERR;
	}
      
      int ret = get_return_code(process_to_get_ret);
      if (ret == PROCESS_NOT_TERMINATED)
	{
	  send_failure(client_socket, DETAIL_RET_GET_RETURN_CODE_ERROR);
	  return MSG_ERR;
	}
      
      send_ok(client_socket, itoa(ret));
      return MSG_OK;
    }

  /*****************************************************************************  
   *                          CMD_LIST_PROCESS   
   ****************************************************************************/
  else if (!strcmp(CMD_LIST_PROCESS, token))
    {
      list_process(client_socket);
      send_ok(client_socket, NULL);
      return MSG_OK;
    }

  /*****************************************************************************  
   *                          CMD_GET_HELP
   ****************************************************************************/
  else if (!strcmp(CMD_GET_HELP, token))
    {
      send_basic(client_socket, help, strlen(help));
      return MSG_OK;
    }

  /*****************************************************************************  
   *                        COMMANDE INCONNUE
   ****************************************************************************/
  else
    {
      send_failure(client_socket, DETAIL_RET_UNKNOWN_COMMAND);
      return MSG_UNKNOWN_COMMAND;
    }
}
Пример #25
0
/* On success, return socket_fd for UDP socket.
 * On failure, exit.
 */
int init_receiver()
{

	/* 1. Make sure we can talk to parent (client control process) */
	printf("Trying to open client channel\n");

	open_client_channel(&ctrl2rcvr_qid);

	/**** YOUR CODE TO FILL IMPLEMENT STEPS 2 AND 3 ****/


	/* 2. Initialize UDP socket for receiving chat messages. */
	//L: We need to ask the OS for an available UDP port.
	//   This may be a random port-number currently available, not the one we specified by command line.
	//   This is the port that the server should send a reply to.
	int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (sockfd < 0) {
		perror("RECEIVER ERROR: Failed to open socket. Sorry bro.\n");
		send_error(ctrl2rcvr_qid, SOCKET_FAILED);
		exit(EXIT_FAILURE);
	}

	// L: set socket so that it can be re-used if client is killed:
	int optval = 1; //option value. (not optional value)
	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof (int)) == -1) {
		perror("RECEIVER ERROR: Failed to set tocket options. Sorry bro\n");
		send_error(ctrl2rcvr_qid, SOCKET_OPTION_FAILED);
		exit(EXIT_FAILURE);
	}

	// L: Configure to use any local ip address, and request port from OS.
	struct sockaddr_in server_addr;
	socklen_t server_addr_len = sizeof(server_addr);

	memset((char *) &server_addr, '\0', sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);  // Bind to any available IP address on local host.
	server_addr.sin_port = 0; 	// Request port from OS.

	if (bind(sockfd, (struct sockaddr *) & server_addr,  server_addr_len) < 0) {
		perror("RECEIVER ERROR: Failed to bind socket. Sorry bro\n");
		send_error(ctrl2rcvr_qid, BIND_FAILED);
		exit(EXIT_FAILURE);
	}

	// find out which port the OS has given us.
	if( getsockname(sockfd, (struct sockaddr *)&server_addr, &server_addr_len) < 0 ) {
		perror("RECEIVER ERROR: getsockname failed. Sorry bro\n");
		send_error(ctrl2rcvr_qid, NAME_FAILED);
		exit(EXIT_FAILURE);
	}
	u_int16_t os_assigned_udp_port = ntohs(server_addr.sin_port);

#ifdef DEBUG
	printf("client receiver listening on UDP port: %d\n", (unsigned) os_assigned_udp_port);
#endif

	/* 3. Tell parent the port number if successful, or failure code if not.
	 *    Use the send_error and send_ok functions
	 */
	send_ok(ctrl2rcvr_qid, os_assigned_udp_port);

	return sockfd;
}
Пример #26
0
//! process a request message
static index_error process_request ( index_data_t *index_data_, 
    void *server, void *data, size_t data_sz)
{ dbg_message (__func__);

	index_error errcode = FUNC_OK;
	
	// decode the message
	AiTownIndex * incoming = AiTownIndex__unpack (data_sz, data);
	if ( incoming == NULL ) {
		send_error (server, "Error decoding incoming message");
		return FUNC_OK;
	}
	
	// check the version - the only one that we know of is 1
	if ( incoming->version != 1 ) {
		send_error (server, "Unsupported version");
		AiTownIndex__free_unpacked (incoming);
		return FUNC_OK;
	}
	
	// type based processing
	switch ( incoming->type ) {
	case   AI_TOWN_INDEX_MESSAGE_TYPE__AITMT_INDEX_ADD: {
	
		// check the sanity of incoming data
		if ( ( incoming->add == NULL ) || 
		      ( incoming->add->name == NULL ) ||
		      ( incoming->add->address == NULL ) ||
		      ( !incoming->add->has_port ) ||
		      ( incoming->add->port <= 0 ) ) {
			send_error (server, "Malformed add request");
			break;
		}
		
		// allocate a new server structure for this
		server_data_t * sd;
		server_data_t * sd_other;
		errcode = server_data_new (&sd, incoming->add->name, 
		    incoming->add->address, incoming->add->port);
		if ( errcode != FUNC_OK ) {
			send_error (server, "Internal error");
			break;
		}
		
		// see if a server with this name already exists and remove it if so
		sd_other = index_data_get_server (index_data_, sd->name);
		if ( sd_other != NULL ) {
			index_data_rem_server (index_data_, sd_other );
			server_data_delete (&sd_other);
		}
		index_data_add_server (index_data_, sd);
		log_message ("Added server %s", sd->name);
		send_ok (server);
		break; }
		
	case   AI_TOWN_INDEX_MESSAGE_TYPE__AITMT_INDEX_REM: {
	
		// check the sanity of incoming data
		if ( ( incoming->rem == NULL ) ||
		      ( incoming->rem->name == NULL ) ) {
			send_error (server, "Malformed remove request");
			break;
		}
		
		// find the server in question
		const char * name = incoming->rem->name;
		server_data_t * sd;
		sd = index_data_get_server (index_data_, name);
		
		// and remove it
		if ( sd == NULL ) {
			send_error (server, "Attempt to close unexisting server");
			err_message (name);
		} else {
			index_data_rem_server (index_data_, sd );
			server_data_delete (&sd);
			log_message ("Removed server %s", name);
			send_ok (server);
		}
		break; }
	case   AI_TOWN_INDEX_MESSAGE_TYPE__AITMT_INDEX_LIST: {
		send_list (index_data_, server);
		break; }
	default:
		send_error (server, "Unknown incoming message type");
		err_message( "Requested type was %d", incoming->type );
	}

	// release serialized data
	AiTownIndex__free_unpacked (incoming);
	return errcode;
}
Пример #27
0
void client_thread(void *p) {
	http_state_t * hs = (http_state_t *)p;
	char * buf, * ext;
	const char * ct;
	file_t f = -1;
	int r, o, cnt;
	stat_t st;

	printf("httpd: client thread started, sock %d\n", hs->socket);

	buf = malloc(BUFSIZE);

	if (read_headers(hs, buf, BUFSIZE) < 0) {
		goto out;
	}

	printf("httpd: client requested '%s'\n", buf);

	// Is it a directory or a file?
	f = fs_open(buf, O_RDONLY | O_DIR);
	if (f >= 0) {
		do_dirlist(buf, hs, f);
	} else {
		f = fs_open(buf, O_RDONLY);
		if (f < 0) {
			send_error(hs, 404, "File not found or unreadable");
			goto out;
		}

		ext = strrchr(buf, '.');
		ct = "application/octet-stream";
		if (ext) {
			ext++;
			if (!strcasecmp(ext, "jpg"))
				ct = "image/jpeg";
			else if (!strcasecmp(ext, "png"))
				ct = "image/png";
			else if (!strcasecmp(ext, "gif"))
				ct = "image/gif";
			else if (!strcasecmp(ext, "txt"))
				ct = "text/plain";
			else if (!strcasecmp(ext, "mp3"))
				ct = "audio/mpeg";
			else if (!strcasecmp(ext, "ogg"))
				ct = "application/ogg";
			else if (!strcasecmp(ext, "html"))
				ct = "text/html";
		}

		send_ok(hs, ct);
		while ((cnt = fs_read(f, buf, BUFSIZE)) != 0) {
			o = 0;
			while (cnt > 0) {
				r = write(hs->socket, buf+o, cnt);
				if (r <= 0)
					goto out;
				cnt -= r;
				o += r;
			}
		}
	}
	fs_close(f);

out:
	free(buf);
	printf("httpd: closed client connection %d\n", hs->socket);
	close(hs->socket);
	st_destroy(hs);
	if (f >= 0)
		fs_close(f);
}
Пример #28
0
static void
web_handler (ShpHttpRequest request, const gchar * path, const gchar * query,
    GSocketConnection * connection, gpointer user_data)
{
  ShpRest *self = SHP_REST (user_data);
  GFile *file;
  GFileInputStream *input_stream;
  GDataInputStream *data;
  GError *error = NULL;
  GOutputStream *out;
  gchar *line;
  ShpJsonNode *node;

  out = g_io_stream_get_output_stream (G_IO_STREAM (connection));

  if (request != SHP_HTTP_GET) {
    g_debug ("rest: unsupported request type");
    send_error (out, 400, "Invalid request");
    return;
  }

  if (self->config_file == NULL) {
    g_warning ("rest: config file not specified");
    send_error (out, 500, "Internal server error");
    return;
  }

  /* FIXME: load file at start */
  file = g_file_new_for_path (self->config_file);
  input_stream = g_file_read (file, NULL, &error);
  if (!input_stream) {
    g_warning ("rest: error reading config file: %s", error->message);
    g_clear_error (&error);
    send_error (out, 500, "Internal server error");
    return;
  }

  data = g_data_input_stream_new (G_INPUT_STREAM (input_stream));

  node = shp_json_node_new_object (NULL);

  while (TRUE) {
    guint i;
    gchar **options_list;
    ShpJsonNode *obj = NULL;
    ShpJsonNode *arr = NULL;

    //plugin:device-type:type1,option1:type2,option2

    line = g_data_input_stream_read_line (data, NULL, NULL, NULL);
    if (!line)
      break;

    g_debug ("rest: config file line: %s", line);

    options_list = g_strsplit (line, ":", 0);
    for (i = 0; options_list[i] != NULL; i++) {
      ShpJsonNode *child;
      ShpJsonNode *grand_child;
      gchar **params;

      switch (i) {
        case 0:
          obj = shp_json_node_new_object (options_list[i]);
          break;
        case 1:
          child = shp_json_node_new_string ("device-type", options_list[i]);
          shp_json_node_append_element (obj, child);
          break;
        case 2:
          arr = shp_json_node_new_array ("display-options");
          /* fall trhough */
        default:
          params = g_strsplit (options_list[i], " ", 0);
          if (params && params[0] && params[1] && !params[2]) {
            child = shp_json_node_new_object (NULL);
            grand_child = shp_json_node_new_string ("option", params[0]);
            shp_json_node_append_element (child, grand_child);
            grand_child = shp_json_node_new_string ("type", params[1]);
            shp_json_node_append_element (child, grand_child);
            shp_json_node_append_element (arr, child);
          }
          g_strfreev (params);
          break;
      }
    }
    g_strfreev (options_list);

    if (obj != NULL) {
      if (arr != NULL)
        shp_json_node_append_element (obj, arr);
      shp_json_node_append_element (node, obj);
    }

    g_free (line);
  }

  g_object_unref (input_stream);
  g_object_unref (file);

  send_ok (out, node);
  shp_json_node_free (node);
}
Пример #29
0
void exec_002(int conn, char *str)
{
  int waitb, n;
  sigset_t mask, oldmask;
  pid_t pid;
  long code;

  if (!have_authorization)
    {
      send_int(conn, MR_PERM);
      return;
    }
  if (config_lookup("noexec"))
    {
      send_int(conn, EPERM);
      com_err(whoami, EPERM, "Not allowed to execute");
      return;
    }

  str += 8;
  while (*str == ' ')
    str++;
  sigemptyset(&mask);
  sigaddset(&mask, SIGCHLD);
  sigprocmask(SIG_BLOCK, &mask, &oldmask);
  pid = fork();
  switch (pid)
    {
    case -1:
      n = errno;
      sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
      com_err(whoami, n, ": can't fork to run install script");
      code = send_int(conn, n);
      if (code)
	exit(1);
      return;

    case 0:
      if (setuid(uid) < 0)
	{
	  com_err(whoami, errno, "Unable to setuid to %d\n", uid);
	  exit(1);
	}
      sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
      execlp(str, str, NULL);
      n = errno;
      sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
      com_err(whoami, n, ": %s", str);
      send_int(conn, n);
      exit(1);

    default:
      do
	n = wait(&waitb);
      while (n != -1 && n != pid);

      sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
      if ((WIFEXITED(waitb) && (WEXITSTATUS(waitb) != 0)) ||
	  WIFSIGNALED(waitb))
	{
	  if (WIFSIGNALED(waitb))
	    {
	      n = MR_COREDUMP;
	      com_err(whoami, n, " child exited on signal %d",
		      WTERMSIG(waitb));
	    }
	  else
	    {
	      n = WEXITSTATUS(waitb) + ERROR_TABLE_BASE_sms;
	      com_err(whoami, n, " child exited with status %d",
		      WEXITSTATUS(waitb));
	    }
	  code = send_int(conn, n);
	  if (code)
	    exit(1);
	}
      else
	{
	  code = send_ok(conn);
	  if (code)
	    exit(1);
	}
    }
  return;
}
Пример #30
0
void ICACHE_FLASH_ATTR server_recv_cb(void *arg, char *http_raw, unsigned short length) {
    struct espconn *pespconn = (struct espconn *)arg;
    //print("[server_recv_cb] Received data:");

    char method[10];
    char path[60];
    char headers[60];
    char body[256];
    parse_http(http_raw, length, method, path, headers, body);

    int GET = (os_strcmp(method, "GET") == 0);
    int POST = (os_strcmp(method, "POST") == 0);

    if (GET) { // No body if not [post/put/patch]ing

        // Static files

        if (os_strcmp(path, "/base.css") == 0) { send_ok(pespconn, base_css); }
        else if (os_strcmp(path, "/connect.js") == 0) { send_ok(pespconn, connect_js); }
        else if (os_strcmp(path, "/register.js") == 0) { send_ok(pespconn, register_js); }

        // JSON responses

        else if (os_strcmp(path, "/connection.json") == 0) {
            int station_connect_status = wifi_station_get_connect_status();

            if (station_connect_status == STATION_GOT_IP) {
                struct ip_info ipConfig;
                wifi_get_ip_info(STATION_IF, &ipConfig);
                char json_str[54];
                os_sprintf(json_str, "{\"status\": \"connected\", \"ip\": \"%d.%d.%d.%d\"}", IP2STR(&ipConfig.ip));
                send_json(pespconn, json_str);
            }

            else {
                char *status_str;

                if (connection_status == CONNECTION_UNCONFIGURED) status_str = "unconfigured";
                else
                switch (station_connect_status) {
                    case STATION_CONNECTING: status_str = "connecting"; break;
                    case STATION_WRONG_PASSWORD: status_str = "failed"; break;
                    case STATION_NO_AP_FOUND: status_str = "failed"; break;
                    case STATION_CONNECT_FAIL: status_str = "failed"; break;
                }

                char json_str[54];
                os_sprintf(json_str, "{\"status\": \"%s\"}", status_str);
                send_json(pespconn, json_str);
            }

        }

        else if (os_strcmp(path, "/registration.json") == 0) {
            char *status_str;

            switch (registration_status) {
                case REGISTER_UNREGISTERED: status_str = "unregistered"; break;
                case REGISTER_REGISTERING: status_str = "registering"; break;
                case REGISTER_REGISTERED: status_str = "registered"; break;
                case REGISTER_FAILED: status_str = "failed"; break;
            }

            char json_str[54];
            os_sprintf(json_str, "{\"status\": \"%s\"}", status_str);
            send_json(pespconn, json_str);
        }

        // HTML pages

        else if (os_strcmp(path, "/read") == 0) {
            if (registration_status == REGISTER_REGISTERED) {
                char temp_json_str[128];
                char hum_json_str[128];
                measurement_json(temp_json_str, "temperature", "F", last_temp);
                measurement_json(hum_json_str, "humidity", "%", last_hum);
                char full_json_str[256] = "";
                strcat(full_json_str, temp_json_str);
                strcat(full_json_str, hum_json_str);
                full_json_str[os_strlen(temp_json_str)+os_strlen(hum_json_str)] = 0;
                send_ok_templated(pespconn, full_json_str);
            } else {
                send_ok_templated(pespconn, last_unknown);
            }

        }

        else if (os_strcmp(path, "/register") == 0) {
            send_ok_templated(pespconn, register_html);
        }

        else if (os_strcmp(path, "/scan.json") == 0) {
            char json_str[256] = "[";
            
            int si = 0;
            for (; si < n_scanned; si++) {
                char json_obj[100];
                os_sprintf(json_obj, "{\"ssid\": \"%s\", \"rssi\": %d}", scanned_stations[si], scanned_dbs[si]);
                os_strcat(json_str, json_obj);
                if (si < n_scanned - 1) {
                    os_strcat(json_str, ",");
                } else {
                    os_strcat(json_str, "]");
                }
            }

            send_json(pespconn, json_str);
        }

        else if (os_strcmp(path, "/") == 0) {
            send_ok_templated(pespconn, index_html);
        }

        else {
            send_404(pespconn);
        }

        return;
    }

    else if (POST) {

        // Parse JSON with jsmn
        jsmn_parser parser;
        jsmn_init(&parser);
        jsmntok_t tokens[32];
        jsmnerr_t r;
        r = jsmn_parse(&parser, body, 1024, tokens, 256);
        if (r < 0) {
            //print("JSON Parse error?");
            return;
        }

        // Look for ssid and pass
        char station_ssid[20];
        char station_pass[20];

        //print("JSON Parse success?");

        if (os_strcmp(path, "/connect.json") == 0) {
            // Parse ssid and pass from JSON
            int ti = 0;
            int has_ssid = 0;
            int has_pass = 0;
            int on_ssid = 0;
            int on_pass = 0;
            for(; tokens[ti].end; ti++) {
                char tv[256];
                token_string(tv, body, tokens[ti]);
                if (on_ssid) {
                    //print("Found ssid");
                    on_ssid = 0;
                    os_strcpy(station_ssid, tv);
                    has_ssid = 1;
                }
                if (on_pass) {
                    //print("Found pass");
                    on_pass = 0;
                    os_strcpy(station_pass, tv);
                    has_pass = 1;
                    if (has_ssid) { break; }
                }
                on_ssid = ti % 2 == 1 && os_strcmp(tv, "ssid") == 0;
                on_pass = ti % 2 == 1 && os_strcmp(tv, "pass") == 0;
            }

            //ets_uart_printf("Hopefully ssid=%s and pass=%s\r\n", station_ssid, station_pass);
            send_ok(pespconn, "<h1>maia</h1><p>OK</p>");
            setup_station(station_ssid, station_pass);
        }

        else if (os_strcmp(path, "/register.json") == 0) {
            // Parse email and password from JSON
            int ti = 0;
            char user_email[64];
            char user_password[64];
            int has_email = 0;
            int has_password = 0;
            int on_email = 0;
            int on_password = 0;
            for(; tokens[ti].end; ti++) {
                char tv[256];
                token_string(tv, body, tokens[ti]);
                if (on_email) {
                    //print("Found email");
                    on_email = 0;
                    os_strcpy(user_email, tv);
                    has_email = 1;
                }
                if (on_password) {
                    //print("Found password");
                    on_password = 0;
                    os_strcpy(user_password, tv);
                    has_password = 1;
                    if (has_email) { break; }
                }
                on_email = ti % 2 == 1 && os_strcmp(tv, "email") == 0;
                on_password = ti % 2 == 1 && os_strcmp(tv, "password") == 0;
            }

            char register_response[256];
            os_sprintf(register_response, "Registering as %d...", DEVICE_ID);
            send_ok_templated(pespconn, register_response);
            char register_json[256];
            os_sprintf(register_json, "{"
                "\"device_id\": \"0x%x\","
                "\"kind\": \"%s\","
                "\"email\": \"%s\","
                "\"password\": \"%s\""
            "}", DEVICE_ID, DEVICE_KIND, user_email, user_password);
            registration_status = REGISTER_REGISTERING;
            post_json(API_BASE "/devices.json", register_json);
        }

        else {
            send_404(pespconn);
        }

        return;
    }

    send_404(pespconn);
    return;
}