{
struct messaging_dgm_context *ctx = talloc_get_type_abort(
backend->private_data, struct messaging_dgm_context);
- fstring pid_str;
- char buf[PATH_MAX];
- char *dst_sock, *to_free;
struct messaging_dgm_hdr hdr;
struct iovec iov2[iovlen + 1];
- ssize_t pathlen;
struct server_id_buf idbuf;
+ struct sockaddr_un dst;
+ ssize_t dst_pathlen;
int ret;
- fstr_sprintf(pid_str, "msg/%u", (unsigned)pid.pid);
+ dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
- pathlen = full_path_tos(ctx->cache_dir, pid_str, buf, sizeof(buf),
- &dst_sock, &to_free);
- if (pathlen == -1) {
- return NT_STATUS_NO_MEMORY;
+ dst_pathlen = snprintf(dst.sun_path, sizeof(dst.sun_path),
+ "%s/msg/%u", ctx->cache_dir, (unsigned)pid.pid);
+ if (dst_pathlen >= sizeof(dst.sun_path)) {
+ return NT_STATUS_NAME_TOO_LONG;
}
hdr.msg_version = MESSAGE_VERSION;
memcpy(iov2+1, iov, iovlen*sizeof(struct iovec));
become_root();
- ret = unix_msg_send(ctx->dgm_ctx, dst_sock, iov2, iovlen + 1);
+ ret = unix_msg_send(ctx->dgm_ctx, &dst, iov2, iovlen + 1);
unbecome_root();
- TALLOC_FREE(to_free);
-
if (ret != 0) {
return map_nt_error_from_unix(ret);
}
int ret;
unsigned i;
unsigned num_ctxs = 1;
+ struct sockaddr_un dst;
if (argc < 2) {
fprintf(stderr, "Usage: %s <sockname> [num_contexts]\n", argv[0]);
iov.iov_base = &i;
iov.iov_len = sizeof(i);
+ dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
+ strlcpy(dst.sun_path, argv[1], sizeof(dst.sun_path));
+
for (i=0; i<num_ctxs; i++) {
unsigned j;
for (j=0; j<100000; j++) {
- ret = unix_msg_send(ctxs[i], argv[1], &iov, 1);
+ ret = unix_msg_send(ctxs[i], &dst, &iov, 1);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
state.buf = NULL;
state.buflen = 0;
- ret = unix_msg_send(ctx1, addr2.sun_path, NULL, 0);
+ ret = unix_msg_send(ctx1, &addr2, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
state.buf = &msg;
state.buflen = sizeof(msg);
- ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
+ ret = unix_msg_send(ctx1, &addr2, &iov, 1);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
state.buflen = sizeof(buf);
for (i=0; i<3; i++) {
- ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
+ ret = unix_msg_send(ctx1, &addr2, &iov, 1);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
return 1;
}
- ret = unix_msg_send(ctx2, addr2.sun_path, &iov, 1);
+ ret = unix_msg_send(ctx2, &addr2, &iov, 1);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
j++;
}
- ret = unix_msg_send(ctx1, addr1.sun_path, iovs, j);
+ ret = unix_msg_send(ctx1, &addr1, iovs, j);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
printf("Filling send queues before freeing\n");
for (i=0; i<5; i++) {
- ret = unix_msg_send(ctx1, addr2.sun_path, &iov, 1);
+ ret = unix_msg_send(ctx1, &addr2, &iov, 1);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
return 1;
}
- ret = unix_msg_send(ctx1, addr1.sun_path, &iov, 1);
+ ret = unix_msg_send(ctx1, &addr1, &iov, 1);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
return 0;
}
-int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
+int unix_msg_send(struct unix_msg_ctx *ctx, const struct sockaddr_un *dst,
const struct iovec *iov, int iovlen)
{
ssize_t msglen;
struct iovec *iov_copy;
struct unix_msg_hdr hdr;
struct iovec src_iov;
- struct sockaddr_un dst;
- size_t dst_len;
-
- dst_len = strlen(dst_sock)+1;
- if (dst_len >= sizeof(dst.sun_path)) {
- return ENAMETOOLONG;
- }
- dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
- memcpy(dst.sun_path, dst_sock, dst_len);
if (iovlen < 0) {
return EINVAL;
sizeof(struct iovec) * iovlen);
}
- return unix_dgram_send(ctx->dgram, &dst, tmp_iov, iovlen+1);
+ return unix_dgram_send(ctx->dgram, dst, tmp_iov, iovlen+1);
}
hdr.msglen = msglen;
}
sent += (fragment_len - sizeof(ctx->cookie) - sizeof(hdr));
- ret = unix_dgram_send(ctx->dgram, &dst, iov_copy, iov_index);
+ ret = unix_dgram_send(ctx->dgram, dst, iov_copy, iov_index);
if (ret != 0) {
break;
}
* @return 0 on success, errno on failure
*/
-int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
+int unix_msg_send(struct unix_msg_ctx *ctx, const struct sockaddr_un *dst,
const struct iovec *iov, int iovlen);
/**