Монтажный предохранитель дает неверный аргумент ошибки в Python - PullRequest
2 голосов
/ 24 июня 2011

Я написал код Python для предохранителя монтирования на точке монтирования.Это всегда дает неверный аргумент ошибки.Я пробовал ту же программу на C, и она отлично работает.Может ли любой из Python Guru помочь мне найти причину проблемы? Я вставил сюда код.

#!/usr/bin/python

import stat
import os
import ctypes
from ctypes.util import find_library

libc = ctypes.CDLL (find_library ("c"))

def fuse_mount_sys (mountpoint, fsname):
        fd = file.fileno (file ("/dev/fuse", 'w+'))
        if fd < 0:
                raise OSError("Could not open /dev/fuse")

        mnt_param = "%s,fd=%i,rootmode=%o,user_id=%i,group_id=%i" \
                        % ("allow_other,default_permissions,max_read=131072", \
                        fd, stat.S_IFDIR, os.getuid(), os.getgid())

        ret = libc.mount ("fuse", "/mount", "fuse", 0, mnt_param)
        if ret < 0:
                raise OSError("mount failed with code " + str(ret))
        return fd

fds = fuse_mount_sys ("/mount", "fuse")

Синтаксис монтирования:

int mount(const char *source, const char *target,
                 const char *filesystemtype, unsigned long mountflags,
                 const void *data);

Я пытался использовать swig, а такженаписание программы с использованием языка C, а затем создание .so из него, и они работали.Но мне интересно писать на чистом питоне.Заранее спасибо.

вывод strace:

$ strace -s 100 -v -e mount python fuse-mount.py 
mount("fuse", "/mount", "fuse", 0, "allow_other,default_permissions,max_read=131072,fd=3,rootmode=40000,user_id=0,group_id=0") = -1 EINVAL (Invalid argument)


$ strace -s 100 -v -e mount ./a.out 
mount("fuse", "/mount", "fuse", 0, "allow_other,default_permissions,max_read=131072,fd=3,rootmode=40000,user_id=0,group_id=0") = 0

1 Ответ

2 голосов
/ 24 июня 2011

ctypes.c_void_p нельзя инициализировать строкой. Вместо этого просто используйте строку без c_void_p.

Затем вы можете сравнить вывод

strace -v -e mount python mymount.py

и

strace -v -e mount ./mymount-c

пока они не совпадут.

Кроме того, убедитесь, что дескриптор файла fd все еще открыт при вызове mount. file("/dev/fuse", 'w+') будет автоматически собираться и закрываться некоторыми реализациями Python, включая cpython. Вы можете предотвратить это, присвоив результат file("/dev/fuse") переменной.

...