diff --git a/ttynvt.c b/ttynvt.c index 025158f..9f6622f 100644 --- a/ttynvt.c +++ b/ttynvt.c @@ -33,7 +33,7 @@ static struct ttynvt_param { unsigned int major; unsigned int minor; - char *dev_name; + const char *dev_name; char *host; unsigned int port; unsigned int debug; @@ -216,49 +216,56 @@ static void *ttynvt_read_net(void *arg) return 0; } -static int ttynvt_connect(const char *host, unsigned int port) +static int srv_connect(const char *host, unsigned int port) { - struct sockaddr_in serveraddr; struct hostent *server; + int sockfd, err; - int sockfd = socket(AF_INET, SOCK_STREAM, 0); - + sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { ttynvt_log(LOG_ERR, "Socket open failed: %s\n", strerror(errno)); return sockfd; } + server = gethostbyname(host); if (server == NULL) { ttynvt_log(LOG_ERR, "Cannot resolve host name: %s\n", strerror(errno)); + close(sockfd); return -1; } + bzero((char *)&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serveraddr.sin_addr.s_addr, server->h_length); serveraddr.sin_port = htons(port); - if (connect - (sockfd, (const struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) + err = connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); + if (err < 0) { ttynvt_log(LOG_ERR, "Failed to connect to: %s:%u:%s\n", host, port, strerror(errno)); + close(sockfd); return -1; } + return sockfd; } -int srv_write(void *cctx, const void *buf, int len) +static int srv_write(void *cctx, const void *buf, int len) { ttynvt_t *tty = cctx; + int res; - return write(tty->fds[0].fd, buf, len); + res = write(tty->fds[0].fd, buf, len); + + return res; } -int srv_read(void *cctx, int timeout) +static int srv_read(void *cctx, int timeout) { ttynvt_t *tty = cctx; int res; @@ -287,7 +294,7 @@ int srv_read(void *cctx, int timeout) return 1; } -void modem_status_cb(void *cctx, int status) +static void modem_status_cb(void *cctx, int status) { ttynvt_t *tty = cctx; @@ -327,7 +334,7 @@ static void ttynvt_open(fuse_req_t req, struct fuse_file_info *info) return; } - sockfd = ttynvt_connect(ttynvt_param.host, ttynvt_param.port); + sockfd = srv_connect(ttynvt_param.host, ttynvt_param.port); if (sockfd < 0) { free(tty->tn); @@ -760,8 +767,10 @@ ttynvt_poll(fuse_req_t req, struct fuse_file_info *info, if (ttynvt_write_avail(tty) > 0) revents |= POLLOUT; + if (ttynvt_read_avail(tty) > 0) revents |= POLLIN; + if (tty->error) { if (tty->epipe == 0) @@ -830,7 +839,7 @@ int main(int argc, char *argv[]) { struct fuse_args args = FUSE_ARGS_INIT(argc, argv); - char dev_name[128] = { 0 }; + char dev_name[128]; const char *dev_info_argv[] = { dev_name }; openlog("ttynvt", LOG_PID, LOG_DAEMON); @@ -841,13 +850,15 @@ int main(int argc, char *argv[]) return 1; } - snprintf(dev_name, sizeof(dev_name), "DEVNAME=%s", - ttynvt_param.dev_name ? ttynvt_param.dev_name : "ttyNVT0"); + if (!ttynvt_param.dev_name) + ttynvt_param.dev_name = "ttyNVT0"; + + snprintf(dev_name, sizeof(dev_name), "DEVNAME=%s", ttynvt_param.dev_name); struct cuse_info ci = { .dev_major = ttynvt_param.major, .dev_minor = ttynvt_param.minor, - .dev_info_argc = 1, + .dev_info_argc = sizeof(dev_info_argv) / sizeof(char *), .dev_info_argv = dev_info_argv, .flags = CUSE_UNRESTRICTED_IOCTL, };