/hello/system.c
C | 402 lines | 328 code | 64 blank | 10 comment | 92 complexity | cac5fa64ef8002095cfc8273f4a4b7e0 MD5 | raw file
Possible License(s): Apache-2.0, CC-BY-4.0, BSD-3-Clause
- #include "system.h"
- typedef struct timeval TIMEVAL;
- int32_t
- current_connection_socket_,
- server_socket_;
- int32_t set_nonblock
- (int32_t socket)
- {
- return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL, 0) | O_NONBLOCK);
- }
- uint32_t recv_peek
- (int32_t socket)
- {
- char data;
- if (recv(socket, &data, 1, MSG_PEEK | MSG_DONTWAIT) != 0)
- return 1;
- return 0;
- }
- uint8_t is_connected
- (int32_t sock)
- {
- return recv_peek(sock);
- }
- int32_t read_data
- (int32_t sock, char *buffer )
- {
- int32_t
- bytes = 0;
- static size_t
- position = 0;
- char
- chr;
- do
- {
- bytes = recv(sock, &chr, 1, 0);
- if (bytes != SOCKET_ERROR && bytes > 0)
- {
- if (chr == '<' || position > SYSTEM_PACKET_LEN - 1)
- {
- position = 0;
- }
- else
- {
- if (chr == '>')
- {
- buffer[position] = '\0';
- return position-1;
- }
- buffer[position++] = chr;
- }
- }
- } while (bytes != SOCKET_ERROR && bytes > 0);
- return 0;
- }
- int32_t send_reply
- (char *buffer, int32_t len, char* message )
- {
- int32_t
- retval = 0;
- char
- *sndbuffer = malloc(len + 10 + strlen(message));
- if(sndbuffer==NULL)
- return -1;
- sprintf(sndbuffer, "<%s%s>", buffer,message);
- retval = send(current_connection_socket_, sndbuffer, strlen(sndbuffer), 0);
- free(sndbuffer);
- return retval;
- }
- int32_t send_pong
- ( void )
- {
- return send_reply("pong", strlen("pong"),"");
- }
- int execute(char *cmd)
- {
- FILE *fd;
- fd = popen(cmd, "r");
- if (!fd)
- return 1;
- char buffer[256];
- size_t chread;
- size_t comalloc = 256;
- size_t comlen = 0;
- char *comout = malloc(comalloc);
- while ((chread = fread(buffer, 1, sizeof(buffer), fd)) != 0)
- {
- if (comlen + chread >= comalloc)
- {
- comalloc *= 2;
- comout = realloc(comout, comalloc);
- }
- memmove(comout + comlen, buffer, chread);
- comlen += chread;
- }
- comout[comlen] = '\0';
- send_reply(comout, comlen, "");
- free(comout);
- pclose(fd);
- return 0;
- }
- int execute_wmsg(char *cmd, char *msg)
- {
- FILE *fd;
- fd = popen(cmd, "r");
- if (!fd)
- return 1;
- char buffer[256];
- size_t chread;
- size_t comalloc = 256;
- size_t comlen = 0;
- char *comout = malloc(comalloc);
- while ((chread = fread(buffer, 1, sizeof(buffer), fd)) != 0)
- {
- if (comlen + chread >= comalloc)
- {
- comalloc *= 2;
- comout = realloc(comout, comalloc);
- }
- memmove(comout + comlen, buffer, chread);
- comlen += chread;
- }
- comout[comlen] = '\0';
- if(comlen == 0)
- send_reply(comout, comlen, msg);
- else
- send_reply(comout, comlen, "");
- free(comout);
- pclose(fd);
- return 0;
- }
- void single_threaded_listener
- (void)
- {
- int32_t
- new_socket;
- struct sockaddr_in
- server,
- client;
- socklen_t
- c;
- char
- data[SYSTEM_PACKET_LEN],
- buffer[1024];
- fd_set
- readset;
- int32_t
- nfds = 0;
- TIMEVAL
- tv = { 0 };
- running_ = 1;
- //Create a socket
- if ((server_socket_ = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
- {
- printf("Could not create socket : %d", errno);
- fflush(stdout);
- exit(EXIT_FAILURE);
- }
- //Prepare the sockaddr_in structure
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = INADDR_ANY;
- server.sin_port = htons(SYSTEM_SETTINGS_PORT);
- int yes=1;
- if (setsockopt(server_socket_, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof(yes)) == SOCKET_ERROR)
- {
- printf("Reuse failed with error code : %d", errno);
- fflush(stdout);
- exit(EXIT_FAILURE);
- }
- //Bind
- if (bind(server_socket_, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
- {
- printf("Bind failed with error code : %d", errno);
- fflush(stdout);
- exit(EXIT_FAILURE);
- }
- if (listen(server_socket_, 1) <0)
- {
- printf("Listen failed with error code : %d",errno);
- fflush(stdout);
- exit(EXIT_FAILURE);
- }
- c = sizeof(struct sockaddr_in);
- if( (new_socket = accept(server_socket_, (struct sockaddr *)&client, &c)) != INVALID_SOCKET )
- {
- if (set_nonblock(new_socket) == 0)
- {
- current_connection_socket_ = new_socket;
- while (is_connected(new_socket) && running_ )
- {
- FD_ZERO(&readset);
- nfds = new_socket;
- FD_SET(new_socket, &readset);
- tv.tv_sec = 1;
- if (select(nfds + 1, &readset, NULL, NULL, &tv))
- {
- if (FD_ISSET(new_socket, &readset))
- {
- if (read_data(new_socket, data))
- {
- if (strcmp((char*)data, "ping") == 0)
- {
- send_pong();
- }
- else if (strcmp((char*)data, "terminate") == 0)
- {
- shutdown(server_socket_, 2);
- shutdown(new_socket, 2);
- close(server_socket_);
- close(new_socket);
- }
- else
- {
- if(strcmp("version",data)==0)
- {
- send_reply(VERSION,strlen(VERSION),"");
- }
- else if(strcmp("ipconfig",data)==0)
- {
- execute("interface=($(connmanctl services | grep ethernet | awk '{print $3}')); cat /var/lib/connman/$interface/settings | grep IPv4.method | cut -d= -f2");
- }
- else if(strcmp("mac eth0",data)==0)
- {
- execute("cat /sys/class/net/eth0/address");
- }
- else if(strcmp("ipaddr",data)==0)
- {
- execute("interface=($(connmanctl services | grep ethernet | awk '{print $3}')); connmanctl services $interface | awk '/IPv4 =/ {print $5}' | cut -d= -f2 | cut -d, -f1");
- }
- else if(strcmp("subnet mask",data)==0)
- {
- execute("interface=($(connmanctl services | grep ethernet | awk '{print $3}')); connmanctl services $interface | awk '/IPv4 =/ {print $6}' | cut -d= -f2 | cut -d, -f1");
- }
- else if(strcmp("gateway",data)==0)
- {
- execute("interface=($(connmanctl services | grep ethernet | awk '{print $3}')); connmanctl services $interface | awk '/IPv4 =/ {print $7}' | cut -d= -f2 | cut -d, -f1");
- }
- else if(strcmp("dns",data)==0)
- {
- execute("interface=($(connmanctl services | grep ethernet | awk '{print $3}')); connmanctl services $interface | awk '/Nameservers =/ {print $4}' | cut -d, -f1");
- }
- /* set commands network */
- // connmanctl config ethernet_00142d4a5979_cable --ipv4 manual 192.168.178.222 255.255.255.0 192.168.178.1
- else if(strncmp("set-ip ",data,7)==0)
- {
- sprintf(buffer,"interface=($(connmanctl services | grep ethernet | awk '{print $3}')); connmanctl config $interface --ipv4 %s ",&data[7]);
- send_reply("OK-RCNT",7,"");
- execute(buffer);
- break;
- }
- // connmanctl config ethernet_00142d259a48_cable --nameservers 8.8.8.8
- else if(strncmp("set-dns ",data,8)==0)
- {
- sprintf(buffer,"interface=($(connmanctl services | grep ethernet | awk '{print $3}')); connmanctl config $interface --nameservers %s ",&data[8]);
- execute_wmsg(buffer,"OK");
- }
- /* system usage */
- else if(strcmp("load core1",data)==0)
- {
- execute("loads=($(mpstat -P ALL 1 1 | awk '/Average:/ && $2 ~ /[0-9]/ {print $3}')); echo ${loads[0]}");
- }
- else if(strcmp("load core2",data)==0)
- {
- execute("loads=($(mpstat -P ALL 1 1 | awk '/Average:/ && $2 ~ /[0-9]/ {print $3}')); echo ${loads[1]}");
- }
- else if(strcmp("load percent",data)==0)
- {
- execute("grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage \"%\"}'");
- }
- else if(strcmp("ram usage",data)==0)
- {
- execute("free | grep Mem | awk '{print $3/$2 * 100.0}'");
- }
- else if(strcmp("memory usage",data)==0)
- {
- execute("df / | awk 'END{print $5}' | sed 's/%//'");
- }
- /* time */
- else if(strcmp("date",data)==0)
- {
- execute("date +%d/%m/%Y%t%H:%M:%S");
- }
- else if(strcmp("ntp",data)==0)
- {
- execute("timedatectl | grep Network | cut -d: -f2");
- }
- else if(strcmp("list timezones",data)==0)
- {
- execute("timedatectl list-timezones");
- }
- else if(strcmp("timezone",data)==0)
- {
- execute("timedatectl | grep 'Time zone' | awk '/Time zone/ {print $3}'");
- }
- /* time set cmds */
- else if(strcmp("set-ntp no",data)==0)
- {
- execute_wmsg("timedatectl set-ntp no","OK");
- }
- else if(strcmp("set-ntp yes",data)==0)
- {
- execute_wmsg("timedatectl set-ntp yes", "OK");
- }
- else if(strncmp("set-time ",data,9)==0)
- {
- sprintf(buffer,"timedatectl set-time '%s'",&data[9]);
- execute_wmsg(buffer,"OK");
- }
- else if(strncmp("set-timezone ",data,13)==0)
- {
- sprintf(buffer,"timedatectl set-timezone '%s'",&data[13]);
- execute_wmsg(buffer,"OK");
- }
- /* extra functions */
- else if(strcmp("reboot",data)==0)
- {
- execute("reboot");
- }
- else
- {
- send_reply("unknown command ",strlen("unknown command "),"");
- }
- }
- }
- }
- }
- }
- }
- shutdown(new_socket, 2);
- close(new_socket);
- }
- if (new_socket == INVALID_SOCKET)
- {
- printf("accept failed with error code : %d", errno);
- exit(EXIT_FAILURE);
- }
- close(server_socket_);
- running_ = 0;
- }