差分
このページの2つのバージョン間の差分を表示します。
blog:2013:2013-03-19 [2013-05-06 10:09] Decomo |
blog:2013:2013-03-19 [2015-01-06 11:51] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== Disk Arbitration Frameworkでディスクのマウントを抑制する ====== | ||
- | 物理HDDをVirtualBoxのVMに割り当てて使用中、Mac OSからそのHDDをマウントされると非常に不味いので、マウントを抑制するコマンドを作ってみた。 | ||
- | |||
- | 引数にBSDデバイス名(/ | ||
- | |||
- | どこか処理が不味いようで、何かの拍子にコマンドを終了してもFinderからはマウント不能?と認識されてしまうことがある(実際はマウントされているのでopenコマンドを使えば開ける)。こうなると再起動するしかなくなる…。AS ISでおながいします。 | ||
- | |||
- | <file c blockMount.c> | ||
- | // -*- coding: utf-8-unix -*- | ||
- | // --------------------------------------------------------- | ||
- | // Block Mount Utility | ||
- | // Copyright (c) 2013 Decomo | ||
- | // --------------------------------------------------------- | ||
- | // License: | ||
- | // 2-clause BSD license | ||
- | // Reference: | ||
- | // https:// | ||
- | // http:// | ||
- | // http:// | ||
- | // http:// | ||
- | // http:// | ||
- | // Compile: | ||
- | // cc BlockMount.c -g -o BlockMount -framework CoreFoundation -framework DiskArbitration | ||
- | // --------------------------------------------------------- | ||
- | |||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | |||
- | const char **g_blockDeviceList = NULL; | ||
- | int g_blockDeviceListCount = 0; | ||
- | int g_verbose = 0; | ||
- | int g_run = 1; | ||
- | |||
- | DADissenterRef diskWillMount(DADiskRef disk, void *context) | ||
- | { | ||
- | const char *devName = DADiskGetBSDName(disk); | ||
- | DADissenterRef dissenter = NULL; | ||
- | |||
- | if (devName) | ||
- | { | ||
- | int block=0; | ||
- | for (int i=0; i< | ||
- | { | ||
- | if (strstr(devName, | ||
- | block=1; | ||
- | } | ||
- | if (block) | ||
- | { | ||
- | if (g_verbose) | ||
- | fprintf(stderr, | ||
- | dissenter = DADissenterCreate(kCFAllocatorDefault, | ||
- | } | ||
- | } | ||
- | |||
- | return dissenter; | ||
- | } | ||
- | |||
- | void signalHandler(int sig) | ||
- | { | ||
- | switch (sig) { | ||
- | case SIGHUP: | ||
- | if (g_verbose) | ||
- | fprintf(stderr, | ||
- | CFRunLoopStop(CFRunLoopGetCurrent()); | ||
- | g_run=0; | ||
- | break; | ||
- | case SIGTERM: | ||
- | if (g_verbose) | ||
- | fprintf(stderr, | ||
- | CFRunLoopStop(CFRunLoopGetCurrent()); | ||
- | g_run=0; | ||
- | break; | ||
- | case SIGINT: | ||
- | if (g_verbose) | ||
- | fprintf(stderr, | ||
- | CFRunLoopStop(CFRunLoopGetCurrent()); | ||
- | g_run=0; | ||
- | break; | ||
- | case SIGQUIT: | ||
- | if (g_verbose) | ||
- | fprintf(stderr, | ||
- | CFRunLoopStop(CFRunLoopGetCurrent()); | ||
- | g_run=0; | ||
- | break; | ||
- | default: | ||
- | fprintf(stderr, | ||
- | break; | ||
- | } | ||
- | } | ||
- | |||
- | int main(int argc, const char *argv[]) | ||
- | { | ||
- | int usage=1; | ||
- | if (argc >= 2) | ||
- | { | ||
- | usage=0; | ||
- | if (strcmp(argv[1], | ||
- | { | ||
- | g_verbose=1; | ||
- | g_blockDeviceList = & | ||
- | g_blockDeviceListCount = argc-2; | ||
- | if (argc == 2) | ||
- | { | ||
- | usage=1; | ||
- | } | ||
- | } | ||
- | else | ||
- | { | ||
- | g_blockDeviceList = & | ||
- | g_blockDeviceListCount = argc-1; | ||
- | } | ||
- | } | ||
- | |||
- | if (usage) | ||
- | { | ||
- | fprintf(stderr, | ||
- | return EXIT_FAILURE; | ||
- | } | ||
- | |||
- | fprintf(stderr, | ||
- | for (int i=0; i< | ||
- | { | ||
- | fprintf(stderr, | ||
- | } | ||
- | fprintf(stderr, | ||
- | |||
- | signal(SIGHUP, | ||
- | signal(SIGTERM, | ||
- | signal(SIGINT, | ||
- | signal(SIGQUIT, | ||
- | |||
- | DAApprovalSessionRef session = DAApprovalSessionCreate(kCFAllocatorDefault); | ||
- | if (!session) | ||
- | { | ||
- | fprintf(stderr, | ||
- | return EXIT_FAILURE; | ||
- | } | ||
- | else | ||
- | { | ||
- | DARegisterDiskMountApprovalCallback(session, | ||
- | DAApprovalSessionScheduleWithRunLoop(session, | ||
- | |||
- | while (g_run) | ||
- | { | ||
- | CFRunLoopRun(); | ||
- | } | ||
- | |||
- | DAApprovalSessionUnscheduleFromRunLoop(session, | ||
- | DAUnregisterApprovalCallback(session, | ||
- | CFRelease(session); | ||
- | } | ||
- | |||
- | return 0; | ||
- | } | ||
- | </ | ||
- | |||
- | とまぁ、とりあえず作ってはみたものの、結局仮想マシンはVMware Fusionを常用してるので出番がないっていう。何だかんだでVirtualBoxは不安定なんだよねぇ。8 CPU以上使えるのは魅力的なんだけど。 |