[haiku-commits] Change in haiku[master]: integrate AutoDeleter's into pointers

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 9 Dec 2020 21:20:55 +0000

From X512 <danger_mail@xxxxxxx>:

X512 has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/3490 ;)


Change subject: integrate AutoDeleter's into pointers
......................................................................

integrate AutoDeleter's into pointers

Change-Id: I6c3925a7aec4d0647c76c2a03aad7b08985d7166
---
M src/add-ons/disk_systems/bfs/BFSAddOn.cpp
M src/add-ons/kernel/drivers/disk/virtual/ram_disk/ram_disk.cpp
M src/add-ons/kernel/file_systems/bindfs/Volume.cpp
M src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp
M src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp
M src/apps/aboutsystem/AboutSystem.cpp
M src/bin/fstrim.cpp
M src/bin/i2c/i2c.cpp
M src/bin/multiuser/multiuser_utils.cpp
M src/bin/package/PackageWritingUtils.cpp
M src/bin/ramdisk.cpp
M src/kits/network/libnetapi/NetworkDevice.cpp
M src/kits/network/libnetapi/NetworkInterface.cpp
M src/kits/network/libnetapi/NetworkRoster.cpp
M src/kits/network/libnetapi/NetworkRoute.cpp
M src/kits/package/RepositoryInfo.cpp
M src/kits/package/hpkg/PackageWriterImpl.cpp
M src/kits/package/manager/RepositoryBuilder.cpp
M src/preferences/virtualmemory/Settings.cpp
M src/servers/net/NetServer.cpp
M src/servers/package/CommitTransactionHandler.cpp
M src/servers/package/PackageFile.cpp
M src/servers/package/Volume.cpp
M src/servers/registrar/AuthenticationManager.cpp
M src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp
M src/system/boot/loader/package_support.cpp
M src/system/libnetwork/getifaddrs.cpp
M src/system/libroot/os/image.cpp
M src/tools/generate_boot_screen.cpp
29 files changed, 256 insertions(+), 334 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/90/3490/1

diff --git a/src/add-ons/disk_systems/bfs/BFSAddOn.cpp 
b/src/add-ons/disk_systems/bfs/BFSAddOn.cpp
index 7b5a5e5..274f148 100644
--- a/src/add-ons/disk_systems/bfs/BFSAddOn.cpp
+++ b/src/add-ons/disk_systems/bfs/BFSAddOn.cpp
@@ -226,12 +226,10 @@
        BPath path;
        path.SetTo(&directory, ".");

-       int fd = open(path.Path(), O_RDONLY);
-       if (fd < 0)
+       FileDescriptorCloser fd(open(path.Path(), O_RDONLY));
+       if (!fd.IsSet())
            return errno;

-       FileDescriptorCloser closer(fd);
-
        struct check_control result;
        memset(&result, 0, sizeof(result));
        result.magic = BFS_IOCTL_CHECK_MAGIC;
@@ -243,7 +241,7 @@
        }

        // start checking
-       if (ioctl(fd, BFS_IOCTL_START_CHECKING, &result, sizeof(result)) < 0)
+       if (ioctl(fd.Get(), BFS_IOCTL_START_CHECKING, &result, sizeof(result)) 
< 0)
            return errno;

        uint64 attributeDirectories = 0, attributes = 0;
@@ -252,7 +250,7 @@
        uint32 previousPass = result.pass;

        // check all files and report errors
