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; }
int request_read_query(int sock, query* q) { string ands, nots; string_init(&ands), string_init(¬s); while(1) { /* get query */ if(socket_readline(sock, &ands) == -1 || socket_readline(sock, ¬s) == -1) { string_delete(&ands), string_delete(¬s); return 0; } if(!ands.used && !nots.used) break; query_add(q, &ands, ¬s); string_empty(&ands), string_empty(¬s); } string_delete(&ands), string_delete(¬s); return 1; }
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; }
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; }
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; }
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; }
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; }
/* * 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; }