2

I've mounted a Windows directory with CIFS :

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

This works :

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

But this doesn't :

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

It fails with output

Can't alloc filename

Why ? How can I execute mdb-export on a mounted file without having to copy it locally first ?

2 Answers2

2

Not an answer, but too long for a comment.

This is where the error comes from:

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

So let's see what mdb_find_file does...

Seeing the beginning of the function, this is probably what fails:

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;

The function returns NULL, hence the fail later.

It looks like it's telling us that it can't find the filename.

Did you try using the full path? Did you try using the UNC path? Did you try using the smb:// path?

2

A workaround is to change the mount command to add the noserverino,nounix options :

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

Florian pointed me to the right direction, that is the mdb_find_file function in the source code of the MDB tools :

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;
}

As I don't have any MDBPATH env var, it's obvious that there is an error in the stat call. I googled in that direction and got this :

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

As I didn't try to recompile the MDB tools to get the error code, I'm not sure it's the same problem but adding the options that this thread suggested solved my problem, there's no more error when calling mdb-export.