kernel_handle.h revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef LIBRARIES_NACL_IO_KERNEL_HANDLE_H_
6#define LIBRARIES_NACL_IO_KERNEL_HANDLE_H_
7
8#include <fcntl.h>
9#include <pthread.h>
10#include <ppapi/c/pp_resource.h>
11
12#include "nacl_io/error.h"
13#include "nacl_io/mount.h"
14#include "nacl_io/mount_node.h"
15#include "nacl_io/ossocket.h"
16#include "nacl_io/ostypes.h"
17
18#include "sdk_util/macros.h"
19#include "sdk_util/ref_object.h"
20#include "sdk_util/scoped_ref.h"
21#include "sdk_util/simple_lock.h"
22
23namespace nacl_io {
24
25class MountNodeSocket;
26
27// HandleAttr struct is passed the MountNode in calls
28// to Read and Write.  It contains handle specific state
29// such as the file offset and the open flags.
30struct HandleAttr {
31  HandleAttr() : offs(0), flags(0) {}
32  bool IsBlocking() const { return !(flags & O_NONBLOCK); }
33
34  size_t offs;
35  int flags;
36};
37
38// KernelHandle provides a reference counted container for the open
39// file information, such as it's mount, node, access type and offset.
40// KernelHandle can only be referenced when the KernelProxy lock is held.
41class KernelHandle : public sdk_util::RefObject {
42 public:
43
44  KernelHandle();
45  KernelHandle(const ScopedMount& mnt, const ScopedMountNode& node);
46  ~KernelHandle();
47
48  Error Init(int open_flags);
49
50  Error Accept(PP_Resource* new_sock, struct sockaddr* addr, socklen_t* len);
51  Error Connect(const struct sockaddr* addr, socklen_t len);
52  Error Fcntl(int request, int* result, ...);
53  Error VFcntl(int request, int* result, va_list args);
54  Error GetDents(struct dirent* pdir, size_t count, int* bytes_written);
55  Error Read(void* buf, size_t nbytes, int* bytes_read);
56  Error Recv(void* buf, size_t len, int flags, int* out_len);
57  Error RecvFrom(void* buf,
58                 size_t len,
59                 int flags,
60                 struct sockaddr* src_addr,
61                 socklen_t* addrlen,
62                 int* out_len);
63  // Assumes |out_offset| is non-NULL.
64  Error Seek(off_t offset, int whence, off_t* out_offset);
65  Error Send(const void* buf, size_t len, int flags, int* out_len);
66  Error SendTo(const void* buf,
67               size_t len,
68               int flags,
69               const struct sockaddr* dest_addr,
70               socklen_t addrlen,
71               int* out_len);
72  Error Write(const void* buf, size_t nbytes, int* bytes_written);
73
74  const ScopedMountNode& node() { return node_; }
75  const ScopedMount& mount() { return mount_; }
76
77  const HandleAttr& Attr() { return handle_attr_; }
78
79  int OpenMode() { return handle_attr_.flags & 3; }
80
81private:
82  // Returns the MountNodeSocket* if this node is a socket otherwise returns
83  // NULL.
84  MountNodeSocket* socket_node();
85
86  ScopedMount mount_;
87  ScopedMountNode node_;
88  sdk_util::SimpleLock handle_lock_;
89  HandleAttr handle_attr_;
90
91  friend class KernelProxy;
92  DISALLOW_COPY_AND_ASSIGN(KernelHandle);
93};
94
95typedef sdk_util::ScopedRef<KernelHandle> ScopedKernelHandle;
96
97}  // namespace nacl_io
98
99#endif  // LIBRARIES_NACL_IO_KERNEL_HANDLE_H_
100