Openoffice管道(unix域套接字)除/ tmp之外的某个地方?

时间:2013-12-13 16:08:47

标签: posix openoffice.org uno unix-socket pyuno

可以通过以下方式让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上运行它。

2 个答案:

答案 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()之间插入的客户端。