示例#1
0
static int sensorsimulator_get_params(int sock, int sensor_id,
				float *x, float *y, float *z)
{
	char cmd[128];
	char *line = NULL;
	size_t linesz = 0;
	int numvals = 0, n = 0, rc = 0;

	snprintf(cmd, sizeof(cmd), "readSensor()\n%s\n",
		 sensorId_to_name(sensor_id));

	if (send(sock, cmd, strlen(cmd), 0) < 0)
		return -1;

	if (socket_readline(sock, &line, &linesz) < 0)
		return -1;

	numvals = atoi(line);
	if (numvals > 3 ||
	    (numvals < 3 && (sensor_id != ID_TEMPERATURE))) {
		err("Invalid number of data points for sensor %d, "
			"the server sent me %d\n", sensor_id, numvals);
		errno = EINVAL;
		rc = -1;
		goto exit_getparms;
	}
	for (n = 0; n < numvals; ++n) {
		float val;
		if (socket_readline(sock, &line, &linesz) < 0) {
			rc = -1;
			goto exit_getparms;
		}
		if (sscanf(line, "%g", &val) < 1) {
			err("Invalid data line: '%s'", line);
			errno = EINVAL;
			rc = -1;
			goto exit_getparms;
		}
		switch (n) {
		case 0:
			*x = val;
			break;
		case 1:
			*y = val;
			break;
		case 2:
			*z = val;
			break;
		default:
			break;
		}
	}

	dbg("Sensor values: X=%g, Y=%g, Z=%g\n", *x, *y, *z);

exit_getparms:
	free(line);
	return rc;
}
示例#2
0
int request_read_query(int sock, query* q) {
 string ands, nots;

 string_init(&ands), string_init(&nots);
 
 while(1) { /* get query */
  if(socket_readline(sock, &ands) == -1 || socket_readline(sock, &nots) == -1) {
   string_delete(&ands), string_delete(&nots);

   return 0;
  }
   
  if(!ands.used && !nots.used)
   break;

  query_add(q, &ands, &nots);

  string_empty(&ands), string_empty(&nots);
 }

 string_delete(&ands), string_delete(&nots);

 return 1;
}
示例#3
0
文件: command.c 项目: cafiend/W12
Command *command_read(Socket *socket)
{
    Command *cmd = NULL;
    char *line = NULL;
    
    if (socket == NULL)
        return NULL;
    
    wait_until_data_available(socket);
    line = socket_readline(socket, "\n");
    
    cmd = command_from_string(line, 1);
    free(line);

    return cmd;
}
示例#4
0
int request_read_integer(int sock, int* i) {
 string str;

 string_init(&str);

 if(socket_readline(sock, &str) == -1 || !str.used) {
  string_delete(&str);

  return 0;
 }

 *i = atoi(str.data);

 string_delete(&str);

 return 1;
}
示例#5
0
static int sensorsimulator_enable_sensor(int sock, int sensor_id)
{
	char cmd[128];
	char *line = NULL;
	size_t linesz = 0;

	snprintf(cmd, sizeof(cmd), "enableSensor()\n%s\n",
		 sensorId_to_name(sensor_id));

	if (send(sock, cmd, strlen(cmd), 0) < 0)
		return -1;

	if (socket_readline(sock, &line, &linesz) < 0)
		return -1;

	dbg("[Enable %d]: Previous state was: %s\n", sensor_id, line);
	free(line);
	return 0;
}
示例#6
0
static int sensorsimulator_open_socket(char *ip, int port)
{
	struct sockaddr_in addr;
	char *line = NULL;
	size_t linesz = 0;

	int sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock < 0)
		return -1;

	info("Connecting to %s:%d...\n", ip, port);
	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	if (inet_aton(ip, &addr.sin_addr) < 0)
		goto sock_err;

	if (connect(sock, &addr, sizeof(addr)) < 0)
		goto sock_err;

	/* read the server response string to verify that we've
	   connected to the sensorsimulator application */
	if (socket_readline(sock, &line, &linesz) < 0)
		goto sock_err;

	if (strcmp(line, "SensorSimulator") != 0) {
		err("Received garbled server response.\n"
			"\tExpected: 'SensorSimulator'\n\tReceived: %s", line);
		goto sock_err;
	}

	return sock;

