Я хочу смонтировать каталог, который находится на другом хосте в моей сети. До сих пор я успешно делал это через afp
, с помощью Крепление (8) через системный вызов, вот так:
std::string syscmd = "mount -v -t afp -r \"afp://user:password@host/dir\" \"/tmp/foo/bar\"";
FILE *fd;
if(!(fd = popen(syscmd.c_str(), "r"))) {
std::cout << "oops. popen() failed." << std::endl;
exit(1);
}
Но я бы хотел монтировать напрямую с помощью вызова функции, без дополнительных накладных расходов на вызов оболочки с popen()
, Я не могу понять, как это сделать, используя крепление (2), который имеет эту подпись:
int mount(const char *type, const char *dir, int flags, void *data);
Что должно data
быть? Страница man не объясняет это в деталях. Например, он говорит:
Data
указатель на структуру, которая содержит тип конкретного
аргументы для монтажа. Формат этих структур аргументов
описано на странице руководства для каждой файловой системы.
Где эта справочная страница, на которую она ссылается? Есть ли какая-то другая документация, которую мне не хватает? Может кто-нибудь указать мне простой рабочий пример, чтобы проиллюстрировать использование mount (2) над afp? Есть лучший способ сделать это?
У вас есть причина требовать, чтобы это было сделано через mount(2)
?
Apple предоставляет NetFSMountURLSync()
функция из среды NetFS для монтирования сетевых файловых систем. К сожалению, единственной документацией является файл заголовка, поэтому я не могу ссылаться на него, но вот соответствующее объявление:
/*
* Given a URL that refers to a file server, connect to that server
* and mount stuff.
*
* If the URL just specifies a server and you can't just mount the
* "root directory" of the server, the user will be prompted with
* a window to let them select one or more items to mount from that
* server, otherwise whatever item the URL specifies to mount will
* be mounted.
*
* If the mountpath is provided it will be used as the mount point.
* If the mountpath is set to NULL, a default mount point will be used.
*
* If the user and passwd are set, they will override any user name
* or password that may be set in the URL. These calls go through the NetAuth agent.
* If the URL doesn't specify a password, and one is needed, the
* user will be prompted with a window requesting password.
*
* Options can be provided for the session open and the mount itself.
* If the mount is successful, the POSIX path to each mountpoint is
* returned as a CFStringRef in mountpoints.
*
* If the return value is zero the mount has succeeded.
*
* A positive non-zero return value represents an errno value
* (see /usr/include/sys/errno.h). For instance, a missing mountpoint
* error will be returned as ENOENT (2).
*
* A negative non-zero return value represents an OSStatus error.
* For instance, error -128 is userCanceledErr, returned when a mount
* operation is canceled by the user. These OSStatus errors are
* extended to include:
*
* from this header:
* ENETFSPWDNEEDSCHANGE -5045
* ENETFSPWDPOLICY -5046
* ENETFSACCOUNTRESTRICTED -5999
* ENETFSNOSHARESAVAIL -5998
* ENETFSNOAUTHMECHSUPP -5997
* ENETFSNOPROTOVERSSUPP -5996
*
* from <NetAuth/NetAuthErrors.h>
* kNetAuthErrorInternal -6600
* kNetAuthErrorMountFailed -6602
* kNetAuthErrorNoSharesAvailable -6003
* kNetAuthErrorGuestNotSupported -6004
* kNetAuthErrorAlreadyClosed -6005
*
*/
int
NetFSMountURLSync(
CFURLRef url, // URL to mount, e.g. nfs://server/path
CFURLRef mountpath, // Path for the mountpoint
CFStringRef user, // Auth user name (overrides URL)
CFStringRef passwd, // Auth password (overrides URL)
CFMutableDictionaryRef open_options, // Options for session open (see below)
CFMutableDictionaryRef mount_options, // Options for mounting (see below)
CFArrayRef *mountpoints) // Array of mountpoints
__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_NA);
Есть также асинхронная версия, если это полезно для вашего случая использования.
Как показано в этот ответ, вам нужно будет использовать kNetFSMountAtMountDirKey
вариант, если вы хотите диктовать точку монтирования.
Других решений пока нет …