Я смонтировал каталог Windows с CIFS:
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
для смонтированного файла без предварительного его локального копирования?
Не ответ, но слишком долго для комментария.
Вот откуда возникает ошибка:
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://
?
Обходной путь - изменить команду монтирования, добавив опции noserverino,nounix
:
sudo mount -t cifs //SERVER/Bases/some/path ~/mnt/data -o user=windomain/login%password,noserverino,nounix
Флориан указал мне правильное направление, то есть функция 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
env var, очевидно, что в вызове stat
есть ошибка. Я погуглил в этом направлении и получил это:
http://www.linuxquestions.org/questions/programming-9/problem-with-stat-on-cifs-852983/ [ 1111]
Поскольку я не пытался перекомпилировать инструменты MDB для получения кода ошибки, я не уверен, что это та же самая проблема, но добавление опций, предложенных этим потоком, решило мою проблему, больше нет ошибки при вызове [ 116].