struct sockaddr_un s_un;
int fd, ret, closeret;
+ if (strlen(pathname) >= sizeof(s_un.sun_path)) {
+ ERR("unix socket address (\"%s\") is longer than the platform's limit (%zu > %zu).",
+ pathname, strlen(pathname) + 1,
+ sizeof(s_un.sun_path));
+ ret = -ENAMETOOLONG;
+ goto error;
+ }
+
fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (fd < 0) {
PERROR("socket");
int lttcomm_create_unix_sock(const char *pathname)
{
struct sockaddr_un s_un;
- int fd;
+ int fd = -1;
int ret = -1;
+ if (strlen(pathname) >= sizeof(s_un.sun_path)) {
+ ERR("unix socket address (\"%s\") is longer than the platform's limit (%zu > %zu).",
+ pathname, strlen(pathname) + 1,
+ sizeof(s_un.sun_path));
+ ret = -ENAMETOOLONG;
+ goto error;
+ }
+
/* Create server socket */
if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
PERROR("socket");
{
struct msghdr msg;
struct iovec iov[1];
- ssize_t ret = -1;
+ ssize_t ret;
memset(&msg, 0, sizeof(msg));
msg.msg_iov = iov;
msg.msg_iovlen = 1;
- ret = sendmsg(sock, &msg, 0);
- if (ret < 0) {
- /*
- * Only warn about EPIPE when quiet mode is deactivated.
- * We consider EPIPE as expected.
- */
- if (errno != EPIPE || !lttng_opt_quiet) {
- PERROR("sendmsg");
+ while (iov[0].iov_len) {
+ ret = sendmsg(sock, &msg, 0);
+ if (ret < 0) {
+ if (errno == EINTR) {
+ continue;
+ } else {
+ /*
+ * Only warn about EPIPE when quiet mode is
+ * deactivated.
+ * We consider EPIPE as expected.
+ */
+ if (errno != EPIPE || !lttng_opt_quiet) {
+ PERROR("sendmsg");
+ }
+ goto end;
+ }
}
+ iov[0].iov_len -= ret;
+ iov[0].iov_base += ret;
}
-
+ ret = len;
+end:
return ret;
}