可以通过以下方式让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
参数传递会导致没有创建套接字。
有没有办法可以影响套接字的创建位置,例如有环境变量?
编辑:设置TMP
和TMPDIR
环境变量不会影响此行为。我在linux上运行它。
答案 0 :(得分:3)
由于似乎没有一种“官方”的方式来控制套接字的创建位置,你可以通过编写你自己的共享对象({1}}来沿着“大锤破解”这条道路走下去。并重写/ tmp:
中的任何connect()
地址
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
这似乎是通过读取strace输出(但我不知道如何实际运用套接字来证明它确实有效)。
答案 1 :(得分:-1)
您应该在bind()
(与连接相同的签名)之间插入,因为这是创建套接字的位置,然后是connect()
之间插入的客户端。