sock_err:
	free(line);
	close(sock);
	return -1;
}
示例#7
0
文件: mycdbserver.c 项目: passy/mycdb
static int mycdb_listen_loop(int list_s, struct cdb *db) {
    int conn_s;
    char buf[255];
    char *result;

    debug("Listening on 0.0.0.0:%d", mycdb_options.port);
    while (1) {
        conn_s = accept(list_s, NULL, NULL);
        // Probably better to continue here.
        check(conn_s > -1, "Error reading socket");

        debug("Accepted connection.");

        socket_readline(conn_s, buf, sizeof(buf) - 1);
        buf[254] = '\0';
        result = NULL;

        debug("strlen: %zd", strlen(buf));
        debug("GETting key '%s'", buf);

        for (int i = strlen(buf), j = 0; j < i; j++) {
            debug("s[%d] = %d", j, buf[j]);
        }
        if (mycdb_findnext(db, buf) == 0) {
            result = mycdb_read(db);
            socket_writeline(conn_s, result, strlen(result));
            free(result);
        } else {
            socket_writeline(conn_s, "NOTFOUND\n", 10);
        }
    }

    return 0;
error:
    return -1;
}
示例#8
0
/*
 * Command mode network thread routine
 */
int doCmdClient(session_node_t * sn)
{
    /*TODO: Optimize memory usage; these buffers occupy 6 kB stack
     *      memory.
     */
    char line[MAXSRCPLINELEN];
    char reply[MAXSRCPLINELEN];
    char cbus[MAXSRCPLINELEN];
    char command[MAXSRCPLINELEN];
    char devicegroup[MAXSRCPLINELEN];
    char parameter[MAXSRCPLINELEN];
    bus_t bus;
    long int rc, nelem;
    struct timeval akt_time;
    ssize_t result;

    syslog_session(sn->session, DBG_INFO, "Command mode starting.");

    while (true) {
        pthread_testcancel();
        memset(line, 0, sizeof(line));

        result = socket_readline(sn->socket, line, sizeof(line) - 1);

        /* client terminated connection */
        if (0 == result) {
            shutdown(sn->socket, SHUT_RDWR);
            break;
        }

        /* read errror */
        if (-1 == result) {
            syslog_session(sn->session, DBG_ERROR,
                           "Socket read failed: %s (errno = %d)\n",
                           strerror(errno), errno);
            break;
        }

        /*remove terminating line break */
        size_t linelen = strlen(line);
        if (linelen > 1 && (line[linelen - 1] == '\n'))
            line[linelen - 1] = '\0';

        memset(command, 0, sizeof(command));
        memset(cbus, 0, sizeof(cbus));
        memset(devicegroup, 0, sizeof(devicegroup));
        memset(parameter, 0, sizeof(parameter));
        memset(reply, 0, sizeof(reply));
        nelem = sscanf(line, "%s %s %s %1000c", command, cbus,
                       devicegroup, parameter);
        bus = atoi(cbus);
        reply[0] = 0x00;

        if (nelem >= 3) {
            if (bus <= num_buses) {
                rc = SRCP_UNKNOWNCOMMAND;
                if (strncasecmp(command, "SET", 3) == 0) {
                    rc = handleSET(sn->session, bus, devicegroup,
                                   parameter, reply);
                }
                else if (strncasecmp(command, "GET", 3) == 0) {
                    rc = handleGET(sn->session, bus, devicegroup,
                                   parameter, reply, sizeof(reply));
                }
                else if (strncasecmp(command, "WAIT", 4) == 0) {
                    rc = handleWAIT(sn->session, bus, devicegroup,
                                    parameter, reply, sizeof(reply));
                }
                else if (strncasecmp(command, "INIT", 4) == 0) {
                    rc = handleINIT(sn->session, bus, devicegroup,
                                    parameter, reply);
                }
                else if (strncasecmp(command, "TERM", 4) == 0) {
                    rc = handleTERM(sn->session, bus, devicegroup,
                                    parameter, reply);
                    /*special option for session termination (?) */
                    if (rc < 0) {
                        if (writen(sn->socket, reply, strlen(reply)) == -1) {
                            syslog_session(sn->session, DBG_ERROR,
                                           "Socket write failed: %s (errno = %d)\n",
                                           strerror(errno), errno);
                            break;
                        }
                        break;
                    }
                    rc = abs(rc);
                }
                else if (strncasecmp(command, "VERIFY", 6) == 0) {
                    rc = handleVERIFY(sn->session, bus, devicegroup,
                                      parameter, reply);
                }
                else if (strncasecmp(command, "RESET", 5) == 0) {
                    rc = handleRESET(sn->session, bus, devicegroup,
                                     parameter, reply);
                }
            }
            /* bus > num_buses */
            else {
                rc = SRCP_WRONGVALUE;
                gettimeofday(&akt_time, NULL);
                srcp_fmt_msg(rc, reply, akt_time);
            }
        }
        /* nelem < 3 */
        else {
            syslog_session(sn->session, DBG_DEBUG, "List too short: %d",
                           nelem);
            rc = SRCP_LISTTOOSHORT;
            gettimeofday(&akt_time, NULL);
            srcp_fmt_msg(rc, reply, akt_time);
        }

        if (writen(sn->socket, reply, strlen(reply)) == -1) {
            syslog_session(sn->session, DBG_ERROR,
                           "Socket write failed: %s (errno = %d)\n",
                           strerror(errno), errno);
            break;
        }
    }
    return 0;
}