1/*
2 * Copyright (c) 1998-2013 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24#ifndef __DISKARBITRATION_DISKARBITRATIONPRIVATE__
25#define __DISKARBITRATION_DISKARBITRATIONPRIVATE__
26
27#include <dispatch/dispatch.h>
28#include <CoreFoundation/CoreFoundation.h>
29#include <DiskArbitration/DiskArbitration.h>
30
31#ifdef __cplusplus
32extern "C" {
33#endif /* __cplusplus */
34
35#ifndef __DISKARBITRATIOND__
36#ifndef __LP64__
37
38#include <mach/mach.h>
39
40enum
41{
42    kDA_DISK_APPEARED                        = 1,
43    kDA_DISK_UNMOUNT_PRE_NOTIFY              = 2,
44    kDA_DISK_UNMOUNT_POST_NOTIFY             = 3,
45    kDA_DISK_EJECT_PRE_NOTIFY                = 4,
46    kDA_DISK_EJECT_POST_NOTIFY               = 5,
47    kDA_CLIENT_DISCONNECTED                  = 6,
48    kDA_DISK_CHANGED                         = 7,
49    kDA_NOTIFICATIONS_COMPLETE               = 8,
50    kDA_WILL_CLIENT_RELEASE_DEVICE           = 9,
51    kDA_DEVICE_RESERVATION_STATUS            = 10,
52    kDA_CLIENT_WILL_HANDLE_UNRECOGNIZED_DISK = 11,
53    kDA_DISK_APPEARED1                       = 12,
54    kDA_DISK_APPEARED_WITH_MT                = 13,
55    kDA_DISK_WILL_BE_CHECKED                 = 21,
56    kDA_CALL_FAILED                          = 22,
57    kDA_CALL_SUCCEEDED                       = 23,
58    kDA_DISK_APPROVAL_NOTIFY                 = 24,
59    kDA_DISK_APPEARED_COMPLETE               = 25
60};
61
62enum
63{
64    kDiskArbDeviceIsReserved          = 0,
65    kDiskArbDeviceIsNotReserved       = 1,
66    kDiskArbDeviceReservationObtained = 2,
67    kDiskArbDeviceReservationRefused  = 3
68};
69
70enum
71{
72    kDiskArbDiskAppearedLockedMask                 = 1 << 0,
73    kDiskArbDiskAppearedEjectableMask              = 1 << 1,
74    kDiskArbDiskAppearedWholeDiskMask              = 1 << 2,
75    kDiskArbDiskAppearedNetworkDiskMask            = 1 << 3,
76    kDiskArbDiskAppearedBeingCheckedMask           = 1 << 4,
77    kDiskArbDiskAppearedNonLeafDiskMask            = 1 << 5,
78    kDiskArbDiskAppearedCDROMMask                  = 1 << 6,
79    kDiskArbDiskAppearedDVDROMMask                 = 1 << 7,
80    kDiskArbDiskAppearedUnrecognizableFormat       = 1 << 8,
81    kDiskArbDiskAppearedUnrecognizableSection      = 1 << 9,
82    kDiskArbDiskAppearedRecognizableSectionMounted = 1 << 10,
83    kDiskArbDiskAppearedDialogDisplayed            = 1 << 11,
84    kDiskArbDiskAppearedNoMountMask                = 1 << 12,
85    kDiskArbDiskAppearedNoSizeMask                 = 1 << 13,
86    kDiskArbDiskAppearedCheckFailed                = 1 << 14,
87    kDiskArbDiskAppearedInternal                   = 1 << 15,
88    kDiskArbDiskAppearedBDROMMask                  = 1 << 16
89};
90
91enum
92{
93    kDiskArbApproveMounting       = 0,
94    kDiskArbDisallowMounting      = 1 << 0,
95    kDiskArbEjectDevice           = 1 << 2,
96    kDiskArbRequireAuthentication = 1 << 3,
97    kDiskArbMountReadOnly         = 1 << 4
98};
99
100enum
101{
102    kDiskArbUnmountAllFlag      = 1 << 0,
103    kDiskArbUnmountAndEjectFlag = 1 << 1,
104    kDiskArbUnmountOneFlag      = 1 << 2,
105    kDiskArbForceUnmountFlag    = 1 << 3,
106    kDiskArbNetworkUnmountFlag  = 1 << 4
107};
108
109enum
110{
111    kDiskArbCompletedDiskAppeared = 1 << 0,
112    kDiskArbCompletedPreUnmount   = 1 << 1,
113    kDiskArbCompletedPostUnmount  = 1 << 2,
114    kDiskArbCompletedPreEject     = 1 << 3,
115    kDiskArbCompletedPostEject    = 1 << 4
116};
117
118enum
119{
120    kDiskArbRenameSuccessful      = 1 << 0,
121    kDiskArbRenameRequiresRemount = 1 << 1
122};
123
124enum
125{
126    kDiskArbHandlesUnrecognizedFixedMedia           = 1 << 0,
127    kDiskArbHandlesUnrecognizedCDMedia              = 1 << 1,
128    kDiskArbHandlesUnrecognizedDVDMedia             = 1 << 2,
129    kDiskArbHandlesUnrecognizedOtherRemovableMedia  = 1 << 3,
130    kDiskArbHandlesUnrecognizedBDMedia              = 1 << 4,
131    kDiskArbHandlesUninitializedFixedMedia          = 1 << 10,
132    kDiskArbHandlesUninitializedCDMedia             = 1 << 11,
133    kDiskArbHandlesUninitializedDVDMedia            = 1 << 12,
134    kDiskArbHandlesUninitializedOtherRemovableMedia = 1 << 13,
135    kDiskArbHandlesUninitializedBDMedia             = 1 << 14
136};
137
138enum
139{
140    kDiskArbHandlesAllUnrecognizedMedia                = 0x000000FF,
141    kDiskArbHandlesAllUninitializedMedia               = 0x0000FF00,
142    kDiskArbHandlesAllUnrecognizedOrUninitializedMedia = 0x0000FFFF,
143};
144
145enum
146{
147    kDiskArbUnmountRequestFailed         = 1 << 0,
148    kDiskArbEjectRequestFailed           = 1 << 1,
149    kDiskArbUnmountAndEjectRequestFailed = 1 << 2,
150    kDiskArbDiskChangeRequestFailed      = 1 << 3
151};
152
153typedef char DiskArbDeviceTreePath[1024];
154typedef char DiskArbDiskIdentifier[1024];
155typedef char DiskArbGenericString[1024];
156typedef char DiskArbIOContent[1024];
157typedef char DiskArbMountpoint[1024];
158
159typedef void ( *DiskArbCallback_CallFailedNotification_t )( char * disk, int type, int status );
160
161typedef void ( *DiskArbCallback_CallSucceededNotification_t )( char * disk, int type );
162
163typedef void ( *DiskArbCallback_ClientDisconnectedNotification_t )( void );
164
165typedef void ( *DiskArbCallback_Device_Reservation_Status_t )( char * disk, int status, int pid );
166
167typedef int  ( *DiskArbCallback_DiskAppeared_t )( char * disk, unsigned flags, char * mountpoint, char * content );
168
169typedef void ( *DiskArbCallback_DiskAppeared2_t )( char *   disk,
170                                                   unsigned flags,
171                                                   char *   mountpoint,
172                                                   char *   content,
173                                                   char *   path,
174                                                   unsigned sequence );
175
176typedef void ( *DiskArbCallback_DiskAppearedComplete_t )( char *   disk,
177                                                          unsigned flags,
178                                                          char *   mountpoint,
179                                                          char *   content,
180                                                          char *   path,
181                                                          unsigned sequence,
182                                                          double   time,
183                                                          char *   filesystem,
184                                                          char *   name );
185
186typedef int  ( *DiskArbCallback_DiskAppearedWithMountpoint_t )( char * disk, unsigned flags, char * mountpoint );
187
188typedef void ( *DiskArbCallback_DiskApprovalNotification_t )( char *   disk,
189                                                              char *   name,
190                                                              char *   content,
191                                                              char *   path,
192                                                              unsigned flags,
193                                                              int      writable,
194                                                              int      removable,
195                                                              int      whole,
196                                                              char *   filesystem );
197
198typedef void ( *DiskArbCallback_DiskChangedNotification_t )( char * disk, char * mountpoint, char * name, int flags, int success );
199
200typedef void ( *DiskArbCallback_EjectPostNotification_t )( char * disk, int status, pid_t dissenter );
201
202typedef void ( *DiskArbCallback_EjectPreNotification_t )( char * disk, unsigned reserved0032 );
203
204typedef void ( *DiskArbCallback_DiskWillBeCheckedNotification_t )( char * disk, int flags, char * content );
205
206typedef void ( *DiskArbCallback_NotificationComplete_t )( int type );
207
208typedef void ( *DiskArbCallback_UnknownFileSystemNotification_t )( char * disk,
209                                                                   char * reserved0032,
210                                                                   char * reserved0064,
211                                                                   int    writable,
212                                                                   int    removable,
213                                                                   int    whole );
214
215typedef void ( *DiskArbCallback_UnmountPostNotification_t )( char * disk, int status, pid_t dissenter );
216
217typedef void ( *DiskArbCallback_UnmountPreNotification_t )( char * disk, unsigned reserved0032 );
218
219typedef void ( *DiskArbCallback_Will_Client_Release_t )( char * disk, int pid );
220
221typedef void ( *DiskArbCallback_Will_Client_Handle_Unrecognized_Disk_t )( char * disk,
222                                                                          int    type,
223                                                                          char * reserved0064,
224                                                                          char * reserved0096,
225                                                                          int    writable,
226                                                                          int    removable,
227                                                                          int    whole );
228
229extern void          DiskArbAddCallbackHandler( int type, void * callback, int overwrite );
230extern kern_return_t DiskArbClientHandlesUninitializedDisks_auto( int yes );
231extern kern_return_t DiskArbClientHandlesUnrecognizedDisks( int types, int priority );
232extern kern_return_t DiskArbClientRelinquishesReservation( char * disk, int pid, int status );
233extern kern_return_t DiskArbClientWillHandleUnrecognizedDisk( char * disk, int yes );
234extern kern_return_t DiskArbDiskAppearedWithMountpointPing_auto( char * disk, unsigned reserved0032, char * mountpoint );
235extern kern_return_t DiskArbDiskApprovedAck_auto( char * disk, int status );
236extern kern_return_t DiskArbDiskDisappearedPing_auto( char * disk, unsigned reserved0032 );
237extern kern_return_t DiskArbEjectPreNotifyAck_async_auto( char * disk, int status );
238extern kern_return_t DiskArbEjectRequest_async_auto( char * disk, unsigned flags );
239extern int           DiskArbGetVolumeEncoding_auto( char * disk );
240extern boolean_t     DiskArbHandleMsg( mach_msg_header_t * message, mach_msg_header_t * reply );
241extern kern_return_t DiskArbInit( void );
242extern int           DiskArbIsActive( void );
243extern kern_return_t DiskArbIsDeviceReservedForClient( char * disk );
244extern kern_return_t DiskArbMsgLoop( void );
245extern kern_return_t DiskArbMsgLoopWithTimeout( mach_msg_timeout_t timeout );
246extern void          DiskArbNoOp( void );
247extern kern_return_t DiskArbRefresh_auto( void );
248extern void          DiskArbRegisterCallback_CallFailedNotification( DiskArbCallback_CallFailedNotification_t callback );
249extern void          DiskArbRegisterCallback_CallSucceededNotification( DiskArbCallback_CallSucceededNotification_t callback );
250extern void          DiskArbRegisterCallback_ClientDisconnectedNotification( DiskArbCallback_ClientDisconnectedNotification_t callback );
251extern void          DiskArbRegisterCallback_DiskAppeared( DiskArbCallback_DiskAppeared_t callback );
252extern void          DiskArbRegisterCallback_DiskAppeared2( DiskArbCallback_DiskAppeared2_t callback );
253extern void          DiskArbRegisterCallback_DiskAppearedWithMountpoint( DiskArbCallback_DiskAppearedWithMountpoint_t callback );
254extern void          DiskArbRegisterCallback_DiskChangedNotification( DiskArbCallback_DiskChangedNotification_t callback );
255extern void          DiskArbRegisterCallback_DiskWillBeCheckedNotification( DiskArbCallback_DiskWillBeCheckedNotification_t callback );
256extern void          DiskArbRegisterCallback_EjectPostNotification( DiskArbCallback_EjectPostNotification_t callback );
257extern void          DiskArbRegisterCallback_EjectPreNotification( DiskArbCallback_EjectPreNotification_t callback );
258extern void          DiskArbRegisterCallback_NotificationComplete( DiskArbCallback_NotificationComplete_t callback );
259extern void          DiskArbRegisterCallback_UnknownFileSystemNotification( DiskArbCallback_UnknownFileSystemNotification_t callback );
260extern void          DiskArbRegisterCallback_UnmountPostNotification( DiskArbCallback_UnmountPostNotification_t callback );
261extern void          DiskArbRegisterCallback_UnmountPreNotification( DiskArbCallback_UnmountPreNotification_t callback );
262extern kern_return_t DiskArbReleaseClientReservationForDevice( char * disk );
263extern void          DiskArbRemoveCallbackHandler( int type, void * callback );
264extern kern_return_t DiskArbRequestDiskChange_auto( char * disk, char * name, int flags );
265extern kern_return_t DiskArbRequestMount_auto( char * disk );
266extern kern_return_t DiskArbRequestMountAndOwn_auto( char * disk );
267extern kern_return_t DiskArbRetainClientReservationForDevice( char * disk );
268extern kern_return_t DiskArbSetCurrentUser_auto( int user );
269extern kern_return_t DiskArbSetVolumeEncoding_auto( char * disk, int encoding );
270extern kern_return_t DiskArbStart( mach_port_t * port );
271extern kern_return_t DiskArbUnmountAndEjectRequest_async_auto( char * disk, unsigned flags );
272extern kern_return_t DiskArbUnmountPreNotifyAck_async_auto( char * disk, int status );
273extern kern_return_t DiskArbUnmountRequest_async_auto( char * disk, unsigned flags );
274extern void          DiskArbUpdateClientFlags( void );
275extern kern_return_t DiskArbVSDBAdoptVolume_auto( char * disk );
276extern kern_return_t DiskArbVSDBDisownVolume_auto( char * disk );
277extern int           DiskArbVSDBGetVolumeStatus_auto( char * disk );
278
279#endif /* !__LP64__ */
280#endif /* !__DISKARBITRATIOND__ */
281
282extern const CFStringRef kDAApprovalRunLoopMode;
283
284extern const CFStringRef kDADiskDescriptionAppearanceTimeKey;
285
286extern const CFStringRef kDADiskDescriptionMediaMatchKey;
287
288#ifndef __DISKARBITRATIOND__
289
290extern DADiskRef _DADiskCreateFromSerialization( CFAllocatorRef allocator, DASessionRef session, CFDataRef serialization );
291
292extern DASessionRef _DADiskGetSession( DADiskRef disk );
293
294extern DAReturn _DADiskSetAdoption( DADiskRef disk, Boolean adoption );
295
296extern DAReturn _DADiskSetEncoding( DADiskRef disk, UInt32 encoding );
297
298extern pid_t DADissenterGetProcessID( DADissenterRef dissenter );
299
300typedef void ( *DAIdleCallback )( void * context );
301
302extern void DARegisterIdleCallback( DASessionRef session, DAIdleCallback callback, void * context );
303
304#endif /* !__DISKARBITRATIOND__ */
305
306#ifdef __cplusplus
307}
308#endif /* __cplusplus */
309
310#endif /* !__DISKARBITRATION_DISKARBITRATIONPRIVATE__ */
311