1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include "mozilla/devtools/FileDescriptorOutputStream.h"
7 #include "private/pprio.h"
8 
9 namespace mozilla {
10 namespace devtools {
11 
12 /* static */ already_AddRefed<FileDescriptorOutputStream>
Create(const ipc::FileDescriptor & fileDescriptor)13 FileDescriptorOutputStream::Create(const ipc::FileDescriptor& fileDescriptor) {
14   if (NS_WARN_IF(!fileDescriptor.IsValid())) return nullptr;
15 
16   auto rawFD = fileDescriptor.ClonePlatformHandle();
17   PRFileDesc* prfd = PR_ImportFile(PROsfd(rawFD.release()));
18   if (NS_WARN_IF(!prfd)) return nullptr;
19 
20   RefPtr<FileDescriptorOutputStream> stream =
21       new FileDescriptorOutputStream(prfd);
22   return stream.forget();
23 }
24 
25 NS_IMPL_ISUPPORTS(FileDescriptorOutputStream, nsIOutputStream);
26 
27 NS_IMETHODIMP
Close()28 FileDescriptorOutputStream::Close() {
29   // Repeatedly closing is idempotent.
30   if (!fd) return NS_OK;
31 
32   if (PR_Close(fd) != PR_SUCCESS) return NS_ERROR_FAILURE;
33   fd = nullptr;
34   return NS_OK;
35 }
36 
37 NS_IMETHODIMP
Write(const char * buf,uint32_t count,uint32_t * retval)38 FileDescriptorOutputStream::Write(const char* buf, uint32_t count,
39                                   uint32_t* retval) {
40   if (NS_WARN_IF(!fd)) return NS_ERROR_FAILURE;
41 
42   auto written = PR_Write(fd, buf, count);
43   if (written < 0) return NS_ERROR_FAILURE;
44   *retval = written;
45   return NS_OK;
46 }
47 
48 NS_IMETHODIMP
Flush()49 FileDescriptorOutputStream::Flush() {
50   if (NS_WARN_IF(!fd)) return NS_ERROR_FAILURE;
51 
52   return PR_Sync(fd) == PR_SUCCESS ? NS_OK : NS_ERROR_FAILURE;
53 }
54 
55 NS_IMETHODIMP
WriteFrom(nsIInputStream * fromStream,uint32_t count,uint32_t * retval)56 FileDescriptorOutputStream::WriteFrom(nsIInputStream* fromStream,
57                                       uint32_t count, uint32_t* retval) {
58   return NS_ERROR_NOT_IMPLEMENTED;
59 }
60 
61 NS_IMETHODIMP
WriteSegments(nsReadSegmentFun reader,void * closure,uint32_t count,uint32_t * retval)62 FileDescriptorOutputStream::WriteSegments(nsReadSegmentFun reader,
63                                           void* closure, uint32_t count,
64                                           uint32_t* retval) {
65   return NS_ERROR_NOT_IMPLEMENTED;
66 }
67 
68 NS_IMETHODIMP
IsNonBlocking(bool * retval)69 FileDescriptorOutputStream::IsNonBlocking(bool* retval) {
70   *retval = false;
71   return NS_OK;
72 }
73 
74 }  // namespace devtools
75 }  // namespace mozilla
76