* Florian octo Forster <octo at verplant.org>
**/
-/* Set to C99 and POSIX code */
-#ifndef _ISOC99_SOURCE
-# define _ISOC99_SOURCE
-#endif
-#ifndef _POSIX_SOURCE
-# define _POSIX_SOURCE
-#endif
-#ifndef _POSIX_C_SOURCE
-# define _POSIX_C_SOURCE 200112L
-#endif
-#ifndef _REENTRANT
-# define _REENTRANT
-#endif
-
-/* Disable non-standard extensions */
-#ifdef _BSD_SOURCE
-# undef _BSD_SOURCE
-#endif
-#ifdef _SVID_SOURCE
-# undef _SVID_SOURCE
-#endif
-#ifdef _GNU_SOURCE
-# undef _GNU_SOURCE
+#if HAVE_CONFIG_H
+# include "config.h"
#endif
#if !defined(__GNUC__) || !__GNUC__
# define __attribute__(x) /**/
#endif
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "lcc_features.h"
#include <stdlib.h>
#include <stdio.h>
# 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)
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);
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;
}