160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//===-- File.h --------------------------------------------------*- C++ -*-===//
260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//
360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//                     The LLVM Compiler Infrastructure
460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//
560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton// This file is distributed under the University of Illinois Open Source
660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton// License. See LICENSE.TXT for details.
760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//
860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//===----------------------------------------------------------------------===//
960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
1060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#ifndef liblldb_File_h_
1160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#define liblldb_File_h_
1260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#if defined(__cplusplus)
1360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
14419144b064166f0d18b06cad4d52fe66e7ca058fGreg Clayton#include <stdio.h>
15419144b064166f0d18b06cad4d52fe66e7ca058fGreg Clayton
1660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#include "lldb/lldb-private.h"
1760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
1860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Claytonnamespace lldb_private {
1960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
2060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//----------------------------------------------------------------------
2160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton/// @class File File.h "lldb/Host/File.h"
2260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton/// @brief A file class.
2360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton///
2460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton/// A file class that divides abstracts the LLDB core from host file
2560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton/// functionality.
2660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//----------------------------------------------------------------------
2760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Claytonclass File
2860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton{
2960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Claytonpublic:
305892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    static int kInvalidDescriptor;
315892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    static FILE * kInvalidStream;
325892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
3360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    enum OpenOptions
3460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
3560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        eOpenOptionRead                 = (1u << 0),    // Open file for reading
3660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        eOpenOptionWrite                = (1u << 1),    // Open file for writing
3760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        eOpenOptionAppend               = (1u << 2),    // Don't truncate file when opening, append to end of file
382f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton        eOpenOptionTruncate             = (1u << 3),    // Truncate file when opening
392f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton        eOpenOptionNonBlocking          = (1u << 4),    // File reads
402f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton        eOpenOptionCanCreate            = (1u << 5),    // Create file if doesn't already exist
412f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton        eOpenOptionCanCreateNewOnly     = (1u << 6)     // Can create file only if it doesn't already exist
4260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    };
4360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
4460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    enum Permissions
4560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
4660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsUserRead        = (1u << 0),
4760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsUserWrite       = (1u << 1),
4860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsUserExecute     = (1u << 2),
4960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsGroupRead       = (1u << 3),
5060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsGroupWrite      = (1u << 4),
5160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsGroupExecute    = (1u << 5),
5260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsWorldRead       = (1u << 6),
5360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsWorldWrite      = (1u << 7),
545892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsWorldExecute    = (1u << 8),
555892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
565892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsUserRW      = (ePermissionsUserRead    | ePermissionsUserWrite    | 0                        ),
575892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsUserRX      = (ePermissionsUserRead    | 0                        | ePermissionsUserExecute  ),
585892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsUserRWX     = (ePermissionsUserRead    | ePermissionsUserWrite    | ePermissionsUserExecute  ),
595892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
605892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsGroupRW     = (ePermissionsGroupRead   | ePermissionsGroupWrite   | 0                        ),
615892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsGroupRX     = (ePermissionsGroupRead   | 0                        | ePermissionsGroupExecute ),
625892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsGroupRWX    = (ePermissionsGroupRead   | ePermissionsGroupWrite   | ePermissionsGroupExecute ),
635892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
645892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsWorldRW     = (ePermissionsWorldRead   | ePermissionsWorldWrite   | 0                        ),
655892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsWorldRX     = (ePermissionsWorldRead   | 0                        | ePermissionsWorldExecute ),
665892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsWorldRWX    = (ePermissionsWorldRead   | ePermissionsWorldWrite   | ePermissionsWorldExecute ),
675892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
685892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneR   = (ePermissionsUserRead    | ePermissionsGroupRead    | ePermissionsWorldRead    ),
695892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneW   = (ePermissionsUserWrite   | ePermissionsGroupWrite   | ePermissionsWorldWrite   ),
705892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneX   = (ePermissionsUserExecute | ePermissionsGroupExecute | ePermissionsWorldExecute ),
715892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
725892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneRW  = (ePermissionsEveryoneR   | ePermissionsEveryoneW    | 0                        ),
735892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneRX  = (ePermissionsEveryoneR   | 0                        | ePermissionsEveryoneX    ),
745892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneRWX = (ePermissionsEveryoneR   | ePermissionsEveryoneW    | ePermissionsEveryoneX    ),
755892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsDefault     = (ePermissionsUserRW      | ePermissionsGroupRead)
7660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    };
7760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
785892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File() :
795892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_descriptor (kInvalidDescriptor),
805892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_stream (kInvalidStream),
815892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_options (0),
825892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_owned (false)
835892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    {
845892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
855892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
865892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File (FILE *fh, bool transfer_ownership) :
875892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_descriptor (kInvalidDescriptor),
885892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_stream (fh),
895892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_options (0),
905892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_owned (transfer_ownership)
9160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
9260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    }
9360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
945892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File (const File &rhs);
955892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
965892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File &
975892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    operator= (const File &rhs);
9860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
9960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Constructor with path.
10060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
10160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Takes a path to a file which can be just a filename, or a full
10260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// path. If \a path is not NULL or empty, this function will call
103d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// File::Open (const char *path, uint32_t options, uint32_t permissions).
10460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
10560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @param[in] path
10660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     The full or partial path to a file.
10760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
10860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @param[in] options
109d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     Options to use when opening (see File::OpenOptions)
11060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
11160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @param[in] permissions
112d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     Options to use when opening (see File::Permissions)
11360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
114d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Open (const char *path, uint32_t options, uint32_t permissions)
11560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
11660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    File (const char *path,
11760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton          uint32_t options,
1185892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton          uint32_t permissions = ePermissionsDefault);
11960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
1205892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
1215892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File (int fd, bool tranfer_ownership) :
1225892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_descriptor (fd),
1235892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_stream (kInvalidStream),
1245892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_options (0),
1255892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_owned (tranfer_ownership)
1265892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    {
1275892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
12860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
12960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Destructor.
13060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
13160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// The destructor is virtual in case this class is subclassed.
13260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
13360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    virtual
13460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ~File ();
13560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
13660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    bool
13760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    IsValid () const
13860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
1395892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return DescriptorIsValid() || StreamIsValid();
14060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    }
14160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
14260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
14360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Convert to pointer operator.
14460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
14560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// This allows code to check a File object to see if it
14660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// contains anything valid using code such as:
14760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
14860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @code
14960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// File file(...);
15060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// if (file)
15160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// { ...
15260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @endcode
15360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
15460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @return
15560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     A pointer to this object if either the directory or filename
15660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     is valid, NULL otherwise.
15760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
15860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    operator
15960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    bool () const
16060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
1615892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return DescriptorIsValid() || StreamIsValid();
16260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    }
16360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
16460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
16560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Logical NOT operator.
16660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
16760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// This allows code to check a File object to see if it is
16860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// invalid using code such as:
16960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
17060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @code
17160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// File file(...);
17260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// if (!file)
17360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// { ...
17460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @endcode
17560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
17660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @return
17760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     Returns \b true if the object has an empty directory and
17860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     filename, \b false otherwise.
17960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
18060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    bool
18160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    operator! () const
18260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
1835892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return !DescriptorIsValid() && !StreamIsValid();
18460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    }
18560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
18660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
18760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Get the file spec for this file.
18860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
18960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @return
19060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     A reference to the file specification object.
19160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
192882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Error
193882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    GetFileSpec (FileSpec &file_spec) const;
19460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
195d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
196d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Open a file for read/writing with the specified options.
197d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
198d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Takes a path to a file which can be just a filename, or a full
199d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// path.
200d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
201d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] path
202d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The full or partial path to a file.
203d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
204d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] options
205d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     Options to use when opening (see File::OpenOptions)
206d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
207d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] permissions
208d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     Options to use when opening (see File::Permissions)
209d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
21060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Error
21160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Open (const char *path,
21260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton          uint32_t options,
2135892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton          uint32_t permissions = ePermissionsDefault);
21460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
21560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Error
21660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Close ();
21760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
2185892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    Error
2195892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    Duplicate (const File &rhs);
2205892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
2215892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    int
2225892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    GetDescriptor() const;
2235892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
2245892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    void
2255892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    SetDescriptor(int fd, bool transfer_ownership);
2265892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
2275892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    FILE *
2285892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    GetStream ();
2295892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
2305892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    void
2315892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    SetStream (FILE *fh, bool transfer_ownership);
2325892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
233d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
234d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Read bytes from a file from the current file position.
235d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
236d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe. Use the read function
237d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// that takes an "off_t &offset" to ensure correct operation in
238d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// multi-threaded environments.
239d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
240d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] buf
241d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     A buffer where to put the bytes that are read.
242d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
243d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] num_bytes
244d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The number of bytes to read form the current file position
245d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     which gets modified with the number of bytes that were read.
246d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
247d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
248d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
249d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
250d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
25160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Error
252d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Read (void *buf, size_t &num_bytes);
25360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
254d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
255d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Write bytes to a file at the current file position.
256d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
257d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe. Use the write function
258d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// that takes an "off_t &offset" to ensure correct operation in
259d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// multi-threaded environments.
260d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
261d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] buf
262d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     A buffer where to put the bytes that are read.
263d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
264d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] num_bytes
265d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The number of bytes to write to the current file position
266d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     which gets modified with the number of bytes that were
267d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     written.
268d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
269d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
270d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
271d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
272d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
27360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Error
274d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Write (const void *buf, size_t &num_bytes);
27560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
276d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
277d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Seek to an offset relative to the beginning of the file.
278d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
279d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe, other threads that
280d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// access this object might also change the current file position.
281d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// For thread safe reads and writes see the following functions:
282d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Read (void *, size_t, off_t &)
283d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Write (const void *, size_t, off_t &)
284d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
2851c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    /// @param[in] offset
286d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset to seek to within the file relative to the
2871c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     beginning of the file.
2881c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///
2891c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    /// @param[in] error_ptr
2901c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     A pointer to a lldb_private::Error object that will be
2911c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     filled in if non-NULL.
292d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
293d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
2941c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     The resulting seek offset, or -1 on error.
295d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
2961c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    off_t
2971c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    SeekFromStart (off_t offset, Error *error_ptr = NULL);
298882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton
299d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
300d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Seek to an offset relative to the current file position.
301d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
302d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe, other threads that
303d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// access this object might also change the current file position.
304d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// For thread safe reads and writes see the following functions:
305d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Read (void *, size_t, off_t &)
306d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Write (const void *, size_t, off_t &)
307d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
3081c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    /// @param[in] offset
309d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset to seek to within the file relative to the
3101c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     current file position.
3111c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///
3121c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    /// @param[in] error_ptr
3131c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     A pointer to a lldb_private::Error object that will be
3141c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     filled in if non-NULL.
315d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
316d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
3171c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     The resulting seek offset, or -1 on error.
318d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
3191c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    off_t
3201c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    SeekFromCurrent (off_t offset, Error *error_ptr = NULL);
321882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton
322d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
323d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Seek to an offset relative to the end of the file.
324d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
325d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe, other threads that
326d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// access this object might also change the current file position.
327d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// For thread safe reads and writes see the following functions:
328d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Read (void *, size_t, off_t &)
329d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Write (const void *, size_t, off_t &)
330d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
331d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] offset
332d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset to seek to within the file relative to the
333d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     end of the file which gets filled in the the resulting
334d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     absolute file offset.
335d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
3361c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    /// @param[in] error_ptr
3371c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     A pointer to a lldb_private::Error object that will be
3381c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     filled in if non-NULL.
3391c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///
340d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
3411c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    ///     The resulting seek offset, or -1 on error.
342d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
3431c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    off_t
3441c52f53b131537899c4ec04aa531e81979e1b544Greg Clayton    SeekFromEnd (off_t offset, Error *error_ptr = NULL);
345882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton
346d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
347d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Read bytes from a file from the specified file offset.
348d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
349d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is thread safe in that clients manager their
350d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// own file position markers and reads on other threads won't mess
351d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// up the current read.
352d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
353d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] buf
354d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     A buffer where to put the bytes that are read.
355d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
356d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] num_bytes
357d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The number of bytes to read form the current file position
358d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     which gets modified with the number of bytes that were read.
359d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
360d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] offset
361d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset within the file from which to read \a num_bytes
362d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     bytes. This offset gets incremented by the number of bytes
363d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     that were read.
364d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
365d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
366d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
367d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
368d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
369d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Error
370d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Read (void *dst, size_t &num_bytes, off_t &offset);
371d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton
372d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
3732f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// Read bytes from a file from the specified file offset.
3742f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///
3752f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// NOTE: This function is thread safe in that clients manager their
3762f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// own file position markers and reads on other threads won't mess
3772f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// up the current read.
3782f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///
3792f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// @param[in/out] num_bytes
3802f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     The number of bytes to read form the current file position
3812f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     which gets modified with the number of bytes that were read.
3822f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///
3832f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// @param[in/out] offset
3842f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     The offset within the file from which to read \a num_bytes
3852f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     bytes. This offset gets incremented by the number of bytes
3862f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     that were read.
3872f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///
388fc04d2463ad654c28f9ee2ee836174cc86b7f8b8Greg Clayton    /// @param[in] null_terminate
389fc04d2463ad654c28f9ee2ee836174cc86b7f8b8Greg Clayton    ///     Ensure that the data that is read is terminated with a NULL
390fc04d2463ad654c28f9ee2ee836174cc86b7f8b8Greg Clayton    ///     character so that the data can be used as a C string.
391fc04d2463ad654c28f9ee2ee836174cc86b7f8b8Greg Clayton    ///
3922f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// @param[out] data_buffer_sp
3932f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     A data buffer to create and fill in that will contain any
3942f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     data that is read from the file. This buffer will be reset
3952f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     if an error occurs.
3962f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///
3972f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    /// @return
3982f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     An error object that indicates success or the reason for
3992f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    ///     failure.
4002f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    //------------------------------------------------------------------
4012f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    Error
402fc04d2463ad654c28f9ee2ee836174cc86b7f8b8Greg Clayton    Read (size_t &num_bytes,
403fc04d2463ad654c28f9ee2ee836174cc86b7f8b8Greg Clayton          off_t &offset,
404fc04d2463ad654c28f9ee2ee836174cc86b7f8b8Greg Clayton          bool null_terminate,
405fc04d2463ad654c28f9ee2ee836174cc86b7f8b8Greg Clayton          lldb::DataBufferSP &data_buffer_sp);
4062f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton
4072f28ece553d2ef0d7b3e8d1419020591ec3818f9Greg Clayton    //------------------------------------------------------------------
408d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Write bytes to a file at the specified file offset.
409d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
410d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is thread safe in that clients manager their
411d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// own file position markers, though clients will need to implement
412d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// their own locking externally to avoid multiple people writing
413d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// to the file at the same time.
414d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
415d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] buf
416d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     A buffer containing the bytes to write.
417d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
418d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] num_bytes
419d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The number of bytes to write to the file at offset \a offset.
420d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     \a num_bytes gets modified with the number of bytes that
421d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     were read.
422d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
423d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] offset
424d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset within the file at which to write \a num_bytes
425d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     bytes. This offset gets incremented by the number of bytes
426d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     that were written.
427d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
428d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
429d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
430d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
431d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
432d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Error
433d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Write (const void *src, size_t &num_bytes, off_t &offset);
434d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton
4355892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    //------------------------------------------------------------------
4365892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// Flush the current stream
4375892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///
4385892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// @return
4395892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     An error object that indicates success or the reason for
4405892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     failure.
4415892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    //------------------------------------------------------------------
4425892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    Error
4435892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    Flush ();
444d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton
445d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
446d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Sync to disk.
447d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
448d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
449d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
450d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
451d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
452882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Error
453882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Sync ();
454882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton
4555892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    //------------------------------------------------------------------
4565892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// Output printf formatted output to the stream.
4575892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///
4585892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// Print some formatted output to the stream.
4595892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///
4605892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// @param[in] format
4615892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     A printf style format string.
4625892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///
4635892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// @param[in] ...
4645892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     Variable arguments that are needed for the printf style
4655892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     format string \a format.
4665892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    //------------------------------------------------------------------
46736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t
4687e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    Printf (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
4695892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
47036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t
4715892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    PrintfVarArg(const char *format, va_list args);
4725892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
47360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Claytonprotected:
4745892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
4755892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
4765892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    bool
4775892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    DescriptorIsValid () const
4785892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    {
4795892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return m_descriptor >= 0;
4805892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
4815892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
4825892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    bool
4835892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    StreamIsValid () const
4845892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    {
4855892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return m_stream != kInvalidStream;
4865892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
4875892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
48860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
48960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    // Member variables
49060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
4915892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    int m_descriptor;
4925892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    FILE *m_stream;
4935892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    uint32_t m_options;
4945892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    bool m_owned;
49560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton};
49660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
49760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton} // namespace lldb_private
49860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
49960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#endif  // #if defined(__cplusplus)
500d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton#endif  // liblldb_File_h_
501