Определите, существует ли сетевой ресурс перед монтированием - PullRequest
5 голосов
/ 02 октября 2009

Я работаю над инструментом для автоматического подключения сетевых томов в зависимости от того, к какой беспроводной сети подключен пользователь. Установить объем легко:

NSURL *volumeURL = /* The URL to the network volume */

// Attempt to mount the volume
FSVolumeRefNum volumeRefNum;
OSStatus error = FSMountServerVolumeSync((CFURLRef)volumeURL, NULL, NULL, NULL, &volumeRefNum, 0L);

Однако, если на volumeURL нет общего сетевого ресурса (например, если кто-то выключил или удалил сетевой жесткий диск), Finder выдает сообщение об ошибке, объясняющее этот факт. Моя цель - чтобы этого не произошло - я хотел бы попытаться смонтировать том, но потерпеть неудачу в случае сбоя при монтировании.

У кого-нибудь есть советы, как это сделать? В идеале я хотел бы найти способ проверить, существует ли общий ресурс, прежде чем пытаться его смонтировать (чтобы избежать ненужной работы). Если это невозможно, то также можно использовать способ запретить Finder отображать сообщение об ошибке.

1 Ответ

6 голосов
/ 02 октября 2009

Этот ответ использует Private Frameworks. Как отметили в комментариях naixn, это означает, что он может выйти из строя даже в точечном выпуске.

Нет способа сделать это, используя только общедоступный API (который я могу найти после нескольких часов поиска / разборки).

Этот код будет обращаться к URL-адресу и не отображать пропущенные или не выполненные элементы интерфейса. Это включает не только ошибки, но и диалоги аутентификации, выбора и т. Д.

Кроме того, это не Finder, отображающий эти сообщения, а NetAuthApp от CoreServices. Вызываемая здесь функция (netfs_MountURLWithAuthenticationSync) вызывается непосредственно из функции в вопросе (FSMountServerVolumeSync). Вызов этого уровня позволяет нам пропустить флаг kSuppressAllUI.

В случае успеха rc равен 0, а точки монтирования содержат список строк NSS подключенных каталогов.

//
// compile with:
//
//  gcc -o test test.m -framework NetFS -framework Foundation
include <inttypes.h>
#include <Foundation/Foundation.h>

// Calls to FSMountServerVolumeSync result in kSoftMount being set
// kSuppressAllUI was found to exist here:
// http://www.opensource.apple.com/source/autofs/autofs-109.8/mount_url/mount_url.c
// its value was found by trial and error
const uint32_t kSoftMount     = 0x10000;
const uint32_t kSuppressAllUI = 0x00100;

int main(int argc, char** argv)
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    NSURL *volumeURL = [NSURL URLWithString:@"afp://server/path"];
    NSArray* mountpoints = nil;

    const uint32_t flags = kSuppressAllUI | kSoftMount;

    const int rc = netfs_MountURLWithAuthenticationSync((CFURLRef)volumeURL, NULL, NULL,
            NULL, flags, (CFArrayRef)&mountpoints);

    NSLog(@"mountpoints: %@; status = 0x%x", mountpoints, rc);

    [pool release];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...