1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LIBRARIES_NACL_IO_KERNEL_HANDLE_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LIBRARIES_NACL_IO_KERNEL_HANDLE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <fcntl.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pthread.h>
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <ppapi/c/pp_resource.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "nacl_io/error.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "nacl_io/filesystem.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "nacl_io/node.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "nacl_io/ossocket.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/ostypes.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sdk_util/macros.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sdk_util/ref_object.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "sdk_util/scoped_ref.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "sdk_util/simple_lock.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace nacl_io {
24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SocketNode;
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// HandleAttr struct is passed the Node in calls
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// to Read and Write.  It contains handle specific state
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// such as the file offset and the open flags.
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)struct HandleAttr {
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  HandleAttr() : offs(0), flags(0) {}
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool IsBlocking() const { return !(flags & O_NONBLOCK); }
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  off_t offs;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int flags;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KernelHandle provides a reference counted container for the open
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// file information, such as it's filesystem, node, access type and offset.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KernelHandle can only be referenced when the KernelProxy lock is held.
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass KernelHandle : public sdk_util::RefObject {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  KernelHandle();
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  KernelHandle(const ScopedFilesystem& fs, const ScopedNode& node);
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ~KernelHandle();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Error Init(int open_flags);
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error Accept(PP_Resource* new_sock, struct sockaddr* addr, socklen_t* len);
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error Connect(const struct sockaddr* addr, socklen_t len);
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error Fcntl(int request, int* result, ...);
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error VFcntl(int request, int* result, va_list args);
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error GetDents(struct dirent* pdir, size_t count, int* bytes_written);
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error Read(void* buf, size_t nbytes, int* bytes_read);
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error Recv(void* buf, size_t len, int flags, int* out_len);
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error RecvFrom(void* buf,
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 size_t len,
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 int flags,
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 struct sockaddr* src_addr,
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 socklen_t* addrlen,
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 int* out_len);
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Assumes |out_offset| is non-NULL.
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Error Seek(off_t offset, int whence, off_t* out_offset);
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error Send(const void* buf, size_t len, int flags, int* out_len);
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Error SendTo(const void* buf,
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               size_t len,
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               int flags,
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               const struct sockaddr* dest_addr,
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               socklen_t addrlen,
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               int* out_len);
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Error Write(const void* buf, size_t nbytes, int* bytes_written);
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ScopedNode& node() { return node_; }
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ScopedFilesystem& filesystem() { return filesystem_; }
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const HandleAttr& Attr() { return handle_attr_; }
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int OpenMode() { return handle_attr_.flags & 3; }
798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns the SocketNode* if this node is a socket otherwise returns
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // NULL.
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SocketNode* socket_node();
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedFilesystem filesystem_;
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedNode node_;
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sdk_util::SimpleLock handle_lock_;
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  HandleAttr handle_attr_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class KernelProxy;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(KernelHandle);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef sdk_util::ScopedRef<KernelHandle> ScopedKernelHandle;
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace nacl_io
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // LIBRARIES_NACL_IO_KERNEL_HANDLE_H_
99