• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Android Open Source Project
2 //
3 // This software is licensed under the terms of the GNU General Public
4 // License version 2, as published by the Free Software Foundation, and
5 // may be copied, distributed, and modified under those terms.
6 //
7 // This program is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 // GNU General Public License for more details.
11 
12 #ifndef ANDROID_BASE_SCOPED_FD_H
13 #define ANDROID_BASE_SCOPED_FD_H
14 
15 #include "android/base/Compiler.h"
16 
17 #include <errno.h>
18 #include <unistd.h>
19 
20 namespace android {
21 namespace base {
22 
23 // Helper class to hold an integer file descriptor, and have the 'close'
24 // function called automatically on scope exit, unless the 'release'
25 // method was called previously.
26 class ScopedFd {
27 public:
28     // Default constructor will hold an invalid descriptor.
ScopedFd()29     ScopedFd() : fd_(-1) {}
30 
31     // Constructor takes ownership of |fd|.
ScopedFd(int fd)32     explicit ScopedFd(int fd) : fd_(fd) {}
33 
34     // Destructor calls close().
~ScopedFd()35     ~ScopedFd() { close(); }
36 
37     // Return the file descriptor value, does _not_ transfer ownership.
get()38     int get() const { return fd_; }
39 
40     // Return the file descriptor value, transfers ownership to the caller.
release()41     int release() {
42         int fd = fd_;
43         fd_ = -1;
44         return fd;
45     }
46 
47     // Return true iff the file descriptor is valid.
valid()48     bool valid() const { return fd_ >= 0; }
49 
50     // Close the file descriptor (and make the wrapped value invalid).
close()51     void close() {
52         if (fd_ != -1) {
53             int save_errno = errno;
54             ::close(fd_);
55             fd_ = -1;
56             errno = save_errno;
57         }
58     }
59 
60     // Swap two ScopedFd instances.
swap(ScopedFd * other)61     void swap(ScopedFd* other) {
62         int fd = fd_;
63         fd_ = other->fd_;
64         other->fd_ = fd;
65     }
66 
67 private:
68     DISALLOW_COPY_AND_ASSIGN(ScopedFd);
69 
70     int fd_;
71 };
72 
73 }  // namespace base
74 }  // namespace android
75 
76 #endif  // ANDROID_BASE_SCOPED_FD_H
77