diff options
author | Leandro A. F. Pereira <leandro@hardinfo.org> | 2006-10-15 21:57:09 +0000 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2006-10-15 21:57:09 +0000 |
commit | 3722c94e232b39d2a05ef359a60d25ac0cbe7887 (patch) | |
tree | 3212d41dd2db5e96fe09587a80f6606e9fb69317 /hardinfo2/socket.c | |
parent | 9949aa0b97e44d67713eed79859028c5ba92b1a3 (diff) |
Make menu shortcuts work, plug memory leaks, socket code cleanup
Diffstat (limited to 'hardinfo2/socket.c')
-rw-r--r-- | hardinfo2/socket.c | 57 |
1 files changed, 39 insertions, 18 deletions
diff --git a/hardinfo2/socket.c b/hardinfo2/socket.c index d1bd4af3..556466d0 100644 --- a/hardinfo2/socket.c +++ b/hardinfo2/socket.c @@ -42,27 +42,24 @@ Socket *sock_connect(gchar * host, gint port) server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(host); server.sin_port = htons(port); - - if (connect(sock, (struct sockaddr *) (void *) &server, sizeof(server)) < 0) { + + if (connect + (sock, (struct sockaddr *) (void *) &server, + sizeof(server)) < 0) { return NULL; } s = g_new0(Socket, 1); s->sock = sock; - + return s; } return NULL; } -int sock_write(Socket * s, gchar * str) -{ - return write(s->sock, str, strlen(str)); -} - /* From: http://www.erlenstar.demon.co.uk/unix/faq_3.html#SEC26 */ -int sock_is_ready(Socket *s) +static inline int __sock_is_ready(Socket * s, int mode) { int rc, fd = s->sock; fd_set fds; @@ -72,27 +69,51 @@ int sock_is_ready(Socket *s) FD_SET(fd, &fds); tv.tv_sec = tv.tv_usec = 0; - rc = select(fd+1, &fds, NULL, NULL, &tv); + if (mode == 0) { + /* read */ + rc = select(fd + 1, &fds, NULL, NULL, &tv); + } else { + /* write */ + rc = select(fd + 1, NULL, &fds, NULL, &tv); + } + if (rc < 0) - return -1; + return -1; return FD_ISSET(fd, &fds) ? 1 : 0; } +int sock_ready_to_read(Socket * s) +{ + return __sock_is_ready(s, 0); +} + +int sock_ready_to_write(Socket * s) +{ + return __sock_is_ready(s, 1); +} + int sock_read(Socket * s, gchar * buffer, gint size) { - if (sock_is_ready(s)) { - gint n; + if (sock_ready_to_read(s)) { + gint n; - n = read(s->sock, buffer, size); - buffer[n] = '\0'; - - return n; + n = read(s->sock, buffer, size); + buffer[n] = '\0'; + + return n; } - + return 0; } +int sock_write(Socket * s, gchar * str) +{ + while (!sock_ready_to_write(s)); + + return write(s->sock, str, strlen(str)); +} + void sock_close(Socket * s) { close(s->sock); |