PageRenderTime 37ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/core/10.5/fusefs/fuse_main.c

http://macfuse.googlecode.com/
C | 167 lines | 128 code | 35 blank | 4 comment | 30 complexity | 599fbb664f1a93c93e1d39378480ea9d MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, GPL-2.0
  1. /*
  2. * Copyright (C) 2006-2008 Google. All Rights Reserved.
  3. * Amit Singh <singh@>
  4. */
  5. #include <sys/param.h>
  6. #include <sys/systm.h>
  7. #include <sys/conf.h>
  8. #include <mach/mach_types.h>
  9. #include <miscfs/devfs/devfs.h>
  10. #include <libkern/libkern.h>
  11. #include <libkern/OSMalloc.h>
  12. #include <libkern/locks.h>
  13. #include "fuse.h"
  14. #include "fuse_device.h"
  15. #include "fuse_ipc.h"
  16. #include "fuse_locking.h"
  17. #include "fuse_node.h"
  18. #include "fuse_nodehash.h"
  19. #include "fuse_sysctl.h"
  20. #include <fuse_mount.h>
  21. OSMallocTag fuse_malloc_tag = NULL;
  22. extern struct vfs_fsentry fuse_vfs_entry;
  23. extern vfstable_t fuse_vfs_table_ref;
  24. kern_return_t fusefs_start(kmod_info_t *ki, void *d);
  25. kern_return_t fusefs_stop(kmod_info_t *ki, void *d);
  26. static void
  27. fini_stuff(void)
  28. {
  29. if (fuse_device_mutex) {
  30. lck_mtx_free(fuse_device_mutex, fuse_lock_group);
  31. fuse_device_mutex = NULL;
  32. }
  33. if (fuse_lock_group) {
  34. lck_grp_free(fuse_lock_group);
  35. fuse_lock_group = NULL;
  36. }
  37. if (fuse_malloc_tag) {
  38. OSMalloc_Tagfree(fuse_malloc_tag);
  39. fuse_malloc_tag = NULL;
  40. }
  41. if (fuse_lock_attr) {
  42. lck_attr_free(fuse_lock_attr);
  43. fuse_lock_attr = NULL;
  44. }
  45. if (fuse_group_attr) {
  46. lck_grp_attr_free(fuse_group_attr);
  47. fuse_group_attr = NULL;
  48. }
  49. }
  50. static kern_return_t
  51. init_stuff(void)
  52. {
  53. kern_return_t ret = KERN_SUCCESS;
  54. fuse_malloc_tag = OSMalloc_Tagalloc(MACFUSE_BUNDLE_IDENTIFIER,
  55. OSMT_DEFAULT);
  56. if (fuse_malloc_tag == NULL) {
  57. ret = KERN_FAILURE;
  58. }
  59. fuse_lock_attr = lck_attr_alloc_init();
  60. fuse_group_attr = lck_grp_attr_alloc_init();
  61. lck_attr_setdebug(fuse_lock_attr);
  62. if (ret == KERN_SUCCESS) {
  63. fuse_lock_group = lck_grp_alloc_init(MACFUSE_BUNDLE_IDENTIFIER,
  64. fuse_group_attr);
  65. if (fuse_lock_group == NULL) {
  66. ret = KERN_FAILURE;
  67. }
  68. }
  69. if (ret == KERN_SUCCESS) {
  70. fuse_device_mutex = lck_mtx_alloc_init(fuse_lock_group, fuse_lock_attr);
  71. if (fuse_device_mutex == NULL) {
  72. ret = ENOMEM;
  73. }
  74. }
  75. if (ret != KERN_SUCCESS) {
  76. fini_stuff();
  77. }
  78. return ret;
  79. }
  80. kern_return_t
  81. fusefs_start(__unused kmod_info_t *ki, __unused void *d)
  82. {
  83. int ret;
  84. ret = init_stuff();
  85. if (ret != KERN_SUCCESS) {
  86. return KERN_FAILURE;
  87. }
  88. ret = HNodeInit(fuse_lock_group, fuse_lock_attr, fuse_malloc_tag,
  89. kHNodeMagic, sizeof(struct fuse_vnode_data));
  90. if (ret != KERN_SUCCESS) {
  91. goto error;
  92. }
  93. ret = vfs_fsadd(&fuse_vfs_entry, &fuse_vfs_table_ref);
  94. if (ret != 0) {
  95. fuse_vfs_table_ref = NULL;
  96. goto error;
  97. }
  98. ret = fuse_devices_start();
  99. if (ret != KERN_SUCCESS) {
  100. goto error;
  101. }
  102. fuse_sysctl_start();
  103. IOLog("MacFUSE: starting (version %s, %s)\n",
  104. MACFUSE_VERSION, MACFUSE_TIMESTAMP);
  105. return KERN_SUCCESS;
  106. error:
  107. if (fuse_vfs_table_ref) {
  108. (void)vfs_fsremove(fuse_vfs_table_ref);
  109. }
  110. HNodeTerm();
  111. fini_stuff();
  112. return KERN_FAILURE;
  113. }
  114. kern_return_t
  115. fusefs_stop(__unused kmod_info_t *ki, __unused void *d)
  116. {
  117. int ret;
  118. ret = fuse_devices_stop();
  119. if (ret != KERN_SUCCESS) {
  120. return KERN_FAILURE;
  121. }
  122. ret = vfs_fsremove(fuse_vfs_table_ref);
  123. if (ret != KERN_SUCCESS) {
  124. return KERN_FAILURE;
  125. }
  126. HNodeTerm();
  127. fini_stuff();
  128. fuse_sysctl_stop();
  129. IOLog("MacFUSE: stopping (version %s, %s)\n",
  130. MACFUSE_VERSION, MACFUSE_TIMESTAMP);
  131. return KERN_SUCCESS;
  132. }