Add _XOPEN_SOURCE=600 to all .c files with standards compliance defines.
[collectd.git] / src / libcollectdclient / client.c
index c5be3b9..1c67ab7 100644 (file)
@@ -29,6 +29,9 @@
 #ifndef _POSIX_C_SOURCE
 # define _POSIX_C_SOURCE 200112L
 #endif
+#ifndef _XOPEN_SOURCE
+# define _XOPEN_SOURCE 600
+#endif
 #ifndef _REENTRANT
 # define _REENTRANT
 #endif
 # define NI_MAXHOST 1025
 #endif
 
+/* OpenBSD doesn't have EPROTO, FreeBSD doesn't have EILSEQ. Oh what joy! */
+#ifndef EILSEQ
+# ifdef EPROTO
+#  define EILSEQ EPROTO
+# else
+#  define EILSEQ EINVAL
+# endif
+#endif
+
 /* Secure/static macros. They work like `strcpy' and `strcat', but assure null
  * termination. They work for static buffers only, because they use `sizeof'.
  * The `SSTRCATF' combines the functionality of `snprintf' and `strcat' which
@@ -84,7 +96,8 @@
   } while (0)
 
 #define SSTRCAT(d,s) do { \
-    strncat ((d), (s), sizeof (d)); \
+    size_t _l = strlen (d); \
+    strncpy ((d) + _l, (s), sizeof (d) - _l); \
     (d)[sizeof (d) - 1] = 0; \
   } while (0)
 
@@ -343,6 +356,12 @@ static int lcc_sendreceive (lcc_connection_t *c, /* {{{ */
   lcc_response_t res;
   int status;
 
+  if (c->fh == NULL)
+  {
+    lcc_set_errno (c, EBADF);
+    return (-1);
+  }
+
   status = lcc_send (c, command);
   if (status != 0)
     return (status);
@@ -553,6 +572,7 @@ const char *lcc_version_extra (void) /* {{{ */
 int lcc_connect (const char *address, lcc_connection_t **ret_con) /* {{{ */
 {
   lcc_connection_t *c;
+  int status;
 
   if (address == NULL)
     return (-1);
@@ -565,8 +585,15 @@ int lcc_connect (const char *address, lcc_connection_t **ret_con) /* {{{ */
     return (-1);
   memset (c, 0, sizeof (*c));
 
+  status = lcc_open_socket (c, address);
+  if (status != 0)
+  {
+    lcc_disconnect (c);
+    return (status);
+  }
+
   *ret_con = c;
-  return (lcc_open_socket (c, address));
+  return (0);
 } /* }}} int lcc_connect */
 
 int lcc_disconnect (lcc_connection_t *c) /* {{{ */
@@ -677,7 +704,7 @@ int lcc_getval (lcc_connection_t *c, lcc_identifier_t *ident, /* {{{ */
     key = res.lines[i];
     value = strchr (key, '=');
     if (value == NULL)
-      BAIL_OUT (EPROTO);
+      BAIL_OUT (EILSEQ);
 
     *value = 0;
     value++;
@@ -773,7 +800,7 @@ int lcc_putval (lcc_connection_t *c, const lcc_value_list_t *vl) /* {{{ */
 int lcc_flush (lcc_connection_t *c, const char *plugin, /* {{{ */
     lcc_identifier_t *ident, int timeout)
 {
-  char command[1024];
+  char command[1024] = "";
   lcc_response_t res;
   int status;
 
@@ -884,7 +911,7 @@ int lcc_listval (lcc_connection_t *c, /* {{{ */
 
     if (*ident_str == 0)
     {
-      lcc_set_errno (c, EPROTO);
+      lcc_set_errno (c, EILSEQ);
       status = -1;
       break;
     }