Этот ответ использует 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];
}