summaryrefslogtreecommitdiff
path: root/hardinfo2/socket.c
diff options
context:
space:
mode:
authorLeandro A. F. Pereira <leandro@hardinfo.org>2006-10-15 21:57:09 +0000
committerLeandro A. F. Pereira <leandro@hardinfo.org>2006-10-15 21:57:09 +0000
commit3722c94e232b39d2a05ef359a60d25ac0cbe7887 (patch)
tree3212d41dd2db5e96fe09587a80f6606e9fb69317 /hardinfo2/socket.c
parent9949aa0b97e44d67713eed79859028c5ba92b1a3 (diff)
Make menu shortcuts work, plug memory leaks, socket code cleanup
Diffstat (limited to 'hardinfo2/socket.c')
-rw-r--r--hardinfo2/socket.c57
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);