在已挂载文件上执行 mdb-export 时出现“无法分配文件名”

在已挂载文件上执行 mdb-export 时出现“无法分配文件名”

我已经使用 CIFS 安装了一个 Windows 目录:

sudo mount -t cifs //SERVER/Bases/some/path ~/mnt/data -o user=windomain/login%password

这有效:

cp mnt/data/blabla/file.mdb .
/usr/bin/mdb-export file.mdb tablename

但事实并非如此:

/usr/bin/mdb-export mnt/data/blabla/file.mdb tablename

输出失败

Can't alloc filename

为什么?如何才能mdb-export在不先将文件复制到本地的情况下执行已挂载的文件?

答案1

这不是答案,但是评论太长了。

错误由此产生:

mdb->f->filename = (char *) mdb_find_file(filename);
if (!mdb->f->filename) {.
    fprintf(stderr, "Can't alloc filename\n");

那么让我们看看mdb_find_file...

从函数的开头可以看出,这可能是失败的原因:

while (dir[i]) {
    if (!strlen(dir[i])) continue;
    tmpfname = g_strconcat(dir[i++], "/", file_name, NULL);
    if (!stat(tmpfname, &status)) {
        g_strfreev(dir);
        return tmpfname;
    }
    g_free(tmpfname);
}
g_strfreev(dir);
return NULL;

该函数返回NULL,因此稍后会失败。

它好像在告诉我们找不到文件名。

您是否尝试过使用完整路径?您是否尝试过使用 UNC 路径?您是否尝试过使用路径smb://

答案2

一种解决方法是更改​​ mount 命令以添加noserverino,nounix选项:

sudo mount -t cifs //SERVER/Bases/some/path ~/mnt/data -o user=windomain/login%password,noserverino,nounix

Florian 为我指出了正确的方向,那就是mdb_find_fileMDB 工具源代码中的函数:

static gchar *mdb_find_file(char *file_name)
{
    struct stat status;
    gchar *mdbpath, **dir, *tmpfname;
    unsigned int i = 0;

    /* try the provided file name first */
    if (!stat(file_name, &status)) {
        return g_strdup(file_name);
    }

    /* Now pull apart $MDBPATH and try those */
    mdbpath = (gchar *) getenv("MDBPATH");
    /* no path, can't find file */
    if (!mdbpath || !strlen(mdbpath)) return NULL;

    dir = g_strsplit(mdbpath, ":", 0); 
    while (dir[i]) {
        if (!strlen(dir[i])) continue;
        tmpfname = g_strconcat(dir[i++], "/", file_name, NULL);
        if (!stat(tmpfname, &status)) {
            g_strfreev(dir);
            return tmpfname;
        }
        g_free(tmpfname);
    }
    g_strfreev(dir);
    return NULL;
}

由于我没有任何MDBPATH环境变量,因此调用时显然存在错误stat。我朝这个方向搜索了一下,得到了以下信息:

http://www.linuxquestions.org/questions/programming-9/problem-with-stat-o​​n-cifs-852983/

由于我没有尝试重新编译 MDB 工具来获取错误代码,我不确定这是否是同一个问题,但添加此线程建议的选项解决了我的问题,调用时不再出现错误mdb-export

相关内容