hrev48320 adds 2 changesets to branch 'master' old head: 5b1f411f575bbfcc0bc7e63b2598c32bbe99716c new head: 83b1a68c52ba3e0e8796282759f694b7fdddf06d overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=83b1a68+%5E5b1f411 ---------------------------------------------------------------------------- 28627b2: UserlandFS: avoid crash if module is not found. If we can't find the name in the module list, we would try to dereference the NULL pointer which terminates that list. 83b1a68: Move NetFS to a package This is based on Jalopeura's patch to #10191, however, there are some changes. From the patch: * Make userlandfs use separate "interface definition" files for each filesystem, so the netfs package can provide a configuration file * Add a short document on how to use NetFS * Various fixes to netfs to make it build again (volatile atomics) * The netfs_mount script for easier use of NetFS Additional fixes: * Move netfs_mount and the interface description file to data/ in the source tree * Use strlcat instead of strcat to avoid a buffer overflow * Some parts were already applied in previous commits [ Adrien Destugues <pulkomandy@xxxxxxxxx> ] ---------------------------------------------------------------------------- 14 files changed, 354 insertions(+), 134 deletions(-) build/jam/HaikuPackages | 1 + build/jam/OptionalPackages | 34 ---- build/jam/packages/NetFS | 27 ++++ build/jam/repositories/Haiku | 1 + data/bin/netfs_mount | 3 + data/userlandfs/file_systems/netfs | 18 +++ docs/add-ons/NetFS.html | 146 +++++++++++++++++ .../file_systems/netfs/server/ClientVolume.cpp | 2 +- .../netfs/server/InsecureConnectionListener.h | 2 +- .../file_systems/netfs/server/NetFSServer.cpp | 161 ++++++++++--------- .../file_systems/netfs/server/NetFSServer.h | 4 +- .../userlandfs/kernel_add_on/Settings.cpp | 66 ++++++-- .../server/haiku/HaikuKernelFileSystem.cpp | 2 +- src/data/package_infos/generic/netfs | 21 +++ ############################################################################ Commit: 28627b28aa84c2a1c0a07cf514782c514f9c672e URL: http://cgit.haiku-os.org/haiku/commit/?id=28627b2 Author: Adrien Destugues <pulkomandy@xxxxxxxxx> Date: Mon Nov 17 10:49:26 2014 UTC UserlandFS: avoid crash if module is not found. If we can't find the name in the module list, we would try to dereference the NULL pointer which terminates that list. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelFileSystem.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelFileSystem.cpp index bd98892..19f89d0 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelFileSystem.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelFileSystem.cpp @@ -398,7 +398,7 @@ userlandfs_create_file_system(const char* fsName, image_id image, // find the module file_system_module_info* module = NULL; - for (int32 i = 0; modules[i]->name; i++) { + for (int32 i = 0; modules[i] && modules[i]->name; i++) { if (strcmp(modules[i]->name, moduleName) == 0) { module = (file_system_module_info*)modules[i]; break; ############################################################################ Revision: hrev48320 Commit: 83b1a68c52ba3e0e8796282759f694b7fdddf06d URL: http://cgit.haiku-os.org/haiku/commit/?id=83b1a68 Author: Adrien Destugues <pulkomandy@xxxxxxxxx> Date: Mon Nov 17 14:24:07 2014 UTC Ticket: https://dev.haiku-os.org/ticket/10191 Move NetFS to a package This is based on Jalopeura's patch to #10191, however, there are some changes. From the patch: * Make userlandfs use separate "interface definition" files for each filesystem, so the netfs package can provide a configuration file * Add a short document on how to use NetFS * Various fixes to netfs to make it build again (volatile atomics) * The netfs_mount script for easier use of NetFS Additional fixes: * Move netfs_mount and the interface description file to data/ in the source tree * Use strlcat instead of strcat to avoid a buffer overflow * Some parts were already applied in previous commits ---------------------------------------------------------------------------- diff --git a/build/jam/HaikuPackages b/build/jam/HaikuPackages index f207eec..e8563e5 100644 --- a/build/jam/HaikuPackages +++ b/build/jam/HaikuPackages @@ -6,6 +6,7 @@ local packages = HaikuUserguide HaikuWelcome MakefileEngine + NetFS UserlandFS ; diff --git a/build/jam/OptionalPackages b/build/jam/OptionalPackages index 9c38936..47cea27 100644 --- a/build/jam/OptionalPackages +++ b/build/jam/OptionalPackages @@ -13,8 +13,6 @@ # FFMpeg - audio/video library # FFMpeg-devel - FFMpeg development files # Git - the distributed version control system -# NetFS - the native networked file system components -# UserlandFS - aids native file system development (like FUSE) # WebPositive - native, WebKit-based web browser # Welcome - introductory documentation to Haiku # WifiFirmwareScriptData - data files needed by install-wifi-firmwares.sh @@ -188,38 +186,6 @@ if [ IsOptionalHaikuImagePackageAdded Git ] { } -# NetFS network file system -if [ IsOptionalHaikuImagePackageAdded NetFS ] { -# TODO: Make this an actual package! -# # userlandfs module -# AddFilesToHaikuImage home config add-ons userlandfs -# : netfs ; -# -# # servers -# AddFilesToHaikuImage system servers : netfs_server ; -# AddFilesToHaikuImage system servers -# : authentication_server ; -# -# # tools -# AddFilesToHaikuImage system bin : netfs_config ; -# AddFilesToHaikuImage system bin : netfs_server_prefs ; -# -# #example settings for netfs_server -# local netfsServerSettingsFiles = <driver-settings>netfs-server ; -# SEARCH on $(netfsServerSettingsFiles) -# = [ FDirName $(HAIKU_TOP) src add-ons kernel file_systems netfs ] ; -# AddFilesToHaikuImage home config settings kernel drivers -# : $(netfsServerSettingsFiles) ; -# -# #userlandfs settings are needed for netfs_config to work (ioctls) -# local userlandfsServerSettingsFiles = <driver-settings>userlandfs ; -# SEARCH on $(userlandfsServerSettingsFiles) -# = [ FDirName $(HAIKU_TOP) src add-ons kernel file_systems userlandfs ] ; -# AddFilesToHaikuImage home config settings kernel drivers -# : $(userlandfsServerSettingsFiles) ; -} - - # WebPositive if [ IsOptionalHaikuImagePackageAdded WebPositive ] { local architectureObject ; diff --git a/build/jam/packages/NetFS b/build/jam/packages/NetFS new file mode 100644 index 0000000..7a9e0b8 --- /dev/null +++ b/build/jam/packages/NetFS @@ -0,0 +1,27 @@ +local netfsPackage = netfs.hpkg ; +HaikuPackage $(netfsPackage) ; + +# userlandfs module +AddFilesToPackage add-ons userlandfs : netfs ; + +# servers +AddFilesToPackage servers : netfs_server ; +AddFilesToPackage servers : authentication_server ; + +# tools +AddFilesToPackage bin : netfs_config ; +AddFilesToPackage bin : netfs_server_prefs ; +AddFilesToPackage bin + : [ FDirName $(HAIKU_TOP) data bin netfs_mount ] ; + +# interface definition +AddFilesToPackage data userlandfs file_systems + : [ FDirName $(HAIKU_TOP) data userlandfs file_systems netfs ] + : netfs ; + +# docs +AddFilesToPackage documentation add-ons : + [ FDirName $(HAIKU_TOP) docs add-ons NetFS.html ] : NetFS.html ; + +BuildHaikuPackage $(netfsPackage) : netfs ; + diff --git a/build/jam/repositories/Haiku b/build/jam/repositories/Haiku index 2445971..aedc72d 100644 --- a/build/jam/repositories/Haiku +++ b/build/jam/repositories/Haiku @@ -15,6 +15,7 @@ local packages = haiku_userguide haiku_welcome makefile_engine + netfs userland_fs haiku_$(secondaryArchs) diff --git a/data/bin/netfs_mount b/data/bin/netfs_mount new file mode 100644 index 0000000..85d25a6 --- /dev/null +++ b/data/bin/netfs_mount @@ -0,0 +1,3 @@ +/system/servers/authentication_server & +mkdir /network +mount -t userlandfs -p "netfs" /network diff --git a/data/userlandfs/file_systems/netfs b/data/userlandfs/file_systems/netfs new file mode 100644 index 0000000..d10d788 --- /dev/null +++ b/data/userlandfs/file_systems/netfs @@ -0,0 +1,18 @@ +# NetFS interface definition for UserlandFS + +file_system netfs { + # NET_FS_IOCTL_ADD_SERVER + ioctl 11000 { + buffer_size 256 + write_buffer_size 0 + is_buffer true + } + + # NET_FS_IOCTL_REMOVE_SERVER + ioctl 11001 { + buffer_size 256 + write_buffer_size 0 + is_buffer true + } +} + diff --git a/docs/add-ons/NetFS.html b/docs/add-ons/NetFS.html new file mode 100644 index 0000000..5c7b94d --- /dev/null +++ b/docs/add-ons/NetFS.html @@ -0,0 +1,146 @@ +<!-- +If you move this file, you must update the package rules file at +build/jam/packages/NetFS to reflect the new location. Otherwise the package will +not build. +--> +<html> +<head> +<title>NetFS</title> +<style> +.code { + font-family: monospace; + background: #eee; + border: 1px solid black; + whitespace: pre; + padding: 1em; +} +span.code { + padding: 0; + border: 0; +} +</style> +</head> +<body> + +<h1 align="center">NetFS</h1> + +<hr /> + +<h2 align="center">Client</h2> + +<p>To run the client, execute the following at the command line:</p> + +<pre class="code"> +$ netfs_mount +</pre> + +<p>A "Network" icon will appear on your desktop, containing remote servers +identified by host name. Inside the folder for each server are the shares on +that server.</p> + +<p>You can also run the steps individually:</p> + +<pre class="code"> +$ /system/servers/authentication_server & +$ mkdir /network +$ mount -t userlandfs -p "netfs" /network +</pre> + +<hr /> + +<h2 align="center">Server</h2> + +<p>To run the server:</p> + +<pre class="code"> +$ netfs_server_prefs launch +</pre> + +<p>You can also start the server directly if you prefer.</p> + +<pre class="code"> +$ /system/servers/netfs_server & +</pre> + +<p>The server will then run until you shut down your computer, but it is also +possible to stop it manually.</p> + +<pre class="code"> +$ netfs_server_prefs terminate +</pre> + +<p>Once the server is running, you can define shared folders. The first step is +to create a user who can access those folders, optionally with a password.</p> + +<pre class="code"> +$ netfs_server_prefs add user <name> [<password>] +</pre> + +<p>Next create a shared folder and assign a user some permissions on it.</p> + +<pre class="code"> +$ netfs_server_prefs add share <name> <path> +$ netfs_server_prefs permissions <user> <share> <flags> +</pre> + +<p><span class="code">name</span> is the name that will appear to clients when +they connect to your server. <span class="code">flags</span> is one or more of: +<span class="code">m</span> = mount, <span class="code">r</span> = read, <span +class="code">w</span> = write, <span class="code">q</span> = query.</p> + +<p>Don't forget to save your settings.</p> + +<pre class="code"> +$ netfs_server_prefs save +</pre> + +<p>The <span class="code">netfs_server_prefs</span> tool can also list and +remove users and shares. See the help for details.</p> + +<pre class="code"> +$ netfs_server_prefs --help +</pre> + +<hr /> + +<h2 align="center">Fallback Settings File</h2> + +<p>The settings file is stored in a binary format, but if it is missing or +damaged, the server will use a fallback settings file, which has a text-based +format. This file must be located at <span +class="code">/boot/home/config/settings/netfs/netfs_server_fallback</span>. (If +neither the main settings file nor the fallback settings file can be loaded, the +server will have no users or shares defined.) + +<p>Here is an example of a fallback settings file.</p> + +<pre class="code"> +# users +user bonefish { + password password +} + +# user without a password +user anonymous + +# shares +share ttttt { + path /boot/home/Desktop/ttttt + user bonefish { + permissions mount query read write + } +} + +share sub-ttttt { + path /boot/home/Desktop/ttttt/rmessage + user bonefish { + permissions mount query read write + } + user anonymous { + permissions mount query read + } +} +</pre> + +</body> + diff --git a/src/add-ons/kernel/file_systems/netfs/server/ClientVolume.cpp b/src/add-ons/kernel/file_systems/netfs/server/ClientVolume.cpp index f6af50a..8874b7d 100644 --- a/src/add-ons/kernel/file_systems/netfs/server/ClientVolume.cpp +++ b/src/add-ons/kernel/file_systems/netfs/server/ClientVolume.cpp @@ -520,7 +520,7 @@ ClientVolume::_NextVolumeID() } // sNextVolumeID -vint32 ClientVolume::sNextVolumeID = 0; +int32 ClientVolume::sNextVolumeID = 0; // #pragma - diff --git a/src/add-ons/kernel/file_systems/netfs/server/InsecureConnectionListener.h b/src/add-ons/kernel/file_systems/netfs/server/InsecureConnectionListener.h index e4e4471..738ab2d 100644 --- a/src/add-ons/kernel/file_systems/netfs/server/InsecureConnectionListener.h +++ b/src/add-ons/kernel/file_systems/netfs/server/InsecureConnectionListener.h @@ -27,7 +27,7 @@ public: User** user); private: - vint32 fSocket; + int32 fSocket; }; #endif // NET_FS_INSECURE_CONNECTION_LISTENER_H diff --git a/src/add-ons/kernel/file_systems/netfs/server/NetFSServer.cpp b/src/add-ons/kernel/file_systems/netfs/server/NetFSServer.cpp index 4b067eb..49041d1 100644 --- a/src/add-ons/kernel/file_systems/netfs/server/NetFSServer.cpp +++ b/src/add-ons/kernel/file_systems/netfs/server/NetFSServer.cpp @@ -40,8 +40,9 @@ #include "Utils.h" #include "VolumeManager.h" -static const char* kSettingsDirName = "netfs"; -static const char* kSettingsFileName = "netfs_server"; +static const char* kSettingsDirName = "netfs"; +static const char* kSettingsFileName = "netfs_server"; +static const char* kFallbackSettingsFileName = "netfs_server_fallback"; // usage static const char* kUsage = @@ -796,89 +797,91 @@ NetFSServer::_LoadSecurityContext(SecurityContext** _securityContext) } ObjectDeleter<SecurityContext> securityContextDeleter(securityContext); - // load from driver settings for the time being + // load the fallback settings, if present + BPath path; DriverSettings settings; - error = settings.Load("netfs-server"); - if (error != B_OK) - return error; - - // load users - DriverParameter parameter; - for (DriverParameterIterator it = settings.GetParameterIterator("user"); - it.GetNext(¶meter);) { - const char* userName = parameter.ValueAt(0); - const char* password = parameter.GetParameterValue("password"); - if (!userName) { - WARN("Skipping nameless user settings entry.\n"); - continue; + + if (_GetSettingsDirPath(&path, false) == B_OK + && path.Append(kFallbackSettingsFileName) == B_OK + && settings.Load(path.Path()) == B_OK) { + // load users + DriverParameter parameter; + for (DriverParameterIterator it = settings.GetParameterIterator("user"); + it.GetNext(¶meter);) { + const char* userName = parameter.ValueAt(0); + const char* password = parameter.GetParameterValue("password"); + if (!userName) { + WARN("Skipping nameless user settings entry.\n"); + continue; + } +// PRINT(("user: %s, password: %s\n", parameter.ValueAt(0), +// parameter.GetParameterValue("password"))); + error = securityContext->AddUser(userName, password); + if (error != B_OK) + ERROR("ERROR: Failed to add user `%s'\n", userName); } -// PRINT(("user: %s, password: %s\n", parameter.ValueAt(0), -// parameter.GetParameterValue("password"))); - error = securityContext->AddUser(userName, password); - if (error != B_OK) - ERROR("ERROR: Failed to add user `%s'\n", userName); - } - // load shares - for (DriverParameterIterator it = settings.GetParameterIterator("share"); - it.GetNext(¶meter);) { - const char* shareName = parameter.ValueAt(0); - const char* path = parameter.GetParameterValue("path"); - if (!shareName || !path) { - WARN("settings: Skipping invalid share settings entry (no name" - " or no path).\n"); - continue; - } -// PRINT(("share: %s, path: %s\n", parameter.ValueAt(0), -// parameter.GetParameterValue("path"))); - Share* share; - error = securityContext->AddShare(shareName, path, &share); - if (error != B_OK) { - ERROR("ERROR: Failed to add share `%s'\n", shareName); - continue; - } - BReference<Share> shareReference(share, true); - DriverParameter userParameter; - // iterate through the share users - for (DriverParameterIterator userIt - = parameter.GetParameterIterator("user"); - userIt.GetNext(&userParameter);) { - const char* userName = userParameter.ValueAt(0); -// PRINT((" user: %s\n", userName)); - User* user = securityContext->FindUser(userName); - if (!user) { - ERROR("ERROR: Undefined user `%s'.\n", userName); + // load shares + for (DriverParameterIterator it = settings.GetParameterIterator("share"); + it.GetNext(¶meter);) { + const char* shareName = parameter.ValueAt(0); + const char* path = parameter.GetParameterValue("path"); + if (!shareName || !path) { + WARN("settings: Skipping invalid share settings entry (no name" + " or no path).\n"); continue; } - BReference<User> userReference(user, true); - DriverParameter permissionsParameter; - if (!userParameter.FindParameter("permissions", - &permissionsParameter)) { +// PRINT(("share: %s, path: %s\n", parameter.ValueAt(0), +// parameter.GetParameterValue("path"))); + Share* share; + error = securityContext->AddShare(shareName, path, &share); + if (error != B_OK) { + ERROR("ERROR: Failed to add share `%s'\n", shareName); continue; } - Permissions permissions; - for (int32 i = 0; i < permissionsParameter.CountValues(); i++) { - const char* permission = permissionsParameter.ValueAt(i); -// PRINT((" permission: %s\n", permission)); - if (strcmp(permission, "mount") == 0) { - permissions.AddPermissions(MOUNT_SHARE_PERMISSION); - } else if (strcmp(permission, "query") == 0) { - permissions.AddPermissions(QUERY_SHARE_PERMISSION); - } else if (strcmp(permission, "read") == 0) { - permissions.AddPermissions(READ_PERMISSION - | READ_DIR_PERMISSION | RESOLVE_DIR_ENTRY_PERMISSION); - } else if (strcmp(permission, "write") == 0) { - permissions.AddPermissions(WRITE_PERMISSION - | WRITE_DIR_PERMISSION); - } else if (strcmp(permission, "all") == 0) { - permissions.AddPermissions(ALL_PERMISSIONS); + BReference<Share> shareReference(share, true); + DriverParameter userParameter; + // iterate through the share users + for (DriverParameterIterator userIt + = parameter.GetParameterIterator("user"); + userIt.GetNext(&userParameter);) { + const char* userName = userParameter.ValueAt(0); +// PRINT((" user: %s\n", userName)); + User* user = securityContext->FindUser(userName); + if (!user) { + ERROR("ERROR: Undefined user `%s'.\n", userName); + continue; + } + BReference<User> userReference(user, true); + DriverParameter permissionsParameter; + if (!userParameter.FindParameter("permissions", + &permissionsParameter)) { + continue; + } + Permissions permissions; + for (int32 i = 0; i < permissionsParameter.CountValues(); i++) { + const char* permission = permissionsParameter.ValueAt(i); +// PRINT((" permission: %s\n", permission)); + if (strcmp(permission, "mount") == 0) { + permissions.AddPermissions(MOUNT_SHARE_PERMISSION); + } else if (strcmp(permission, "query") == 0) { + permissions.AddPermissions(QUERY_SHARE_PERMISSION); + } else if (strcmp(permission, "read") == 0) { + permissions.AddPermissions(READ_PERMISSION + | READ_DIR_PERMISSION | RESOLVE_DIR_ENTRY_PERMISSION); + } else if (strcmp(permission, "write") == 0) { + permissions.AddPermissions(WRITE_PERMISSION + | WRITE_DIR_PERMISSION); + } else if (strcmp(permission, "all") == 0) { + permissions.AddPermissions(ALL_PERMISSIONS); + } + } + error = securityContext->SetNodePermissions(share->GetPath(), user, + permissions); + if (error != B_OK) { + ERROR("ERROR: Failed to set permissions for share `%s'\n", + share->GetName()); } - } - error = securityContext->SetNodePermissions(share->GetPath(), user, - permissions); - if (error != B_OK) { - ERROR("ERROR: Failed to set permissions for share `%s'\n", - share->GetName()); } } } @@ -929,8 +932,8 @@ NetFSServer::_LoadSettings() // if existing load the settings BEntry bEntry; - if (FDManager::SetEntry(&bEntry, filePath.Path()) == B_OK - && bEntry.Exists()) { + if (FDManager::SetEntry(&bEntry, filePath.Path()) != B_OK + || !bEntry.Exists()) { return B_ENTRY_NOT_FOUND; } diff --git a/src/add-ons/kernel/file_systems/netfs/server/NetFSServer.h b/src/add-ons/kernel/file_systems/netfs/server/NetFSServer.h index 0fa5dfb..c90b36c 100644 --- a/src/add-ons/kernel/file_systems/netfs/server/NetFSServer.h +++ b/src/add-ons/kernel/file_systems/netfs/server/NetFSServer.h @@ -87,10 +87,10 @@ private: thread_id fConnectionListenerThread; thread_id fConnectionDeleter; thread_id fBroadcaster; - vint32 fBroadcastingSocket; + int32 fBroadcastingSocket; sem_id fBroadcasterSemaphore; thread_id fServerInfoConnectionListener; - vint32 fServerInfoConnectionListenerSocket; + int32 fServerInfoConnectionListenerSocket; int32 fServerInfoUpdated; bool fUseBroadcasting; volatile bool fTerminating; diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Settings.cpp b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Settings.cpp index 7f675ad..be5da23 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Settings.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Settings.cpp @@ -2,6 +2,7 @@ #include <new> +#include <stdio.h> #include <stdlib.h> #include <driver_settings.h> @@ -13,7 +14,13 @@ using std::nothrow; -static const char *kFSName = "userlandfs"; +static const directory_which kDirectories[] = { + B_USER_NONPACKAGED_DATA_DIRECTORY, + B_USER_DATA_DIRECTORY, + B_SYSTEM_NONPACKAGED_DATA_DIRECTORY, + B_SYSTEM_DATA_DIRECTORY +}; +static const char *kFSSubpath = "/userlandfs/file_systems/"; // IOCtlInfoMap struct Settings::IOCtlInfoMap : public HashMap<HashKey32<int>, IOCtlInfo*> { @@ -163,21 +170,48 @@ Settings::SetTo(const char* fsName) fIOCtlInfos = new(nothrow) IOCtlInfoMap; if (!fIOCtlInfos) RETURN_ERROR(B_NO_MEMORY); - // load the driver settings and find the entry for the FS - void *settings = load_driver_settings(kFSName); - const driver_parameter *fsParameter = NULL; - const driver_settings *ds = get_driver_settings(settings); - if (!ds) - RETURN_ERROR(B_ENTRY_NOT_FOUND); - fsParameter = _FindFSParameter(ds, fsName); - // init the object and unload the settings - status_t error = B_OK; - if (fsParameter) - _Init(ds, fsParameter); - else - error = B_ENTRY_NOT_FOUND; - unload_driver_settings(settings); - return B_OK; + + // load the driver settings for the FS + char path[B_PATH_NAME_LENGTH]; + for (size_t i = 0; i < sizeof(kDirectories) / sizeof(kDirectories[0]); + i++) { + if (find_directory(kDirectories[i], -1, false, (char*)&path, + B_PATH_NAME_LENGTH) != B_OK) { + continue; + } + + // construct the path within the directory + strlcat(path, kFSSubpath, B_PATH_NAME_LENGTH); + strlcat(path, fsName, B_PATH_NAME_LENGTH); + + // load the file at the constructed path + void *settings = load_driver_settings((char*)&path); + if (!settings) + continue; + + // get the settings from the loaded file + const driver_settings *ds = get_driver_settings(settings); + if (!ds) { + unload_driver_settings(settings); + continue; + } + + // get the parameter from the settings + const driver_parameter *fsParameter = NULL; + fsParameter = _FindFSParameter(ds, fsName); + + // init the object and unload the settings + if (fsParameter) + _Init(ds, fsParameter); + unload_driver_settings(settings); + + // if we found the parameter, we're done + if (fsParameter) + return B_OK; + } + + // if we get here, we did not find the parameter + return B_ENTRY_NOT_FOUND; } // Unset diff --git a/src/data/package_infos/generic/netfs b/src/data/package_infos/generic/netfs new file mode 100644 index 0000000..2775cda --- /dev/null +++ b/src/data/package_infos/generic/netfs @@ -0,0 +1,21 @@ +name netfs +version %HAIKU_VERSION% +architecture %HAIKU_PACKAGING_ARCH% +summary "NetFS" + +description "The package contains the NetFS add-on and servers." + +packager "The Haiku build system" +vendor "Haiku Project" + +copyrights "2001-2014 Haiku, Inc. et al" +licenses "MIT" + +provides { + netfs = %HAIKU_VERSION% compat >= R1~alpha1 +} + +requires { + userlandfs +} +