Diffstat (limited to 'noncore/net/wellenreiter/daemon/source/sendgui.cc') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/net/wellenreiter/daemon/source/sendgui.cc | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/noncore/net/wellenreiter/daemon/source/sendgui.cc b/noncore/net/wellenreiter/daemon/source/sendgui.cc new file mode 100644 index 0000000..48ad5b8 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/sendgui.cc @@ -0,0 +1,75 @@ +/* + * Send string to GUI + * + * $Id$ + */ + +#include "config.hh" +#include "sendgui.hh" +#include "log.hh" + +/* Simple dummy for alarm timer */ +static void alarmdummy(int signo) +{ + alarm (0); +} + +/* Connect to given IP on given port */ +int connect_server(int *sock, unsigned int ipaddr, int port) +{ + struct sockaddr_in saddr; + int retval=0; + + *sock = socket (PF_INET, SOCK_STREAM, 0); + saddr.sin_family = PF_INET; + saddr.sin_port = htons (port); + saddr.sin_addr.s_addr = ipaddr; + + signal (SIGALRM, alarmdummy); + siginterrupt (SIGALRM, 1); + + alarm(5); + retval=connect (*sock, (struct sockaddr *) &saddr, sizeof (saddr)); + alarm(0); + + if(retval < 0) + { + close (*sock); + return 0; + } + + return 1; +} + +/* Send a string to the GUI */ +int sendgui(const char *string, ...) +{ + int sock=0; + char buffer[4096]; + va_list ap; + + /* Generate string */ + memset(buffer, 0, sizeof(buffer)); + va_start(ap, string); + vsnprintf(buffer, sizeof(buffer)-1, string, ap); + va_end(ap); + + if(!connect_server(&sock, inet_addr(GUIADDR), GUIPORT)) + { + log_err("Connect to GUI at '%s' failed: %s", GUIADDR, strerror(errno)); + return 0; + } + + if(write(sock, buffer, sizeof(buffer)) < 0) + { + log_err("Cannot write to socket: %s", strerror(errno)); + close(sock); + return 0; + } + + if(close(sock) < 0) + log_err("Cannot close socket: %s", strerror(errno)); + + return 1; +} + |