#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
+#include <sys/un.h>
#include <sys/file.h>
#include <sys/ioctl.h>
{
return *s == NULL;
}
+
+_hidden int libxl__prepare_sockaddr_un(libxl__gc *gc, struct sockaddr_un *un,
+ const char *path, const char *what);
#endif
/*
static int qmp_open(libxl__qmp_handler *qmp, const char *qmp_socket_path,
int timeout)
{
+ GC_INIT(qmp->ctx);
int ret = -1;
int i = 0;
struct sockaddr_un addr;
goto out;
}
- if (sizeof(addr.sun_path) <= strlen(qmp_socket_path)) {
- ret = -1;
+ ret = libxl__prepare_sockaddr_un(gc, &addr, qmp_socket_path, "QMP socket");
+ if (ret)
goto out;
- }
- memset(&addr, 0, sizeof(addr));
- addr.sun_family = AF_UNIX;
- strncpy(addr.sun_path, qmp_socket_path, sizeof(addr.sun_path));
do {
ret = connect(qmp->qmp_fd, (struct sockaddr *) &addr, sizeof(addr));
out:
if (ret == -1 && qmp->qmp_fd > -1) close(qmp->qmp_fd);
+ GC_FREE;
return ret;
}
return ret;
}
+int libxl__prepare_sockaddr_un(libxl__gc *gc,
+ struct sockaddr_un *un, const char *path,
+ const char *what)
+{
+ if (sizeof(un->sun_path) <= strlen(path)) {
+ LOG(ERROR, "UNIX socket path '%s' is too long for %s", path, what);
+ LOG(DEBUG, "Path must be less than %zu bytes", sizeof(un->sun_path));
+ return ERROR_INVAL;
+ }
+ memset(un, 0, sizeof(struct sockaddr_un));
+ un->sun_family = AF_UNIX;
+ strncpy(un->sun_path, path, sizeof(un->sun_path));
+ return 0;
+}
+
/*
* Local variables:
* mode: C