gpt4 book ai didi

posix - Openoffice 管道(unix 域套接字)在/tmp 以外的某个地方?

转载 作者:行者123 更新时间:2023-12-01 14:02:17 26 4
gpt4 key购买 nike

可以让 Openoffice 通过 unix 域套接字接受 UNO 连接:

$soffice -headless -invisible -nocrashreport -nodefault -nologo -nofirststartwizard -norestore -conversionmode -accept='pipe,name=marcin_OOffice;urp;StarOffice.ComponentContext'

netstat 显示域套接字是在 /tmp/OSL_PIPE_1001_marcin_OOffice 中创建的。很好,但是由于我将在共享主机上运行它,所以我希望将套接字放在其他地方,例如在我家开车。但是,将完整文件路径(相对或绝对)作为 name 参数传递会导致没有创建套接字。

有没有一种方法可以影响创建套接字的位置,例如使用环境变量?

编辑:设置TMPTMPDIR 环境变量不会影响此行为。我在 linux 上运行这个。

最佳答案

由于似乎没有一种“官方”方式来控制套接字的创建位置,您可以通过编写自己的插入 connect( ) 并重写/tmp 中的所有 AF_FILE 地址:

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/socket.h>
#include <assert.h>
#include <linux/un.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>

int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen)
{
static int (*real_connect)(int, const struct sockaddr *, socklen_t) = NULL;
if (!real_connect)
real_connect = dlsym(RTLD_NEXT, "connect");

if (addr->sa_family == AF_FILE) {
// mutate sockaddr
assert(addrlen >= sizeof(struct sockaddr_un));
const struct sockaddr_un u = { AF_UNIX, "/foo/bar/path" };
// but only if it is in /tmp
if (!strncmp(((const struct sockaddr_un*)addr)->sun_path, "/tmp", 4)) {
return real_connect(sockfd, (const struct sockaddr*)&u, sizeof u);
}
}
return real_connect(sockfd, addr, addrlen);
}

编译:

gcc -Wall -Wextra test.c -ldl -shared -o interpose.so -fPIC

然后运行为:

LD_PRELOAD=./interpose.so soffice -headless -invisible -nocrashreport -nodefault -nologo -nofirststartwizard -norestore -conversionmode -accept='pipe,name=marcin_OOffice;urp;StarOffice.ComponentContext'

这似乎可以通过读取 strace 输出来工作(但我不知道如何实际使用套接字来证明它确实有效)。

关于posix - Openoffice 管道(unix 域套接字)在/tmp 以外的某个地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com