-Isdk/include/amtrucks/ \
-Isdk/include/eurotrucks2
-CFLAGS=-Wall -Wextra -std=c99 -O2 -DDEBUG -I. -pthread
-CXXFLAGS=-Wall -O2 -DLOGGING -I. -pthread
+CFLAGS=-Wall -Wextra -std=c99 -O2 -I. -pthread
+CXXFLAGS=-Wall -O2 -I. -pthread
LDFLAGS=-pthread -lrt
UNAME:= $(shell uname -s)
HTTPD_OBJ := telehttpd.o shmget.o net.o fserv.o tele2json.o telehelper.o
LOGGER_OBJ := telelogger.o shmget.o tele2json.o telehelper.o
-.PHONY: all clean
+.PHONY: all debug clean
all: telehttpd telelogger teleshmem.so
+debug: CFLAGS += -DDEBUG
+debug: CXXFLAGS += -DLOGGING
+debug: all
+
teleshmem.so: $(PLUGIN_SRC) $(COMMON_HDR) $(SDK_HEADERS) $(SELF)
$(CXX) -o $@ $(CXXFLAGS) -fPIC --shared -Wl,$(LIB_NAME_OPTION),$@ $(SDK_INCLUDES) $(PLUGIN_SRC)
-// Needed for getopt() and pthread_rwlock*
-#define _XOPEN_SOURCE 500
+// Needed for getopt(), pthread_rwlock*, and strsignal()
+#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
static volatile sig_atomic_t force_quit;
static void handle_signal(int sig) {
- fprintf (stderr, "SIGNAL: %d\n", sig);
+ EPRINT( "SIGNAL: %d %s\n", sig, strsignal(sig) );
switch (sig){
case SIGTERM:
case SIGINT:
force_quit = 1;
break;
+ case SIGPIPE:
+ // We don't want to get killed by writing to a stale socket!
+ break;
+ default:
+ break;
}
}
return l;
}
+static inline ssize_t sockwrite( int fd, const void *buf, size_t len ) {
+ ssize_t n;
+ n = write( fd, buf, len );
+ if ( 0 > n ) {
+ EPRINT( "write: %s\n", strerror(errno) );
+ }
+ else if ( len != (size_t)n ) {
+ EPRINT( "write: short write (%d of %d)\n", (int)n, (int)len );
+ }
+ return n;
+}
+
static void respond( struct thread_data_t *td, const char *req ) {
int n;
char buf[4096]; // Must be large enough to satisfy tele2json()!
host,
origin
);
- if ( 0 < n && (size_t)n < sizeof buf && n == write( td->sock, buf, n ) )
- write( td->sock, buf, tele2json( buf, sizeof buf, &td->tele ) );
+ if ( 0 < n && (size_t)n < sizeof buf && n == sockwrite( td->sock, buf, n ) )
+ sockwrite( td->sock, buf, tele2json( buf, sizeof buf, &td->tele ) );
break;
case r_index: {
struct file_info_t fi;
"\r\n",
host
);
- if ( 0 < n && (size_t)n < sizeof buf && n == write( td->sock, buf, n ) ) {
+ if ( 0 < n && (size_t)n < sizeof buf && n == sockwrite( td->sock, buf, n ) ) {
fserv_sendfile( td->sock, &fi );
fserv_close( &fi );
}
host
);
if ( 0 < n && (size_t)n < sizeof buf )
- write( td->sock, buf, n );
+ sockwrite( td->sock, buf, n );
break;
default:
n = snprintf( buf, sizeof buf,
host
);
if ( 0 < n && (size_t)n < sizeof buf )
- write( td->sock, buf, n );
+ sockwrite( td->sock, buf, n );
break;
}
}
if ( 0 > bread ) {
switch (errno) {
case EAGAIN:
- //case EWOULDBLOCK:
case EINTR:
break;
default:
+ EPRINT( "read: %s\n", strerror(errno) );
res = -1;
break;
}
}
else if ( 0 == bread && 0 == errno ) {
+ EPRINT( "read: premature EOF\n" );
res = -1;
}
else {
}
if ( 0 < as ) {
if ( NULL != (td = malloc( sizeof *td )) ) {
+ int e;
td->sock = as;
- if ( 0 != tele_cpy( &td->tele, telemetry ) )
+ if ( 0 != tele_cpy( &td->tele, telemetry ) ) {
DPRINT( "No telemetry, serving dummy data\n" );
+ }
pthread_attr_init( &attr );
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );
- if ( 0 != pthread_create( &tid, &attr, handle_conn, td ) ) {
- net_close( td->sock );
+ if ( 0 != ( e = pthread_create( &tid, &attr, handle_conn, td ) ) ) {
+ EPRINT( "pthread_create: %s\n", strerror( e ) );
free( td );
+ net_close( as );
}
}
else {
int main(int argc, char *argv[]) {
signal(SIGTERM, handle_signal);
signal(SIGINT, handle_signal);
- // We don't want to get killed by some thread writing to a stale socket:
- signal(SIGPIPE, SIG_IGN);
+ signal(SIGPIPE, handle_signal);
if ( 0 != config( argc, argv ) )
exit( EXIT_FAILURE);