& ldquo; Невозможно выделить имя файла & rdquo; при выполнении экспорта mdb для смонтированного файла

Я смонтировал каталог 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 для смонтированного файла без предварительного его локального копирования?

2
задан 5 September 2013 в 16:51

2 ответа

Не ответ, но слишком долго для комментария.

Вот откуда возникает ошибка:

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://?

0
ответ дан 5 September 2013 в 16:51

Обходной путь - изменить команду монтирования, добавив опции 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].

0
ответ дан 5 September 2013 в 16:51

Другие вопросы по тегам:

Похожие вопросы: