index b3f9644a6127274c69763551589f6c398be67798..1c67ab72530f1551769810c6797cda064d36eb3b 100644 (file)
#ifndef _POSIX_C_SOURCE
# define _POSIX_C_SOURCE 200112L
#endif
+#ifndef _XOPEN_SOURCE
+# define _XOPEN_SOURCE 600
+#endif
#ifndef _REENTRANT
# define _REENTRANT
#endif
# define __attribute__(x) /**/
#endif
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "lcc_features.h"
+
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
+#include <math.h>
#include <netdb.h>
#include "client.h"
+/* NI_MAXHOST has been obsoleted by RFC 3493 which is a reason for SunOS 5.11
+ * to no longer define it. We'll use the old, RFC 2553 value here. */
+#ifndef NI_MAXHOST
+# 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
} 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)
(c)->errbuf[sizeof ((c)->errbuf) - 1] = 0; \
} while (0)
-#if 1
+#if COLLECT_DEBUG
# define LCC_DEBUG(...) printf (__VA_ARGS__)
#else
# define LCC_DEBUG(...) /**/
} /* }}} char *lcc_strdup */
__attribute__((nonnull (1, 2)))
-static char *lcc_strescape (char *dest, char *src, size_t dest_size) /* {{{ */
+static char *lcc_strescape (char *dest, const char *src, size_t dest_size) /* {{{ */
{
size_t dest_pos;
size_t src_pos;
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);
@@ -352,7 +384,9 @@ static int lcc_open_unixsocket (lcc_connection_t *c, const char *path) /* {{{ */
assert (c->fh == NULL);
assert (path != NULL);
- fd = socket (PF_UNIX, SOCK_STREAM, /* protocol = */ 0);
+ /* Don't use PF_UNIX here, because it's broken on Mac OS X (10.4, possibly
+ * others). */
+ fd = socket (AF_UNIX, SOCK_STREAM, /* protocol = */ 0);
if (fd < 0)
{
lcc_set_errno (c, errno);
/*
* Public functions
*/
+unsigned int lcc_version (void) /* {{{ */
+{
+ return (LCC_VERSION);
+} /* }}} unsigned int lcc_version */
+
+const char *lcc_version_string (void) /* {{{ */
+{
+ return (LCC_VERSION_STRING);
+} /* }}} const char *lcc_version_string */
+
+const char *lcc_version_extra (void) /* {{{ */
+{
+ return (LCC_VERSION_EXTRA);
+} /* }}} const char *lcc_version_extra */
+
int lcc_connect (const char *address, lcc_connection_t **ret_con) /* {{{ */
{
lcc_connection_t *c;
+ int status;
if (address == NULL)
return (-1);
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) /* {{{ */
key = res.lines[i];
value = strchr (key, '=');
if (value == NULL)
- BAIL_OUT (EPROTO);
+ BAIL_OUT (EILSEQ);
*value = 0;
value++;
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;
if (*ident_str == 0)
{
- lcc_set_errno (c, EPROTO);
+ lcc_set_errno (c, EILSEQ);
status = -1;
break;
}