1
0
mirror of https://github.com/sys-fs/tubes synced 2024-11-22 03:54:15 -05:00

Use syslog and getopt

This commit is contained in:
Thomas Mannay 2016-11-02 11:23:35 +00:00
parent de2010c262
commit d9a38ceabb
2 changed files with 66 additions and 76 deletions

View File

@ -1,4 +1,4 @@
.TH TUBES 1 tubes-1.3.0 .TH TUBES 1 tubes-1.4.0
.SH NAME .SH NAME
tubes \- irc pipes tubes \- irc pipes
.SH SYNOPSIS .SH SYNOPSIS
@ -33,7 +33,7 @@ if SSL is also desired
The incoming and outgoing FIFO buffers are stored in /tmp and are named for The incoming and outgoing FIFO buffers are stored in /tmp and are named for
the server tubes is connected to with .in or .out appended to the end. the server tubes is connected to with .in or .out appended to the end.
~/.tubes.err is used to store an error string if tubes exits with -1. ~/.tubes.err is used to store an error string if tubes exits with -1.
.SH RETURN VALUE .SH EXIT STATUS
Returns -1 on error, 0 on success. Returns 1 on error, 0 on success.
.SH AUTHOR .SH AUTHOR
Copyright \(co 2016 Thomas Mannay <audiobarrier@openmailbox.org>. Copyright \(co 2016 Thomas Mannay <audiobarrier@openmailbox.org>.

136
tubes.c
View File

@ -12,54 +12,55 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <syslog.h>
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#define PING_TIMEOUT 240 #define PING_TIMEOUT 240
char *argv0;
static SSL_CTX *ctx; static SSL_CTX *ctx;
static SSL *ssl; static SSL *ssl;
static char *host = "chat.freenode.net"; static char *host = "chat.freenode.net";
static int port = 6667; static char port[6] = "6667";
static FILE *log;
static short use_ssl = 0; static short use_ssl = 0;
static unsigned int last_response; static unsigned int last_response;
static FILE * static int
slog(char *file) tube(char *direction)
{ {
const char *home = getenv("HOME"); int fd;
char path[100]; char buf[512];
FILE *fp;
snprintf(path, 100, "%s/%s", home, file); snprintf(buf, sizeof(buf), "/tmp/%s.%s", host, direction);
mknod(path, 0 | 0666, 0); unlink(buf);
fp = fopen(path, "w"); mkfifo(buf, 0660);
if ((fd = open(buf, O_RDWR)) < 0)
perror("tube");
return fp; return fd;
} }
static int static int
dial(char *host, int port) dial(char *host, char *port)
{ {
int sockfd, err; int sockfd, err;
struct addrinfo hints, *serv; struct addrinfo hints, *serv;
char tmp[8];
snprintf(tmp, 8, "%d", port);
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET; hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
if ((err = getaddrinfo(host, tmp, &hints, &serv)) != 0) { if ((err = getaddrinfo(host, port, &hints, &serv)) != 0) {
fprintf(log, "getaddrinfo: %s\n", gai_strerror(err)); fprintf(stderr, "dial: %s\n", gai_strerror(err));
return -1; return -1;
} else if ((sockfd = socket(serv->ai_family, serv->ai_socktype, }
serv->ai_protocol)) == -1) { if ((sockfd = socket(serv->ai_family, serv->ai_socktype,
fprintf(log, "tubes: error on socket()\n"); serv->ai_protocol)) < 0) {
perror("dial");
return -1; return -1;
} else if (connect(sockfd, serv->ai_addr, serv->ai_addrlen) == -1) { }
fprintf(log, "tubes: error on connect().\n"); if (connect(sockfd, serv->ai_addr, serv->ai_addrlen) < 0) {
perror("dial");
close(sockfd); close(sockfd);
return -1; return -1;
} }
@ -84,7 +85,7 @@ sslify(int *sockfd)
SSL_set_connect_state(ssl); SSL_set_connect_state(ssl);
if ((r = SSL_connect(ssl)) < 1) { if ((r = SSL_connect(ssl)) < 1) {
fprintf(log, "sslify: %s\n", strerror(SSL_get_error(ssl, r))); fprintf(stderr, "sslify: %s\n", strerror(SSL_get_error(ssl, r)));
SSL_CTX_free(ctx); SSL_CTX_free(ctx);
return -1; return -1;
} }
@ -102,57 +103,38 @@ main(int argc, char **argv)
char buf[512]; char buf[512];
int i, r, status; int i, r, status;
for (i = 1; i < argc; i++) { while ((i = getopt(argc, argv, "Shp:")) != -1) {
r = argv[i][1]; switch (i) {
if (argv[i][0] != '-' || argv[i][2])
r = -1;
switch (r) {
case 'S': case 'S':
use_ssl = 1; use_ssl = 1;
port = 6697; strncpy(port, "6697", sizeof(port));
break; break;
case 'h': case 'h':
if (++i < argc) host = optarg;
host = argv[i];
break; break;
case 'p': case 'p':
if (++i < argc) strncpy(port, optarg, sizeof(port));
port = atoi(argv[i]);
break; break;
default: default:
fprintf(stderr, fprintf(stderr, "usage: tubes [-S] [-h host] [-p port]\n");
"usage: tubes [-S] [-h host] [-p port]\n"); return 1;
exit(0);
} }
} }
if ((log = slog(".tubes.err")) == NULL) { if ((sockfd = dial(host, port)) < 0)
fprintf(stderr, "error on slog()"); return 1;
exit(-1); if (use_ssl && sslify(&sockfd) < 0)
return 1;
if ((in = tube("in")) < 0)
return 1;
if ((out = tube("out")) < 0)
return 1;
if (daemon(0, 0) < 0) {
perror("main");
return 1;
} }
if (daemon(0, 0) == -1) {
fprintf(log, "error on daemon()\n");
exit(-1);
}
if ((sockfd = dial(host, port)) == -1)
exit(-1);
if (use_ssl && sslify(&sockfd) == -1)
exit(-1);
snprintf(buf, 512, "/tmp/%s.in", host); openlog(argv[0], LOG_PID, LOG_DAEMON);
unlink(buf);
mkfifo(buf, 0660);
if ((in = open(buf, O_RDWR | O_NONBLOCK)) < 0) {
fprintf(log, "in: error on open()\n");
exit(-1);
}
snprintf(buf, 512, "/tmp/%s.out", host);
unlink(buf);
mkfifo(buf, 0660);
if ((out = open(buf, O_RDWR)) < 0) {
fprintf(log, "out: error on open()\n");
exit(-1);
}
for (status = 0;;) { for (status = 0;;) {
FD_ZERO(&rd); FD_ZERO(&rd);
maxfd = (out >= sockfd) ? out : sockfd; maxfd = (out >= sockfd) ? out : sockfd;
@ -165,22 +147,29 @@ main(int argc, char **argv)
if (r < 0) { if (r < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;
fprintf(log, "error on select()\n"); syslog(LOG_ERR, strerror(errno));
status = -1; status = 1;
break; break;
} else if (r == 0 && last_response-time(NULL) >= PING_TIMEOUT) { } else if (r == 0 && last_response - time(NULL) >= PING_TIMEOUT) {
fprintf(log, "ping timeout\n"); syslog(LOG_ERR, "ping timeout");
status = -1; status = 1;
break; break;
} }
if (FD_ISSET(out, &rd)) if (FD_ISSET(out, &rd)) {
if ((i = read(out, buf, sizeof(buf))) > 0) { if ((i = read(out, buf, sizeof(buf))) < 0) {
if (errno == EINTR)
continue;
syslog(LOG_ERR, "broken pipe");
status = 1;
break;
} else if (i > 0) {
buf[i] = 0; buf[i] = 0;
if (use_ssl) if (use_ssl)
SSL_write(ssl, buf, strlen(buf)); SSL_write(ssl, buf, strlen(buf));
else else
send(sockfd, buf, strlen(buf), 0); send(sockfd, buf, strlen(buf), 0);
} }
}
if (FD_ISSET(sockfd, &rd)) { if (FD_ISSET(sockfd, &rd)) {
if (use_ssl) { if (use_ssl) {
do { do {
@ -194,15 +183,15 @@ main(int argc, char **argv)
i = recv(sockfd, buf, sizeof(buf), 0); i = recv(sockfd, buf, sizeof(buf), 0);
if (i != -1) { if (i != -1) {
if (i == 0) { if (i == 0) {
fprintf(log, "connection closed\n"); syslog(LOG_NOTICE, "connection closed");
break; break;
} }
buf[i] = 0; buf[i] = 0;
if (write(in, buf, strlen(buf)) < 0) { if (write(in, buf, strlen(buf)) < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;
fprintf(log, "error on write()\n"); syslog(LOG_ERR, "broken pipe");
status = -1; status = 1;
break; break;
} }
last_response = time(NULL); last_response = time(NULL);
@ -213,7 +202,7 @@ main(int argc, char **argv)
close(sockfd); close(sockfd);
close(in); close(in);
close(out); close(out);
fclose(log); closelog();
ERR_free_strings(); ERR_free_strings();
EVP_cleanup(); EVP_cleanup();
@ -225,5 +214,6 @@ main(int argc, char **argv)
unlink(buf); unlink(buf);
snprintf(buf, 512, "/tmp/%s.out", host); snprintf(buf, 512, "/tmp/%s.out", host);
unlink(buf); unlink(buf);
exit(status);
return status;
} }