Beispiel #1
0
/* create a single kb */
static void handle_cmd_create_kb(int client_fd, uint16_t datasize)
{
    int rv, err;
    unsigned char *msg = NULL;
    int exit_val; /* exit value from 4s-backend-setup */

    /* unpack client data into buffer */
    unsigned char *buf = (unsigned char *)malloc(datasize);
    rv = recv_from_client(client_fd, buf, datasize);
    if (rv <= 0) {
        /* errors already logged/handled */
        free(buf);
        return;
    }

    /* parse buffer into kb setup args struct */
    fsa_kb_setup_args *ksargs = fsap_decode_cmd_create_kb(buf);
    fsa_error(LOG_DEBUG, "ksargs->name: %s", ksargs->name);
    fsa_error(LOG_DEBUG, "ksargs->node_id: %d", ksargs->node_id);
    fsa_error(LOG_DEBUG, "ksargs->cluster_size: %d", ksargs->cluster_size);
    fsa_error(LOG_DEBUG, "ksargs->num_segments: %d", ksargs->num_segments);
    fsa_error(LOG_DEBUG, "ksargs->mirror_segments: %d",ksargs->mirror_segments);
    fsa_error(LOG_DEBUG, "ksargs->model_files: %d", ksargs->model_files);
    fsa_error(LOG_DEBUG, "ksargs->delete_existing: %d",ksargs->delete_existing);

    /* should already have been checked by client */
    if (!fsa_is_valid_kb_name((const char *)ksargs->name)) {
        fsa_error(LOG_CRIT, "Invalid store name received from client");
        send_error_message(client_fd, "store name invalid");
        fsa_kb_setup_args_free(ksargs);
    }

    rv = fsab_create_local_kb(ksargs, &exit_val, &msg, &err);

    /* encode message for client */
    int len;
    unsigned char *response =
        fsap_encode_rsp_create_kb(err, ksargs->name, msg, &len);

    fsa_error(LOG_DEBUG, "sending err: %d, kb_name: %s, msg: %s",
              err, ksargs->name, msg);

    fsa_kb_setup_args_free(ksargs);
    free(msg);

    fsa_error(LOG_DEBUG, "response size is %d bytes", len);

    /* send entire response back to client */
    rv = fsa_sendall(client_fd, response, &len);
    free(response);
    if (rv == -1) {
        fsa_error(LOG_ERR, "failed to send response to client: %s",
                  strerror(errno));
        return;
    }

    fsa_error(LOG_DEBUG, "%d bytes sent to client", len);
}
Beispiel #2
0
/* receive header from client, work out what request they want */
static void handle_client_data(int client_fd)
{
    uint8_t cmdval; /* command client wants server to run */
    uint16_t datasize; /* size of command packet */
    int rv, nbytes;
    unsigned char header_buf[ADM_HEADER_LEN];

    /* block until we receive a full header */
    nbytes = recv_from_client(client_fd, header_buf, ADM_HEADER_LEN);
    if (nbytes <= 0) {
        return;
    }

    /* decode header data we received from client */
    rv = fsap_decode_header(header_buf, &cmdval, &datasize);
    if (rv == -1) {
        fsa_error(LOG_ERR, "unable to decode header sent by client");
        close(client_fd);
        FD_CLR(client_fd, &master_read_fds);
        return;
    }

    fsa_error(LOG_DEBUG, "got command: %d, datasize: %d", cmdval, datasize);

    /* work out which command the client is requesting */
    switch (cmdval) {
        case ADM_CMD_GET_KB_INFO_ALL:
            handle_cmd_get_kb_info_all(client_fd);
            break;
        case ADM_CMD_GET_KB_INFO:
            handle_cmd_get_kb_info(client_fd, datasize);
            break;
        case ADM_CMD_STOP_KB:
            handle_cmd_stop_kb(client_fd, datasize);
            break;
        case ADM_CMD_START_KB:
            handle_cmd_start_kb(client_fd, datasize);
            break;
        case ADM_CMD_STOP_KB_ALL:
            handle_cmd_stop_kb_all(client_fd);
            break;
        case ADM_CMD_START_KB_ALL:
            handle_cmd_start_kb_all(client_fd);
            break;
        case ADM_CMD_DELETE_KB:
            handle_cmd_delete_kb(client_fd, datasize);
            break;
        case ADM_CMD_CREATE_KB:
            handle_cmd_create_kb(client_fd, datasize);
            break;
        default:
            fsa_error(LOG_ERR, "unknown client request");
            close(client_fd);
            FD_CLR(client_fd, &master_read_fds);
            break;
    }
}
Beispiel #3
0
int main(int argc, char* argv[])  {
	init_database(database, table);
	init_server(argc, argv);

	recv_from_client();

	close_server();
	close_database();

	return EXIT_SUCCESS;
}
Beispiel #4
0
static unsigned char *get_string_from_client(int client_fd, int len)
{
    /* len = num chars in string to fetch */
    unsigned char *str = (unsigned char *)malloc(len + 1);

    /* get kb name from client */
    int nbytes = recv_from_client(client_fd, str, len);
    if (nbytes <= 0) {
        /* errors already logged/handled */
        free(str);
        return NULL;
    }
    str[len] = '\0';

    return str;
}
Beispiel #5
0
// attach a header then send len bytes from start of buf to 
// the power strip, then wait for its response.
void send_to_client(uint8_t *buf, int32_t len)
{
    if(len <= 0 || len > 255)
    {
        printf("send to client invalid message length\n");
        return;
    }
    // assemble header
    uint8_t header[2];
    header[0] = MASTER_COMMAND_TRANSMISSION_START;
    header[1] = len;
    // retry if timeout happens
    for (int32_t i = 0; i < TIMEOUT_MAX_RETRY; i++)
    {
        if(i > 0)
            printf("send command timeout, retry #%d\n", i);
        // send out header
        if(send(sockfd, header, 2, 0) == -1)
        {
            perror("send");
            exit(0);
        }
        // send out data
        if(send(sockfd, buf, len, 0) == -1)
        {
            perror("send");
            exit(0);
        }
        // wait for response
        if(recv_from_client(recv_buf) == 0)
            return;
    }
    // if all retries result in timeout, exit the program
    printf("can not reach client\n");
    exit(0);
}