我已经使用 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_file
MDB 工具源代码中的函数:
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-on-cifs-852983/
由于我没有尝试重新编译 MDB 工具来获取错误代码,我不确定这是否是同一个问题,但添加此线程建议的选项解决了我的问题,调用时不再出现错误mdb-export
。