-       while (ioctl(fd, BFS_IOCTL_CHECK_NEXT_NODE, &result,
+       while (ioctl(fd.Get(), BFS_IOCTL_CHECK_NEXT_NODE, &result,
                        sizeof(result)) == 0) {
                if (++counter % 50 == 0)
                        printf("%9" B_PRIu64 " nodes processed\x1b[1A\n", 
counter);
@@ -297,7 +295,7 @@
        }

        // stop checking
-       if (ioctl(fd, BFS_IOCTL_STOP_CHECKING, &result, sizeof(result)) != 0)
+       if (ioctl(fd.Get(), BFS_IOCTL_STOP_CHECKING, &result, sizeof(result)) 
!= 0)
                return errno;

        printf("        %" B_PRIu64 " nodes checked,\n\t%" B_PRIu64 " blocks 
not "
diff --git a/src/add-ons/kernel/drivers/disk/virtual/ram_disk/ram_disk.cpp 
b/src/add-ons/kernel/drivers/disk/virtual/ram_disk/ram_disk.cpp
index fdb3200..95429da 100644
--- a/src/add-ons/kernel/drivers/disk/virtual/ram_disk/ram_disk.cpp
+++ b/src/add-ons/kernel/drivers/disk/virtual/ram_disk/ram_disk.cpp
@@ -395,10 +395,9 @@
                static const size_t kPageCountPerIteration = 1024;
                static const size_t kMaxGapSize = 15;

-               int fd = open(fFilePath, O_WRONLY);
-               if (fd < 0)
+               FileDescriptorCloser fd(open(fFilePath, O_WRONLY));
+               if (!fd.IsSet())
                        return errno;
-               FileDescriptorCloser fdCloser(fd);

                vm_page** pages = new(std::nothrow) 
vm_page*[kPageCountPerIteration];
                ArrayDeleter<vm_page*> pagesDeleter(pages);
@@ -491,7 +490,7 @@
 
                        // write the buffer
                        if (error == B_OK) {
-                               ssize_t bytesWritten = pwrite(fd, buffer,
+                               ssize_t bytesWritten = pwrite(fd.Get(), buffer,
                                        pagesToWrite * B_PAGE_SIZE, offset);
                                if (bytesWritten < 0) {
                                        dprintf("ramdisk: error writing pages 
to file: %s\n",
@@ -793,21 +792,20 @@
        {
                static const size_t kPageCountPerIteration = 1024;
 
-               int fd = open(fFilePath, O_RDONLY);
-               if (fd < 0)
+               FileDescriptorCloser fd(open(fFilePath, O_RDONLY));
+               if (!fd.IsSet())
                        return errno;
-               FileDescriptorCloser fdCloser(fd);

-               vm_page** pages = new(std::nothrow) 
vm_page*[kPageCountPerIteration];
-               ArrayDeleter<vm_page*> pagesDeleter(pages);
+               ArrayDeleter<vm_page*> pages(
+                       new(std::nothrow) vm_page*[kPageCountPerIteration]);

-               uint8* buffer = (uint8*)malloc(kPageCountPerIteration * 
B_PAGE_SIZE);
-               MemoryDeleter bufferDeleter(buffer);
+               ArrayDeleter<uint8> buffer(
+                       new(std::nothrow) uint8[kPageCountPerIteration * 
B_PAGE_SIZE]);
                        // TODO: Ideally we wouldn't use a buffer to read the 
file content,
                        // but read into the pages we allocated directly. 
Unfortunately
                        // there's no API to do that yet.

-               if (pages == NULL || buffer == NULL)
+               if (!pages.IsSet() || !buffer.IsSet())
                        return B_NO_MEMORY;

                status_t error = B_OK;
@@ -836,7 +834,8 @@

                        // read from the file
                        size_t bytesToRead = pagesToRead * B_PAGE_SIZE;
-                       ssize_t bytesRead = pread(fd, buffer, bytesToRead, 
offset);
+                       ssize_t bytesRead = pread(fd.Get(), buffer.Get(), 
bytesToRead,
+                               offset);
                        if (bytesRead < 0) {
                                error = bytesRead;
                                break;
@@ -849,7 +848,7 @@

                        // clear the last read page, if partial
                        if ((size_t)bytesRead < pagesRead * B_PAGE_SIZE) {
-                               memset(buffer + bytesRead, 0,
+                               memset(buffer.Get() + bytesRead, 0,
                                        pagesRead * B_PAGE_SIZE - bytesRead);
                        }

@@ -858,7 +857,7 @@
                                vm_page* page = pages[i];
                                error = vm_memcpy_to_physical(
                                        page->physical_page_number * 
B_PAGE_SIZE,
-                                       buffer + i * B_PAGE_SIZE, B_PAGE_SIZE, 
false);
+                                       buffer.Get() + i * B_PAGE_SIZE, 
B_PAGE_SIZE, false);
                                if (error != B_OK)
                                        break;
                        }
@@ -873,7 +872,7 @@

                        size_t clearPages = 0;
                        for (size_t i = 0; i < pagesRead; i++) {
-                               uint64* pageData = (uint64*)(buffer + i * 
B_PAGE_SIZE);
+                               uint64* pageData = (uint64*)(buffer.Get() + i * 
B_PAGE_SIZE);
                                bool isClear = true;
                                for (size_t k = 0; isClear && k < B_PAGE_SIZE / 
8; k++)
                                        isClear = pageData[k] == 0;
@@ -892,7 +891,7 @@
                        // and compute the new allocated pages count.
                        if (pagesRead < allocatedPages) {
                                size_t count = allocatedPages - pagesRead;
-                               memcpy(pages + clearPages, pages + pagesRead,
+                               memcpy(pages.Get() + clearPages, pages.Get() + 
pagesRead,
                                        count * sizeof(vm_page*));
                                clearPages += count;
                        }
diff --git a/src/add-ons/kernel/file_systems/bindfs/Volume.cpp 
b/src/add-ons/kernel/file_systems/bindfs/Volume.cpp
index 5f53bd0..7f468a0 100644
--- a/src/add-ons/kernel/file_systems/bindfs/Volume.cpp
+++ b/src/add-ons/kernel/file_systems/bindfs/Volume.cpp
@@ -50,10 +50,11 @@
 Volume::Mount(const char* parameterString)
 {
        const char* source = NULL;
-       void* parameterHandle = parse_driver_settings_string(parameterString);
-       DriverSettingsUnloader parameterDeleter(parameterHandle);
-       if (parameterHandle != NULL)
-               source = get_driver_parameter(parameterHandle, "source", NULL, 
NULL);
+       DriverSettingsUnloader parametersHandle(
+               parse_driver_settings_string(parameterString));
+       if (parametersHandle.IsSet())
+               source = get_driver_parameter(
+                       parametersHandle.Get(), "source", NULL, NULL);
        if (source == NULL || source[0] == '\0') {
                ERROR("need source folder ('source' parameter)!\n");
                RETURN_ERROR(B_BAD_VALUE);
diff --git 
a/src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp 
b/src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp
index e7889f6..6146674 100644
--- a/src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/volume/PackageSettings.cpp
@@ -213,12 +213,12 @@
                return error;

        // load the driver settings
-       void* settingsHandle = load_driver_settings(path.Path());
-       if (settingsHandle == NULL)
+       DriverSettingsUnloader 
settingsHandle(load_driver_settings(path.Path()));
+       if (!settingsHandle.IsSet())
                return B_ENTRY_NOT_FOUND;
-       DriverSettingsUnloader settingsDeleter(settingsHandle);

-       const driver_settings* settings = get_driver_settings(settingsHandle);
+       const driver_settings* settings
+               = get_driver_settings(settingsHandle.Get());
        for (int i = 0; i < settings->parameter_count; i++) {
                const driver_parameter& parameter = settings->parameters[i];
                if (strcmp(parameter.name, "Package") != 0
diff --git a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp 
b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp
index eecfa53..595eb04 100644
--- a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp
+++ b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp
@@ -318,21 +318,21 @@
        const char* shineThrough = NULL;
        const char* packagesState = NULL;

-       void* parameterHandle = parse_driver_settings_string(parameterString);
-       if (parameterHandle != NULL) {
-               packages = get_driver_parameter(parameterHandle, "packages", 
NULL,
-                       NULL);
-               volumeName = get_driver_parameter(parameterHandle, 
"volume-name", NULL,
-                       NULL);
-               mountType = get_driver_parameter(parameterHandle, "type", NULL, 
NULL);
-               shineThrough = get_driver_parameter(parameterHandle, 
"shine-through",
+       DriverSettingsUnloader parameterHandle(
+               parse_driver_settings_string(parameterString));
+       if (parameterHandle.IsSet()) {
+               packages = get_driver_parameter(parameterHandle.Get(), 
"packages",
                        NULL, NULL);
-               packagesState = get_driver_parameter(parameterHandle, "state", 
NULL,
+               volumeName = get_driver_parameter(parameterHandle.Get(), 
"volume-name",
+                       NULL, NULL);
+               mountType = get_driver_parameter(parameterHandle.Get(), "type", 
NULL,
                        NULL);
+               shineThrough = get_driver_parameter(parameterHandle.Get(),
+                       "shine-through", NULL, NULL);
+               packagesState = get_driver_parameter(parameterHandle.Get(), 
"state",
+                       NULL, NULL);
        }

-       DriverSettingsUnloader parameterHandleDeleter(parameterHandle);
-
        if (packages != NULL && packages[0] == '\0') {
                FATAL("invalid package folder ('packages' parameter)!\n");
                RETURN_ERROR(B_BAD_VALUE);
@@ -707,14 +707,13 @@
        }

        // iterate through the "administrative" dir
-       DIR* dir = fdopendir(fd);
-       if (dir == NULL) {
+       DirCloser dir(fdopendir(fd));
+       if (!dir.IsSet()) {
                ERROR("Failed to open administrative directory: %s\n", 
strerror(errno));
                RETURN_ERROR(errno);
        }
-       DirCloser dirCloser(dir);

-       while (dirent* entry = readdir(dir)) {
+       while (dirent* entry = readdir(dir.Get())) {
                if (strncmp(entry->d_name, "state_", 6) != 0
                        || strcmp(entry->d_name, packagesState) < 0) {
                        continue;
@@ -813,20 +812,19 @@
        PackagesDirectory* packagesDirectory)
 {
        // try reading the activation file
-       int fd = openat(packagesDirectory->DirectoryFD(),
+       FileDescriptorCloser fd(openat(packagesDirectory->DirectoryFD(),
                packagesDirectory == fPackagesDirectory
                        ? kActivationFilePath : kActivationFileName,
-               O_RDONLY);
-       if (fd < 0) {
+               O_RDONLY));
+       if (!fd.IsSet()) {
                INFORM("Failed to open packages activation file: %s\n",
                        strerror(errno));
                RETURN_ERROR(errno);
        }
-       FileDescriptorCloser fdCloser(fd);

        // read the whole file into memory to simplify things
        struct stat st;
-       if (fstat(fd, &st) != 0) {
+       if (fstat(fd.Get(), &st) != 0) {
                ERROR("Failed to stat packages activation file: %s\n",
                        strerror(errno));
                RETURN_ERROR(errno);
@@ -842,7 +840,7 @@
                RETURN_ERROR(B_NO_MEMORY);
        MemoryDeleter fileContentDeleter(fileContent);

-       ssize_t bytesRead = read(fd, fileContent, st.st_size);
+       ssize_t bytesRead = read(fd.Get(), fileContent, st.st_size);
        if (bytesRead < 0) {
                ERROR("Failed to read packages activation file: %s\n", 
strerror(errno));
                RETURN_ERROR(errno);
@@ -898,15 +896,14 @@
                RETURN_ERROR(errno);
        }

-       DIR* dir = fdopendir(fd);
-       if (dir == NULL) {
+       DirCloser dir(fdopendir(fd));
+       if (!dir.IsSet()) {
                ERROR("Failed to open packages directory \"%s\": %s\n",
                        fPackagesDirectory->Path(), strerror(errno));
                RETURN_ERROR(errno);
        }
-       DirCloser dirCloser(dir);

-       while (dirent* entry = readdir(dir)) {
+       while (dirent* entry = readdir(dir.Get())) {
                // skip "." and ".."
                if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, 
"..") == 0)
                        continue;
diff --git a/src/apps/aboutsystem/AboutSystem.cpp 
b/src/apps/aboutsystem/AboutSystem.cpp
index afcfd51..602f204 100644
--- a/src/apps/aboutsystem/AboutSystem.cpp
+++ b/src/apps/aboutsystem/AboutSystem.cpp
@@ -1459,19 +1459,19 @@
                return;

        // attach it to a FILE
-       FILE* attrFile = fdopen(attrFD, "r");
-       if (attrFile == NULL) {
+       FileCloser attrFile(fdopen(attrFD, "r"));
+       if (!attrFile.IsSet()) {
                close(attrFD);
                return;
        }
-       FileCloser _(attrFile);

        // read and parse the copyrights
        BMessage package;
        BString fieldName;
        BString fieldValue;
        char lineBuffer[LINE_MAX];
-       while (char* line = fgets(lineBuffer, sizeof(lineBuffer), attrFile)) {
+       while (char* line
+               = fgets(lineBuffer, sizeof(lineBuffer), attrFile.Get())) {
                // chop off line break
                size_t lineLen = strlen(line);
                if (lineLen > 0 && line[lineLen - 1] == '\n')
diff --git a/src/bin/fstrim.cpp b/src/bin/fstrim.cpp
index b09cd41..a956d16 100644
--- a/src/bin/fstrim.cpp
+++ b/src/bin/fstrim.cpp
@@ -56,22 +56,20 @@
                usage(1);
        const char* path = argv[optind++];

-       int fd = open(path, O_RDONLY);
-       if (fd < 0) {
+       FileDescriptorCloser fd(open(path, O_RDONLY));
+       if (!fd.IsSet()) {
                fprintf(stderr, "%s: Could not access path: %s\n", kProgramName,
                        strerror(errno));
                return EXIT_FAILURE;
        }

-       FileDescriptorCloser closer(fd);
-
        fs_trim_data trimData;
        trimData.range_count = 1;
        trimData.ranges[0].offset = 0;
        trimData.ranges[0].size = UINT64_MAX;
        trimData.trimmed_size = 0;

-       if (ioctl(fd, B_TRIM_DEVICE, &trimData, sizeof(fs_trim_data)) != 0) {
+       if (ioctl(fd.Get(), B_TRIM_DEVICE, &trimData, sizeof(fs_trim_data)) != 
0) {
                fprintf(stderr, "%s: Trimming failed: %s\n", kProgramName,
                        strerror(errno));
                return EXIT_FAILURE;
diff --git a/src/bin/i2c/i2c.cpp b/src/bin/i2c/i2c.cpp
index 6b4c7c0..95d11a2 100644
--- a/src/bin/i2c/i2c.cpp
+++ b/src/bin/i2c/i2c.cpp
@@ -41,8 +41,8 @@
 scan_bus(const char *path)
 {
        int err = EXIT_SUCCESS;
-       int fd = open(path, O_RDONLY);
-       if (fd < 0) {
+       FileDescriptorCloser fd(open(path, O_RDONLY));
+       if (!fd.IsSet()) {
                fprintf(stderr, "%s: Could not access path: %s\n", kProgramName,
                        strerror(errno));
                return EXIT_FAILURE;
@@ -50,7 +50,6 @@

        setbuf(stdout, NULL);
        printf("Scanning I2C bus: %s\n", path);
-       FileDescriptorCloser closer(fd);

        printf("     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n");
        for (int i = 0; i < 128; i+=16) {
@@ -66,7 +65,7 @@
                        exec.cmdLength = sizeof(cmd);
                        exec.buffer = &data;
                        exec.bufferLength = sizeof(data);
-                       if (ioctl(fd, I2CEXEC, &exec, sizeof(exec)) == 0)
+                       if (ioctl(fd.Get(), I2CEXEC, &exec, sizeof(exec)) == 0)
                                printf("%02x ", addr);
                        else
                                printf("-- ");
@@ -74,8 +73,6 @@
                printf("\n");
        }

-       close(fd);
-
        return err;
 }

diff --git a/src/bin/multiuser/multiuser_utils.cpp 
b/src/bin/multiuser/multiuser_utils.cpp
index 54838eb..1b0b5ca 100644
--- a/src/bin/multiuser/multiuser_utils.cpp
+++ b/src/bin/multiuser/multiuser_utils.cpp
@@ -25,20 +25,19 @@
        FILE* out = stdout;

        // open tty
-       FILE* tty = NULL;
+       FileCloser tty;
        if (!useStdio) {
 // TODO: Open tty with O_NOCTTY!
-               tty = fopen("/dev/tty", "w+");
-               if (tty == NULL) {
+               tty.SetTo(fopen("/dev/tty", "w+"));
+               if (!tty.IsSet()) {
                        fprintf(stderr, "Error: Failed to open tty: %s\n",
                                strerror(errno));
                        return errno;
                }

-               in = tty;
-               out = tty;
+               in = tty.Get();
+               out = tty.Get();
        }
-       FileCloser ttyCloser(tty);

        // disable echo
        int inFD = fileno(in);
diff --git a/src/bin/package/PackageWritingUtils.cpp 
b/src/bin/package/PackageWritingUtils.cpp
index 88aa985..5ce871d 100644
--- a/src/bin/package/PackageWritingUtils.cpp
+++ b/src/bin/package/PackageWritingUtils.cpp
@@ -22,15 +22,14 @@
        BPackageWriterListener& listener, bool skipPackageInfo)
 {
        // open the current directory
-       DIR* dir = opendir(".");
-       if (dir == NULL) {
+       DirCloser dir(opendir("."));
+       if (!dir.IsSet()) {
                listener.PrintError("Error: Failed to opendir '.': %s\n",
                        strerror(errno));
                return errno;
        }
-       DirCloser dirCloser(dir);

-       while (dirent* entry = readdir(dir)) {
+       while (dirent* entry = readdir(dir.Get())) {
                // skip "." and ".."
                if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, 
"..") == 0)
                        continue;
diff --git a/src/bin/ramdisk.cpp b/src/bin/ramdisk.cpp
index b851025..ad90383 100644
--- a/src/bin/ramdisk.cpp
+++ b/src/bin/ramdisk.cpp
@@ -99,16 +99,15 @@
 execute_control_device_ioctl(int operation, void* request)
 {
        // open the ram disk control device
-       int fd = open(kRamDiskControlDevicePath, O_RDONLY);
-       if (fd < 0) {
+       FileDescriptorCloser fd(open(kRamDiskControlDevicePath, O_RDONLY));
+       if (!fd.IsSet()) {
                fprintf(stderr, "Error: Failed to open RAM disk control device 
\"%s\": "
                        "%s\n", kRamDiskControlDevicePath, strerror(errno));
                return errno;
        }
-       FileDescriptorCloser fdCloser(fd);

        // issue the request
-       if (ioctl(fd, operation, request) < 0)
+       if (ioctl(fd.Get(), operation, request) < 0)
                return errno;

        return B_OK;
@@ -331,16 +330,15 @@
        // open the raw device
        BString path;
        path.SetToFormat("%s/%s/raw", kRamDiskRawDeviceBasePath, idString);
-       int fd = open(path, O_RDONLY);
-       if (fd < 0) {
+       FileDescriptorCloser fd(open(path, O_RDONLY));
+       if (!fd.IsSet()) {
                fprintf(stderr, "Error: Failed to open RAM disk device 
\"%s\"\n",
                        path.String());
                return 1;
        }
-       FileDescriptorCloser fdCloser(fd);

        // issue the request
-       if (ioctl(fd, RAM_DISK_IOCTL_FLUSH, NULL) < 0) {
+       if (ioctl(fd.Get(), RAM_DISK_IOCTL_FLUSH, NULL) < 0) {
                fprintf(stderr, "Error: Failed to flush RAM disk device: %s\n",
                        strerror(errno));
                return 1;
@@ -382,20 +380,19 @@
                print_usage_and_exit(true);

        // iterate through the RAM disk device directory and search for raw 
devices
-       DIR* dir = opendir(kRamDiskRawDeviceBasePath);
-       if (dir == NULL) {
+       DirCloser dir(opendir(kRamDiskRawDeviceBasePath));
+       if (!dir.IsSet()) {
                fprintf(stderr, "Error: Failed to open RAM disk device 
directory: %s\n",
                        strerror(errno));
                return 1;
        }
-       DirCloser dirCloser(dir);

        TextTable table;
        table.AddColumn("ID", B_ALIGN_RIGHT);
        table.AddColumn("Size", B_ALIGN_RIGHT);
        table.AddColumn("Associated file");

-       while (dirent* entry = readdir(dir)) {
+       while (dirent* entry = readdir(dir.Get())) {
                // check, if the entry name could be an ID
                const char* idString = entry->d_name;
                char* end;
@@ -406,14 +403,14 @@
                // open the raw device
                BString path;
                path.SetToFormat("%s/%s/raw", kRamDiskRawDeviceBasePath, 
idString);
-               int fd = open(path, O_RDONLY);
-               if (fd < 0)
+               FileDescriptorCloser fd(open(path, O_RDONLY));
+               if (!fd.IsSet())
                        continue;
-               FileDescriptorCloser fdCloser(fd);

                // issue the request
                ram_disk_ioctl_info request;
-               if (ioctl(fd, RAM_DISK_IOCTL_INFO, &request, sizeof(request)) < 
0)
+               if (ioctl(fd.Get(), RAM_DISK_IOCTL_INFO, &request, 
sizeof(request))
+                       < 0)
                        continue;

                int32 rowIndex = table.CountRows();
diff --git a/src/kits/network/libnetapi/NetworkDevice.cpp 
b/src/kits/network/libnetapi/NetworkDevice.cpp
index 7cd7b46..a4a5edd 100644
--- a/src/kits/network/libnetapi/NetworkDevice.cpp
+++ b/src/kits/network/libnetapi/NetworkDevice.cpp
@@ -50,12 +50,10 @@
 static status_t
 get_80211(const char* name, int32 type, void* data, int32& length)
 {
-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        struct ieee80211req ireq;
        strlcpy(ireq.i_name, name, IF_NAMESIZE);
        ireq.i_type = type;
@@ -63,7 +61,8 @@
        ireq.i_len = length;
        ireq.i_data = data;

-       if (ioctl(socket, SIOCG80211, &ireq, sizeof(struct ieee80211req)) < 0)
+       if (ioctl(socket.Get(), SIOCG80211, &ireq, sizeof(struct ieee80211req))
+               < 0)
                return errno;

        length = ireq.i_len;
@@ -75,12 +74,10 @@
 set_80211(const char* name, int32 type, void* data,
        int32 length = 0, int32 value = 0)
 {
-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        struct ieee80211req ireq;
        strlcpy(ireq.i_name, name, IF_NAMESIZE);
        ireq.i_type = type;
@@ -88,7 +85,8 @@
        ireq.i_len = length;
        ireq.i_data = data;

-       if (ioctl(socket, SIOCS80211, &ireq, sizeof(struct ieee80211req)) < 0)
+       if (ioctl(socket.Get(), SIOCS80211, &ireq, sizeof(struct ieee80211req))
+               < 0)
                return errno;

        return B_OK;
@@ -98,15 +96,13 @@
 template<typename T> status_t
 do_request(T& request, const char* name, int option)
 {
-       int socket = ::socket(AF_LINK, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_LINK, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        strlcpy(((struct ifreq&)request).ifr_name, name, IF_NAMESIZE);

-       if (ioctl(socket, option, &request, sizeof(T)) < 0)
+       if (ioctl(socket.Get(), option, &request, sizeof(T)) < 0)
                return errno;

        return B_OK;
@@ -116,15 +112,13 @@
 template<> status_t
 do_request<ieee80211req>(ieee80211req& request, const char* name, int option)
 {
-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        strlcpy(((struct ieee80211req&)request).i_name, name, IFNAMSIZ);

-       if (ioctl(socket, option, &request, sizeof(request)) < 0)
+       if (ioctl(socket.Get(), option, &request, sizeof(request)) < 0)
                return errno;

        return B_OK;
diff --git a/src/kits/network/libnetapi/NetworkInterface.cpp 
b/src/kits/network/libnetapi/NetworkInterface.cpp
index 9d9ab8e..d557adf 100644
--- a/src/kits/network/libnetapi/NetworkInterface.cpp
+++ b/src/kits/network/libnetapi/NetworkInterface.cpp
@@ -37,12 +37,10 @@
        if (!readBack)
                family = family_from_interface_address(address);

-       int socket = ::socket(family, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(family, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        ifaliasreq request;
        strlcpy(request.ifra_name, name, IF_NAMESIZE);
        request.ifra_index = address.Index();
@@ -55,7 +53,7 @@
        memcpy(&request.ifra_broadaddr, &address.Broadcast().SockAddr(),
                address.Broadcast().Length());

-       if (ioctl(socket, option, &request, sizeof(struct ifaliasreq)) < 0)
+       if (ioctl(socket.Get(), option, &request, sizeof(struct ifaliasreq)) < 
0)
                return errno;

        if (readBack) {
@@ -81,15 +79,13 @@
 template<typename T> status_t
 do_request(int family, T& request, const char* name, int option)
 {
-       int socket = ::socket(family, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(family, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        strlcpy(((struct ifreq&)request).ifr_name, name, IF_NAMESIZE);

-       if (ioctl(socket, option, &request, sizeof(T)) < 0)
+       if (ioctl(socket.Get(), option, &request, sizeof(T)) < 0)
                return errno;

        return B_OK;
@@ -371,12 +367,10 @@
 int32
 BNetworkInterface::FindAddress(const BNetworkAddress& address)
 {
-       int socket = ::socket(address.Family(), SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(address.Family(), SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return -1;

-       FileDescriptorCloser closer(socket);
-
        ifaliasreq request;
        memset(&request, 0, sizeof(ifaliasreq));

@@ -384,8 +378,8 @@
        request.ifra_index = -1;
        memcpy(&request.ifra_addr, &address.SockAddr(), address.Length());

-       if (ioctl(socket, B_SOCKET_GET_ALIAS, &request, sizeof(struct 
ifaliasreq))
-                       < 0) {
+       if (ioctl(socket.Get(), B_SOCKET_GET_ALIAS, &request,
+               sizeof(struct ifaliasreq)) < 0) {
                return -1;
        }

@@ -396,12 +390,10 @@
 int32
 BNetworkInterface::FindFirstAddress(int family)
 {
-       int socket = ::socket(family, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(family, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return -1;

-       FileDescriptorCloser closer(socket);
-
        ifaliasreq request;
        memset(&request, 0, sizeof(ifaliasreq));

@@ -409,8 +401,8 @@
        request.ifra_index = -1;
        request.ifra_addr.ss_family = AF_UNSPEC;

-       if (ioctl(socket, B_SOCKET_GET_ALIAS, &request, sizeof(struct 
ifaliasreq))
-                       < 0) {
+       if (ioctl(socket.Get(), B_SOCKET_GET_ALIAS, &request,
+               sizeof(struct ifaliasreq)) < 0) {
                return -1;
        }

@@ -479,16 +471,14 @@
 status_t
 BNetworkInterface::GetHardwareAddress(BNetworkAddress& address)
 {
-       int socket = ::socket(AF_LINK, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_LINK, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        ifreq request;
        strlcpy(request.ifr_name, Name(), IF_NAMESIZE);
 
-       if (ioctl(socket, SIOCGIFADDR, &request, sizeof(struct ifreq)) < 0)
+       if (ioctl(socket.Get(), SIOCGIFADDR, &request, sizeof(struct ifreq)) < 
0)
                return errno;

        address.SetTo(request.ifr_addr);
diff --git a/src/kits/network/libnetapi/NetworkRoster.cpp 
b/src/kits/network/libnetapi/NetworkRoster.cpp
index 8f840b5..b090be8 100644
--- a/src/kits/network/libnetapi/NetworkRoster.cpp
+++ b/src/kits/network/libnetapi/NetworkRoster.cpp
@@ -37,15 +37,13 @@
 size_t
 BNetworkRoster::CountInterfaces() const
 {
-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return 0;

-       FileDescriptorCloser closer(socket);
-
        ifconf config;
        config.ifc_len = sizeof(config.ifc_value);
-       if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) != 0)
+       if (ioctl(socket.Get(), SIOCGIFCOUNT, &config, sizeof(struct ifconf)) 
!= 0)
                return 0;

        return (size_t)config.ifc_value;
@@ -63,15 +61,13 @@

        // get a list of all interfaces

-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket (::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        ifconf config;
        config.ifc_len = sizeof(config.ifc_value);
-       if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 0)
+       if (ioctl(socket.Get(), SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 
0)
                return errno;

        size_t count = (size_t)config.ifc_value;
@@ -86,7 +82,7 @@

        config.ifc_len = count * sizeof(struct ifreq);
        config.ifc_buf = buffer;
-       if (ioctl(socket, SIOCGIFCONF, &config, sizeof(struct ifconf)) < 0)
+       if (ioctl(socket.Get(), SIOCGIFCONF, &config, sizeof(struct ifconf)) < 
0)
                return errno;

        ifreq* interfaces = (ifreq*)buffer;
@@ -110,17 +106,15 @@
 status_t
 BNetworkRoster::AddInterface(const char* name)
 {
-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket (::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        ifaliasreq request;
        memset(&request, 0, sizeof(ifaliasreq));
        strlcpy(request.ifra_name, name, IF_NAMESIZE);

-       if (ioctl(socket, SIOCAIFADDR, &request, sizeof(request)) != 0)
+       if (ioctl(socket.Get(), SIOCAIFADDR, &request, sizeof(request)) != 0)
                return errno;

        return B_OK;
@@ -137,18 +131,16 @@
 status_t
 BNetworkRoster::RemoveInterface(const char* name)
 {
-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        ifreq request;
        strlcpy(request.ifr_name, name, IF_NAMESIZE);

        request.ifr_addr.sa_family = AF_UNSPEC;

-       if (ioctl(socket, SIOCDIFADDR, &request, sizeof(request)) != 0)
+       if (ioctl(socket.Get(), SIOCDIFADDR, &request, sizeof(request)) != 0)
                return errno;

        return B_OK;
diff --git a/src/kits/network/libnetapi/NetworkRoute.cpp 
b/src/kits/network/libnetapi/NetworkRoute.cpp
index 7d32f26..6ebe6a5 100644
--- a/src/kits/network/libnetapi/NetworkRoute.cpp
+++ b/src/kits/network/libnetapi/NetworkRoute.cpp
@@ -256,15 +256,13 @@
 BNetworkRoute::GetRoutes(int family, const char* interfaceName,
        uint32 filterFlags, BObjectList<BNetworkRoute>& routes)
 {
-       int socket = ::socket(family, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(family, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser fdCloser(socket);
-
        ifconf config;
        config.ifc_len = sizeof(config.ifc_value);
-       if (ioctl(socket, SIOCGRTSIZE, &config, sizeof(struct ifconf)) < 0)
+       if (ioctl(socket.Get(), SIOCGRTSIZE, &config, sizeof(struct ifconf)) < 
0)
                return errno;

        uint32 size = (uint32)config.ifc_value;
@@ -279,7 +277,7 @@
        config.ifc_len = size;
        config.ifc_buf = buffer;

-       if (ioctl(socket, SIOCGRTTABLE, &config, sizeof(struct ifconf)) < 0)
+       if (ioctl(socket.Get(), SIOCGRTTABLE, &config, sizeof(struct ifconf)) < 
0)
                return errno;

        ifreq* interface = (ifreq*)buffer;
diff --git a/src/kits/package/RepositoryInfo.cpp 
b/src/kits/package/RepositoryInfo.cpp
index f2120f7..dc41b81 100644
--- a/src/kits/package/RepositoryInfo.cpp
+++ b/src/kits/package/RepositoryInfo.cpp
@@ -358,25 +358,29 @@
        buffer[size] = '\0';
        configString.UnlockBuffer(size);

-       void* settingsHandle = 
parse_driver_settings_string(configString.String());
-       if (settingsHandle == NULL)
+       DriverSettingsUnloader settingsHandle(
+               parse_driver_settings_string(configString.String()));
+       if (!settingsHandle.IsSet())
                return B_BAD_DATA;
-       DriverSettingsUnloader settingsHandleDeleter(settingsHandle);

-       const char* name = get_driver_parameter(settingsHandle, "name", NULL, 
NULL);
-       const char* identifier = get_driver_parameter(settingsHandle, 
"identifier", NULL, NULL);
+       const char* name = get_driver_parameter(settingsHandle.Get(), "name", 
NULL,
+               NULL);
+       const char* identifier = get_driver_parameter(settingsHandle.Get(),
+               "identifier", NULL, NULL);
        // Also handle the old name if the new one isn't found
        if (identifier == NULL || *identifier == '\0')
-               identifier = get_driver_parameter(settingsHandle, "url", NULL, 
NULL);
-       const char* baseUrl = get_driver_parameter(settingsHandle, "baseurl", 
NULL, NULL);
-       const char* vendor
-               = get_driver_parameter(settingsHandle, "vendor", NULL, NULL);
-       const char* summary
-               = get_driver_parameter(settingsHandle, "summary", NULL, NULL);
-       const char* priorityString
-               = get_driver_parameter(settingsHandle, "priority", NULL, NULL);
-       const char* architectureString
-               = get_driver_parameter(settingsHandle, "architecture", NULL, 
NULL);
+               identifier = get_driver_parameter(settingsHandle.Get(),
+                       "url", NULL, NULL);
+       const char* baseUrl = get_driver_parameter(settingsHandle.Get(),
+               "baseurl", NULL, NULL);
+       const char* vendor = get_driver_parameter(settingsHandle.Get(),
+               "vendor", NULL, NULL);
+       const char* summary = get_driver_parameter(settingsHandle.Get(),
+               "summary", NULL, NULL);
+       const char* priorityString = get_driver_parameter(settingsHandle.Get(),
+               "priority", NULL, NULL);
+       const char* architectureString = 
get_driver_parameter(settingsHandle.Get(),
+               "architecture", NULL, NULL);

        if (name == NULL || *name == '\0'
                || identifier == NULL || *identifier == '\0'
diff --git a/src/kits/package/hpkg/PackageWriterImpl.cpp 
b/src/kits/package/hpkg/PackageWriterImpl.cpp
index 301e2d4..d21ba18 100644
--- a/src/kits/package/hpkg/PackageWriterImpl.cpp
+++ b/src/kits/package/hpkg/PackageWriterImpl.cpp
@@ -1138,10 +1138,9 @@
                // explicitly specified directory -- we need to read the 
directory

                // first we check for colliding node attributes, though
-               if (DIR* attrDir = fs_fopen_attr_dir(fd)) {
-                       AttrDirCloser attrDirCloser(attrDir);
-
-                       while (dirent* entry = fs_read_attr_dir(attrDir)) {
+               AttrDirCloser attrDir(fs_fopen_attr_dir(fd));
+               if (attrDir.IsSet()) {
+                       while (dirent* entry = fs_read_attr_dir(attrDir.Get())) 
{
                                attr_info attrInfo;
                                if (fs_stat_attr(fd, entry->d_name, &attrInfo) 
< 0) {
                                        fListener->PrintError(
@@ -1177,17 +1176,16 @@
                        throw status_t(errno);
                }

-               DIR* dir = fdopendir(clonedFD);
-               if (dir == NULL) {
+               DirCloser dir(fdopendir(clonedFD));
+               if (!dir.IsSet()) {
                        fListener->PrintError(
                                "Failed to open directory \"%s\": %s\n", 
pathBuffer,
                                strerror(errno));
                        close(clonedFD);
                        throw status_t(errno);
                }
-               DirCloser dirCloser(dir);

-               while (dirent* entry = readdir(dir)) {
+               while (dirent* entry = readdir(dir.Get())) {
                        // skip "." and ".."
                        if (strcmp(entry->d_name, ".") == 0
                                || strcmp(entry->d_name, "..") == 0) {
@@ -1525,10 +1523,9 @@
        }

        // add attributes
-       if (DIR* attrDir = fs_fopen_attr_dir(fd)) {
-               AttrDirCloser attrDirCloser(attrDir);
-
-               while (dirent* entry = fs_read_attr_dir(attrDir)) {
+       AttrDirCloser attrDir(fs_fopen_attr_dir(fd));
+       if (attrDir.IsSet()) {
+               while (dirent* entry = fs_read_attr_dir(attrDir.Get())) {
                        attr_info attrInfo;
                        if (fs_stat_attr(fd, entry->d_name, &attrInfo) < 0) {
                                fListener->PrintError(
@@ -1579,17 +1576,16 @@
                        throw status_t(errno);
                }

-               DIR* dir = fdopendir(clonedFD);
-               if (dir == NULL) {
+               DirCloser dir(fdopendir(clonedFD));
+               if (!dir.IsSet()) {
                        fListener->PrintError(
                                "Failed to open directory \"%s\": %s\n", 
pathBuffer,
                                strerror(errno));
                        close(clonedFD);
                        throw status_t(errno);
                }
-               DirCloser dirCloser(dir);

-               while (dirent* entry = readdir(dir)) {
+               while (dirent* entry = readdir(dir.Get())) {
                        // skip "." and ".."
                        if (strcmp(entry->d_name, ".") == 0
                                || strcmp(entry->d_name, "..") == 0) {
diff --git a/src/kits/package/manager/RepositoryBuilder.cpp 
b/src/kits/package/manager/RepositoryBuilder.cpp
index fe9bbe3..236c0b2 100644
--- a/src/kits/package/manager/RepositoryBuilder.cpp
+++ b/src/kits/package/manager/RepositoryBuilder.cpp
@@ -208,13 +208,12 @@
 BRepositoryBuilder::AddPackagesDirectory(const char* path)
 {
        // open directory
-       DIR* dir = opendir(path);
-       if (dir == NULL)
+       DirCloser dir(opendir(path));
+       if (!dir.IsSet())
                DIE(errno, "failed to open package directory \"%s\"", path);
-       DirCloser dirCloser(dir);

        // iterate through directory entries
-       while (dirent* entry = readdir(dir)) {
+       while (dirent* entry = readdir(dir.Get())) {
                // skip "." and ".."
                const char* name = entry->d_name;
                if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
diff --git a/src/preferences/virtualmemory/Settings.cpp 
b/src/preferences/virtualmemory/Settings.cpp
index 270defd..6752f65 100644
--- a/src/preferences/virtualmemory/Settings.cpp
+++ b/src/preferences/virtualmemory/Settings.cpp
@@ -137,22 +137,24 @@
 status_t
 Settings::ReadSwapSettings()
 {
-       void* settings = load_driver_settings(kVirtualMemorySettings);
-       if (settings == NULL)
+       DriverSettingsUnloader settings(
+               load_driver_settings(kVirtualMemorySettings));
+       if (!settings.IsSet())
                return kErrorSettingsNotFound;
-       DriverSettingsUnloader settingDeleter(settings);

-       const char* enabled = get_driver_parameter(settings, "vm", NULL, NULL);
-       const char* automatic = get_driver_parameter(settings, "swap_auto",
-               NULL, NULL);
-       const char* size = get_driver_parameter(settings, "swap_size", NULL, 
NULL);
-       const char* volume = get_driver_parameter(settings, "swap_volume_name",
-               NULL, NULL);
-       const char* device = get_driver_parameter(settings,
+       const char* enabled = get_driver_parameter(settings.Get(),
+               "vm", NULL, NULL);
+       const char* automatic = get_driver_parameter(settings.Get(),
+               "swap_auto", NULL, NULL);
+       const char* size = get_driver_parameter(settings.Get(),
+               "swap_size", NULL, NULL);
+       const char* volume = get_driver_parameter(settings.Get(),
+               "swap_volume_name", NULL, NULL);
+       const char* device = get_driver_parameter(settings.Get(),
                "swap_volume_device", NULL, NULL);
-       const char* filesystem = get_driver_parameter(settings,
+       const char* filesystem = get_driver_parameter(settings.Get(),
                "swap_volume_filesystem", NULL, NULL);
-       const char* capacity = get_driver_parameter(settings,
+       const char* capacity = get_driver_parameter(settings.Get(),
                "swap_volume_capacity", NULL, NULL);

        if (enabled == NULL     || automatic == NULL || size == NULL || device 
== NULL
@@ -161,9 +163,9 @@

        off_t volCapacity = atoll(capacity);

-       SetSwapEnabled(get_driver_boolean_parameter(settings,
+       SetSwapEnabled(get_driver_boolean_parameter(settings.Get(),
                "vm", true, false));
-       SetSwapAutomatic(get_driver_boolean_parameter(settings,
+       SetSwapAutomatic(get_driver_boolean_parameter(settings.Get(),
                "swap_auto", true, false));
        SetSwapSize(atoll(size));

diff --git a/src/servers/net/NetServer.cpp b/src/servers/net/NetServer.cpp
index 6e5eb82..23a9d9d 100644
--- a/src/servers/net/NetServer.cpp
+++ b/src/servers/net/NetServer.cpp
@@ -118,12 +118,10 @@
 set_80211(const char* name, int32 type, void* data,
        int32 length = 0, int32 value = 0)
 {
-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return errno;

-       FileDescriptorCloser closer(socket);
-
        struct ieee80211req ireq;
        strlcpy(ireq.i_name, name, IF_NAMESIZE);
        ireq.i_type = type;
@@ -131,7 +129,8 @@
        ireq.i_len = length;
        ireq.i_data = data;

-       if (ioctl(socket, SIOCS80211, &ireq, sizeof(struct ieee80211req)) < 0)
+       if (ioctl(socket.Get(), SIOCS80211, &ireq, sizeof(struct ieee80211req))
+               < 0)
                return errno;

        return B_OK;
diff --git a/src/servers/package/CommitTransactionHandler.cpp 
b/src/servers/package/CommitTransactionHandler.cpp
index 667a1f3..839322b 100644
--- a/src/servers/package/CommitTransactionHandler.cpp
+++ b/src/servers/package/CommitTransactionHandler.cpp
@@ -1782,18 +1782,17 @@
        }

        // issue the request
-       int fd = fVolume->OpenRootDirectory();
-       if (fd < 0) {
+       FileDescriptorCloser fd(fVolume->OpenRootDirectory());
+       if (!fd.IsSet()) {
                throw Exception(B_TRANSACTION_FAILED_TO_OPEN_DIRECTORY)
                        .SetPath1(_GetPath(
                                FSUtils::Entry(fVolume->RootDirectoryRef()),
                                "<packagefs root>"))
-                       .SetSystemError(fd);
+                       .SetSystemError(fd.Get());
        }
-       FileDescriptorCloser fdCloser(fd);

-       if (ioctl(fd, PACKAGE_FS_OPERATION_CHANGE_ACTIVATION, request, 
requestSize)
-                       != 0) {
+       if (ioctl(fd.Get(), PACKAGE_FS_OPERATION_CHANGE_ACTIVATION, request,
+               requestSize) != 0) {
 // TODO: We need more error information and error handling!
                throw 
Exception(B_TRANSACTION_FAILED_TO_CHANGE_PACKAGE_ACTIVATION)
                        .SetSystemError(errno);
diff --git a/src/servers/package/PackageFile.cpp 
b/src/servers/package/PackageFile.cpp
index 26f5f6f..df8e8de 100644
--- a/src/servers/package/PackageFile.cpp
+++ b/src/servers/package/PackageFile.cpp
@@ -61,12 +61,11 @@
                RETURN_ERROR(error);

        // get the package info
-       int fd = file.Dup();
-       if (fd < 0)
+       FileDescriptorCloser fd(file.Dup());
+       if (!fd.IsSet())
                RETURN_ERROR(error);
-       FileDescriptorCloser fdCloser(fd);

-       error = fInfo.ReadFromPackageFile(fd);
+       error = fInfo.ReadFromPackageFile(fd.Get());
        if (error != B_OK)
                RETURN_ERROR(error);

diff --git a/src/servers/package/Volume.cpp b/src/servers/package/Volume.cpp
index 79f952a..2afaf0d 100644
--- a/src/servers/package/Volume.cpp
+++ b/src/servers/package/Volume.cpp
@@ -230,13 +230,12 @@
                RETURN_ERROR(B_NO_MEMORY);

        // get a volume info from the FS
-       int fd = directory.Dup();
-       if (fd < 0) {
+       FileDescriptorCloser fd(directory.Dup());
+       if (!fd.IsSet()) {
                ERROR("Volume::Init(): failed to get root directory FD: %s\n",
-                       strerror(fd));
-               RETURN_ERROR(fd);
+                       strerror(fd.Get()));
+               RETURN_ERROR(fd.Get());
        }
-       FileDescriptorCloser fdCloser(fd);

        // get the volume info from packagefs
        uint32 maxPackagesDirCount = 16;
@@ -251,7 +250,7 @@
                        RETURN_ERROR(B_NO_MEMORY);
                infoDeleter.SetTo(info);

-               if (ioctl(fd, PACKAGE_FS_OPERATION_GET_VOLUME_INFO, info,
+               if (ioctl(fd.Get(), PACKAGE_FS_OPERATION_GET_VOLUME_INFO, info,
                                bufferSize) != 0) {
                        ERROR("Volume::Init(): failed to get volume info: %s\n",
                                strerror(errno));
@@ -310,13 +309,12 @@
        }

        // read the packages directory and get the active packages
-       int fd = OpenRootDirectory();
-       if (fd < 0) {
+       FileDescriptorCloser fd(OpenRootDirectory());
+       if (!fd.IsSet()) {
                ERROR("Volume::InitPackages(): failed to open root directory: 
%s\n",
-                       strerror(fd));
-               RETURN_ERROR(fd);
+                       strerror(fd.Get()));
+               RETURN_ERROR(fd.Get());
        }
-       FileDescriptorCloser fdCloser(fd);

        error = _ReadPackagesDirectory();
        if (error != B_OK)
@@ -326,7 +324,7 @@
        if (error != B_OK)
                RETURN_ERROR(error);

-       error = _GetActivePackages(fd);
+       error = _GetActivePackages(fd.Get());
        if (error != B_OK)
                RETURN_ERROR(error);

diff --git a/src/servers/registrar/AuthenticationManager.cpp 
b/src/servers/registrar/AuthenticationManager.cpp
index ddc6ef9..355b36d 100644
--- a/src/servers/registrar/AuthenticationManager.cpp
+++ b/src/servers/registrar/AuthenticationManager.cpp
@@ -564,26 +564,24 @@
                        // Don't check errors. We can't do anything anyway.

                // open files
-               FILE* passwdFile = fopen(kPasswdFile, "w");
-               if (passwdFile == NULL) {
+               FileCloser passwdFile(fopen(kPasswdFile, "w"));
+               if (!passwdFile.IsSet()) {
                        debug_printf("REG: Failed to open passwd file \"%s\" 
for "
                                "writing: %s\n", kPasswdFile, strerror(errno));
                }
-               FileCloser _1(passwdFile);

-               FILE* shadowFile = fopen(kShadowPwdFile, "w");
-               if (shadowFile == NULL) {
+               FileCloser shadowFile(fopen(kShadowPwdFile, "w"));
+               if (!shadowFile.IsSet()) {
                        debug_printf("REG: Failed to open shadow passwd file 
\"%s\" for "
                                "writing: %s\n", kShadowPwdFile, 
strerror(errno));
                }
-               FileCloser _2(shadowFile);

                // write users
                for (map<uid_t, User*>::const_iterator it = fUsersByID.begin();
                         it != fUsersByID.end(); ++it) {
                        User* user = it->second;
-                       user->WritePasswdLine(passwdFile);
-                       user->WriteShadowPwdLine(shadowFile);
+                       user->WritePasswdLine(passwdFile.Get());
+                       user->WriteShadowPwdLine(shadowFile.Get());
                }
        }

@@ -690,18 +688,17 @@
                        // Don't check errors. We can't do anything anyway.

                // open file
-               FILE* groupFile = fopen(kGroupFile, "w");
-               if (groupFile == NULL) {
+               FileCloser groupFile(fopen(kGroupFile, "w"));
+               if (!groupFile.IsSet()) {
                        debug_printf("REG: Failed to open group file \"%s\" for 
"
                                "writing: %s\n", kGroupFile, strerror(errno));
                }
-               FileCloser _1(groupFile);

                // write groups
                for (map<gid_t, Group*>::const_iterator it = 
fGroupsByID.begin();
                        it != fGroupsByID.end(); ++it) {
                        Group* group = it->second;
-                       group->WriteGroupLine(groupFile);
+                       group->WriteGroupLine(groupFile.Get());
                }
        }

@@ -1240,16 +1237,15 @@
 status_t
 AuthenticationManager::_InitPasswdDB()
 {
-       FILE* file = fopen(kPasswdFile, "r");
-       if (file == NULL) {
+       FileCloser file(fopen(kPasswdFile, "r"));
+       if (!file.IsSet()) {
                debug_printf("REG: Failed to open passwd DB file \"%s\": %s\n",
                        kPasswdFile, strerror(errno));
                return errno;
        }
-       FileCloser _(file);

        char lineBuffer[LINE_MAX];
-       while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file)) {
+       while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file.Get())) {
                if (strlen(line) == 0)
                        continue;

@@ -1289,16 +1285,15 @@
 status_t
 AuthenticationManager::_InitGroupDB()
 {
-       FILE* file = fopen(kGroupFile, "r");
-       if (file == NULL) {
+       FileCloser file(fopen(kGroupFile, "r"));
+       if (!file.IsSet()) {
                debug_printf("REG: Failed to open group DB file \"%s\": %s\n",
                        kGroupFile, strerror(errno));
                return errno;
        }
-       FileCloser _(file);

        char lineBuffer[LINE_MAX];
-       while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file)) {
+       while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file.Get())) {
                if (strlen(line) == 0)
                        continue;

@@ -1337,16 +1332,15 @@
 status_t
 AuthenticationManager::_InitShadowPwdDB()
 {
-       FILE* file = fopen(kShadowPwdFile, "r");
-       if (file == NULL) {
+       FileCloser file(fopen(kShadowPwdFile, "r"));
+       if (!file.IsSet()) {
                debug_printf("REG: Failed to open shadow passwd DB file \"%s\": 
%s\n",
                        kShadowPwdFile, strerror(errno));
                return errno;
        }
-       FileCloser _(file);

        char lineBuffer[LINE_MAX];
-       while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file)) {
+       while (char* line = fgets(lineBuffer, sizeof(lineBuffer), file.Get())) {
                if (strlen(line) == 0)
                        continue;

diff --git 
a/src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp 
b/src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp
index 771c8f9..0ccd95d 100644
--- a/src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp
+++ b/src/system/boot/loader/file_systems/packagefs/PackageSettingsItem.cpp
@@ -45,18 +45,17 @@
        const char* settingsFilePath
                = &(kSystemSettingsDirectory 
"/packages")[strlen(kSystemDirectory) + 1];

-       int fd = open_from(systemDirectory, settingsFilePath, B_READ_ONLY, 0);
-       if (fd < 0)
+       FileDescriptorCloser fd(open_from(systemDirectory, settingsFilePath,
+               B_READ_ONLY, 0));
+       if (!fd.IsSet())
                return NULL;
-       FileDescriptorCloser fdCloser(fd);

        // load the driver settings
-       void* settingsHandle = load_driver_settings_file(fd);
-       if (settingsHandle == NULL)
+       DriverSettingsUnloader 
settingsHandle(load_driver_settings_file(fd.Get()));
+       if (!settingsHandle.IsSet())
                return NULL;
-       DriverSettingsUnloader settingsDeleter(settingsHandle);

-       const driver_settings* settings = get_driver_settings(settingsHandle);
+       const driver_settings* settings = 
get_driver_settings(settingsHandle.Get());
        for (int i = 0; i < settings->parameter_count; i++) {
                const driver_parameter& parameter = settings->parameters[i];
                if (strcmp(parameter.name, "Package") != 0
diff --git a/src/system/boot/loader/package_support.cpp 
b/src/system/boot/loader/package_support.cpp
index 12ab7c7..7a60f21 100644
--- a/src/system/boot/loader/package_support.cpp
+++ b/src/system/boot/loader/package_support.cpp
@@ -326,13 +326,12 @@
        snprintf(path, sizeof(path), "%s/%s/%s",
                kAdministrativeDirectory, state->Name() != NULL ? state->Name() 
: "",
                kActivatedPackagesFile);
-       int fd = open_from(packagesDirectory, path, O_RDONLY);
-       if (fd < 0)
-               return fd;
-       FileDescriptorCloser fdCloser(fd);
+       FileDescriptorCloser fd(open_from(packagesDirectory, path, O_RDONLY));
+       if (!fd.IsSet())
+               return fd.Get();

        struct stat st;
-       if (fstat(fd, &st) != 0)
+       if (fstat(fd.Get(), &st) != 0)
                return errno;
        if (!S_ISREG(st.st_mode))
                return B_ENTRY_NOT_FOUND;
@@ -340,7 +339,7 @@
        // read the file until we find the system package line
        size_t remainingBytes = 0;
        for (;;) {
-               ssize_t bytesRead = read(fd, path + remainingBytes,
+               ssize_t bytesRead = read(fd.Get(), path + remainingBytes,
                        sizeof(path) - remainingBytes - 1);
                if (bytesRead <= 0)
                        return B_ENTRY_NOT_FOUND;
diff --git a/src/system/libnetwork/getifaddrs.cpp 
b/src/system/libnetwork/getifaddrs.cpp
index 005bc08..3449305 100644
--- a/src/system/libnetwork/getifaddrs.cpp
+++ b/src/system/libnetwork/getifaddrs.cpp
@@ -53,16 +53,15 @@
 static int
 _getifaddrs(int domain, char* buffer, size_t len, struct ifaddrs** previous)
 {
-       int socket = ::socket(domain, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket (::socket(domain, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return -1;
-       FileDescriptorCloser closer(socket);

        // Get interfaces configuration
        ifconf config;
        config.ifc_buf = buffer;
        config.ifc_len = len;
-       if (ioctl(socket, SIOCGIFCONF, &config, sizeof(struct ifconf)) < 0)
+       if (ioctl(socket.Get(), SIOCGIFCONF, &config, sizeof(struct ifconf)) < 
0)
                return -1;

        ifreq* interfaces = (ifreq*)buffer;
@@ -88,13 +87,14 @@
                ifreq request;
                strlcpy(request.ifr_name, interfaces[0].ifr_name, IF_NAMESIZE);

-               if (ioctl(socket, SIOCGIFFLAGS, &request, sizeof(struct ifreq)) 
== 0)
+               if (ioctl(socket.Get(), SIOCGIFFLAGS, &request, sizeof(struct 
ifreq))
+                               == 0)
                        current->ifa_flags = request.ifr_flags;
-               if (ioctl(socket, SIOCGIFNETMASK, &request, sizeof(struct 
ifreq))
+               if (ioctl(socket.Get(), SIOCGIFNETMASK, &request, sizeof(struct 
ifreq))
                                == 0) {
                        current->ifa_netmask = copy_address(request.ifr_mask);
                }
-               if (ioctl(socket, SIOCGIFDSTADDR, &request, sizeof(struct 
ifreq))
+               if (ioctl(socket.Get(), SIOCGIFDSTADDR, &request, sizeof(struct 
ifreq))
                                == 0) {
                        current->ifa_dstaddr = 
copy_address(request.ifr_dstaddr);
                }
@@ -117,20 +117,17 @@
                return -1;
        }

-       int socket = ::socket(AF_INET, SOCK_DGRAM, 0);
-       if (socket < 0)
+       FileDescriptorCloser socket(::socket(AF_INET, SOCK_DGRAM, 0));
+       if (!socket.IsSet())
                return -1;

-       FileDescriptorCloser closer(socket);
-
        // Get interface count
        ifconf config;
        config.ifc_len = sizeof(config.ifc_value);
-       if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 0)
+       if (ioctl(socket.Get(), SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 
0)
                return -1;

-       socket = -1;
-       closer.Unset();
+       socket.Unset();

        size_t count = (size_t)config.ifc_value;
        if (count == 0) {
@@ -141,27 +138,25 @@

        // Allocate a buffer for ifreqs for all interfaces
        size_t buflen = count * sizeof(struct ifreq);
-       char* buffer = (char*)malloc(buflen);
-       if (buffer == NULL) {
+       ArrayDeleter<char> buffer(new(std::nothrow) char[buflen]);
+       if (!buffer.IsSet()) {
                errno = B_NO_MEMORY;
                return -1;
        }

-       MemoryDeleter deleter(buffer);
-
        struct ifaddrs* previous = NULL;
        int serrno = errno;
-       if (_getifaddrs(AF_INET, buffer, buflen, &previous) < 0 &&
+       if (_getifaddrs(AF_INET, buffer.Get(), buflen, &previous) < 0 &&
                errno != B_UNSUPPORTED) {
                freeifaddrs(previous);
                return -1;
        }
-       if (_getifaddrs(AF_INET6, buffer, buflen, &previous) < 0 &&
+       if (_getifaddrs(AF_INET6, buffer.Get(), buflen, &previous) < 0 &&
                errno != B_UNSUPPORTED) {
                freeifaddrs(previous);
                return -1;
        }
-       if (_getifaddrs(AF_LINK, buffer, buflen, &previous) < 0 &&
+       if (_getifaddrs(AF_LINK, buffer.Get(), buflen, &previous) < 0 &&
                errno != B_UNSUPPORTED) {
                freeifaddrs(previous);
                return -1;
diff --git a/src/system/libroot/os/image.cpp b/src/system/libroot/os/image.cpp
index caf4adb..428636b 100644
--- a/src/system/libroot/os/image.cpp
+++ b/src/system/libroot/os/image.cpp
@@ -43,17 +43,16 @@

        void Init(const char* path, const char* const* env, size_t envCount)
        {
-               int fd = open(path, O_RDONLY);
-               if (fd < 0)
+               FileDescriptorCloser fd(open(path, O_RDONLY));
+               if (!fd.IsSet())
                        return;
-               FileDescriptorCloser fdCloser(fd);

                static const char* const kEnvAttribute = "SYS:ENV";
                attr_info info;
-               if (fs_stat_attr(fd, kEnvAttribute, &info) < 0)
+               if (fs_stat_attr(fd.Get(), kEnvAttribute, &info) < 0)
                        return;

-               _Init(fd, kEnvAttribute, info.size, env, envCount);
+               _Init(fd.Get(), kEnvAttribute, info.size, env, envCount);
        }

        size_t AdditionalSlotsNeeded() const
diff --git a/src/tools/generate_boot_screen.cpp 
b/src/tools/generate_boot_screen.cpp
index 5869ad2..264a940 100644
--- a/src/tools/generate_boot_screen.cpp
+++ b/src/tools/generate_boot_screen.cpp
@@ -56,23 +56,6 @@
 // #pragma mark -


-class AutoFileCloser {
-public:
-       AutoFileCloser(FILE* file)
-               : fFile(file)
-       {}
-       ~AutoFileCloser()
-       {
-               fclose(fFile);
-       }
-private:
-       FILE* fFile;
-};
-
-
-// #pragma mark -
-
-
 class ZlibCompressor {
 public:
        ZlibCompressor(FILE* output);
@@ -162,13 +145,11 @@
        png_structp& pngPtr, png_infop& infoPtr)
 {
        char header[8];
-       FILE* input = fopen(filename, "rb");
-       if (!input)
+       FileCloser input(fopen(filename, "rb"));
+       if (!input.IsSet())
                error("[read_png] File %s could not be opened for reading", 
filename);

-       AutoFileCloser _(input);
-
-       fread(header, 1, 8, input);
+       fread(header, 1, 8, input.Get());
        if (png_sig_cmp((png_byte *)header, 0, 8 ))
                error("[read_png] File %s is not recognized as a PNG file", 
filename);

@@ -187,7 +168,7 @@
                error("[read_png] Error during init_io");
 #endif

-       png_init_io(pngPtr, input);
+       png_init_io(pngPtr, input.Get());
        png_set_sig_bytes(pngPtr, 8);

        // make sure we automatically get RGB data with 8 bits per channel

--
To view, visit https://review.haiku-os.org/c/haiku/+/3490
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I6c3925a7aec4d0647c76c2a03aad7b08985d7166
Gerrit-Change-Number: 3490
Gerrit-PatchSet: 1
Gerrit-Owner: X512 <danger_mail@xxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: integrate AutoDeleter's into pointers - Gerrit