42 extern const char DEVDIR[7][11]; |
42 extern const char DEVDIR[7][11]; |
43 extern const char PROFSTATE[5][6]; |
43 extern const char PROFSTATE[5][6]; |
44 extern pthread_mutex_t mutexes[5]; |
44 extern pthread_mutex_t mutexes[5]; |
45 |
45 |
46 |
46 |
47 int s; /* connected socket */ |
47 int my_server_state = 0; /* Thread running state */ |
48 int ls; /* listen socket */ |
48 int s; /* connected socket */ |
49 |
49 int ls; /* listen socket */ |
50 struct sockaddr_in myaddr_in; /* for local socket address */ |
50 |
51 struct sockaddr_in peeraddr_in; /* for peer socket address */ |
51 struct sockaddr_in myaddr_in; /* for local socket address */ |
|
52 struct sockaddr_in peeraddr_in; /* for peer socket address */ |
52 |
53 |
53 struct hostent *hp; |
54 struct hostent *hp; |
54 |
55 |
55 #define SS_BUFSIZE 1024 |
56 #define SS_BUFSIZE 1024 |
56 #define SS_TIMEOUT 300 |
57 #define SS_TIMEOUT 300 |
2141 close(s); |
2142 close(s); |
2142 } |
2143 } |
2143 |
2144 |
2144 |
2145 |
2145 |
2146 |
2146 #ifdef HAVE_WIRINGPI_H |
|
2147 PI_THREAD (my_server_loop) |
|
2148 #else |
|
2149 void *my_server_loop(void *threadid) |
2147 void *my_server_loop(void *threadid) |
2150 #endif |
|
2151 { |
2148 { |
2152 socklen_t addrlen; |
2149 socklen_t addrlen; |
2153 int optval = 1; |
2150 int optval = 1; |
2154 |
2151 |
|
2152 my_server_state = 1; |
2155 syslog(LOG_NOTICE, "Thread my_server_loop started"); |
2153 syslog(LOG_NOTICE, "Thread my_server_loop started"); |
2156 if (debug) |
2154 if (debug) |
2157 fprintf(stdout, "Thread my_server_loop started\n"); |
2155 fprintf(stdout, "Thread my_server_loop started\n"); |
2158 |
2156 |
2159 memset((char *)&myaddr_in, 0, sizeof(struct sockaddr_in)); |
2157 memset((char *)&myaddr_in, 0, sizeof(struct sockaddr_in)); |
2164 |
2162 |
2165 ls = socket(AF_INET, SOCK_STREAM, 0); |
2163 ls = socket(AF_INET, SOCK_STREAM, 0); |
2166 if (ls == -1) { |
2164 if (ls == -1) { |
2167 syslog(LOG_NOTICE, "Can't create listen socket: %s", strerror(errno)); |
2165 syslog(LOG_NOTICE, "Can't create listen socket: %s", strerror(errno)); |
2168 fprintf(stderr, "Can't create listen socket: %s\n", strerror(errno)); |
2166 fprintf(stderr, "Can't create listen socket: %s\n", strerror(errno)); |
|
2167 my_server_state = 0; |
2169 return 0; |
2168 return 0; |
2170 } |
2169 } |
2171 |
2170 |
2172 if (setsockopt(ls, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) == -1) { |
2171 if (setsockopt(ls, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) == -1) { |
2173 syslog(LOG_NOTICE, "Can't setsockopt SO_KEEPALIVE socket: %s", strerror(errno)); |
2172 syslog(LOG_NOTICE, "Can't setsockopt SO_KEEPALIVE socket: %s", strerror(errno)); |
2174 close(ls); |
2173 close(ls); |
|
2174 my_server_state = 0; |
2175 return 0; |
2175 return 0; |
2176 } |
2176 } |
2177 |
2177 |
2178 if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) { |
2178 if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) { |
2179 syslog(LOG_NOTICE, "Can't setsockopt SO_REUSEADDR socket: %s", strerror(errno)); |
2179 syslog(LOG_NOTICE, "Can't setsockopt SO_REUSEADDR socket: %s", strerror(errno)); |
2180 close(ls); |
2180 close(ls); |
|
2181 my_server_state = 0; |
2181 return 0; |
2182 return 0; |
2182 } |
2183 } |
2183 |
2184 |
2184 if (bind(ls, (struct sockaddr *)&myaddr_in, sizeof(struct sockaddr_in)) == -1) { |
2185 if (bind(ls, (struct sockaddr *)&myaddr_in, sizeof(struct sockaddr_in)) == -1) { |
2185 syslog(LOG_NOTICE, "Can't bind to listen socket: %s", strerror(errno)); |
2186 syslog(LOG_NOTICE, "Can't bind to listen socket: %s", strerror(errno)); |
2186 close(ls); |
2187 close(ls); |
|
2188 my_server_state = 0; |
2187 return 0; |
2189 return 0; |
2188 } |
2190 } |
2189 |
2191 |
2190 if (listen(ls, 5) == -1) { |
2192 if (listen(ls, 5) == -1) { |
2191 syslog(LOG_NOTICE, "Can't listen on listen socket: %s", strerror(errno)); |
2193 syslog(LOG_NOTICE, "Can't listen on listen socket: %s", strerror(errno)); |
2192 close(ls); |
2194 close(ls); |
|
2195 my_server_state = 0; |
2193 return 0; |
2196 return 0; |
2194 } |
2197 } |
2195 |
2198 |
2196 syslog(LOG_NOTICE, "listen socket created %d", ls); |
2199 syslog(LOG_NOTICE, "listen socket created %d", ls); |
2197 |
2200 |
2211 s = accept(ls, (struct sockaddr *)&peeraddr_in, &addrlen); |
2214 s = accept(ls, (struct sockaddr *)&peeraddr_in, &addrlen); |
2212 if (s == -1) { |
2215 if (s == -1) { |
2213 syslog(LOG_NOTICE, "my_server_loop accept failed %s", strerror(errno)); |
2216 syslog(LOG_NOTICE, "my_server_loop accept failed %s", strerror(errno)); |
2214 if (debug) |
2217 if (debug) |
2215 fprintf(stdout, "my_server_loop accept failed %s\n", strerror(errno)); |
2218 fprintf(stdout, "my_server_loop accept failed %s\n", strerror(errno)); |
|
2219 my_server_state = 0; |
2216 return 0; |
2220 return 0; |
2217 } |
2221 } |
2218 |
2222 |
2219 cmd_server(); |
2223 cmd_server(); |
2220 |
2224 |
2221 if (my_shutdown) { |
2225 if (my_shutdown) { |
2222 syslog(LOG_NOTICE, "Thread my_server_loop stopped"); |
2226 syslog(LOG_NOTICE, "Thread my_server_loop stopped"); |
2223 if (debug) |
2227 if (debug) |
2224 fprintf(stdout, "Thread my_server_loop stopped\n"); |
2228 fprintf(stdout, "Thread my_server_loop stopped\n"); |
|
2229 my_server_state = 0; |
2225 return 0; |
2230 return 0; |
2226 } |
2231 } |
2227 usleep(100000); |
2232 usleep(100000); |
2228 } |
2233 } |
2229 } |
2234 } |