1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <stdint.h>
20 #include <trusty/interface/storage.h>
21 
22 #define STORAGE_MAX_NAME_LENGTH_BYTES 159
23 
24 __BEGIN_DECLS
25 
26 typedef uint32_t storage_session_t;
27 typedef uint64_t file_handle_t;
28 typedef uint64_t storage_off_t;
29 
30 #define STORAGE_INVALID_SESSION ((storage_session_t)-1)
31 
32 /**
33  * storage_ops_flags - storage related operation flags
34  * @STORAGE_OP_COMPLETE: forces to commit current transaction
35  */
36 enum storage_ops_flags {
37     STORAGE_OP_COMPLETE = 0x1,
38 };
39 
40 /**
41  * storage_open_session() - Opens a storage session.
42  * @device:    device node for talking with Trusty
43  * @session_p: pointer to location in which to store session handle
44  *             in case of success.
45  *
46  * Return: 0 on success, or an error code < 0 on failure.
47  */
48 int storage_open_session(const char *device, storage_session_t *session_p, const char *port);
49 
50 /**
51  * storage_close_session() - Closes the session.
52  * @session: the session to close
53  */
54 void storage_close_session(storage_session_t session);
55 
56 /**
57  * storage_open_file() - Opens a file
58  * @session:  the storage_session_t returned from a call to storage_open_session
59  * @handle_p: pointer to location in which to store file handle in case of success
60  * @name:     a null-terminated string identifier of the file to open.
61  *            Cannot be more than STORAGE_MAX_NAME_LENGTH_BYTES in length.
62  * @flags:    A bitmask consisting any storage_file_flag value or'ed together:
63  * - STORAGE_FILE_OPEN_CREATE:           if this file does not exist, create it.
64  * - STORAGE_FILE_OPEN_CREATE_EXCLUSIVE: when specified, opening file with
65  *                                       STORAGE_OPEN_FILE_CREATE flag will
66  *                                       fail if the file already exists.
67  *                                       Only meaningful if used in combination
68  *                                       with STORAGE_FILE_OPEN_CREATE flag.
69  * - STORAGE_FILE_OPEN_TRUNCATE: if this file already exists, discard existing
70  *                               content and open it as a new file. No change
71  *                               in semantics if the  file does not exist.
72  * @opflags: a combination of @storage_op_flags
73  *
74  * Return: 0 on success, or an error code < 0 on failure.
75  */
76 int storage_open_file(storage_session_t session, file_handle_t *handle_p,
77                       const char *name, uint32_t flags, uint32_t opflags);
78 
79 /**
80  * storage_close_file() - Closes a file.
81  * @handle: the file_handle_t retrieved from storage_open_file
82  */
83 void storage_close_file(file_handle_t handle);
84 
85 /**
86  * storage_delete_file - Deletes a file.
87  * @session: the storage_session_t returned from a call to storage_open_session
88  * @name: the name of the file to delete
89  * @opflags: a combination of @storage_op_flags
90  *
91  * Return: 0 on success, or an error code < 0 on failure.
92  */
93 int storage_delete_file(storage_session_t session, const char *name,
94                         uint32_t opflags);
95 
96 /**
97  * storage_read() - Reads a file at a given offset.
98  * @handle: the file_handle_t retrieved from storage_open_file
99  * @off: the start offset from whence to read in the file
100  * @buf: the buffer in which to write the data read
101  * @size: the size of buf and number of bytes to read
102  *
103  * Return: the number of bytes read on success, negative error code on failure
104  */
105 ssize_t storage_read(file_handle_t handle,
106                      storage_off_t off, void *buf, size_t size);
107 
108 /**
109  * storage_write() - Writes to a file at a given offset. Grows the file if necessary.
110  * @handle: the file_handle_t retrieved from storage_open_file
111  * @off: the start offset from whence to write in the file
112  * @buf: the buffer containing the data to write
113  * @size: the size of buf and number of bytes to write
114  * @opflags: a combination of @storage_op_flags
115  *
116  * Return: the number of bytes written on success, negative error code on failure
117  */
118 ssize_t storage_write(file_handle_t handle,
119                       storage_off_t off, const void *buf, size_t size,
120                       uint32_t opflags);
121 
122 /**
123  * storage_set_file_size() - Sets the size of the file.
124  * @handle: the file_handle_t retrieved from storage_open_file
125  * @off: the number of bytes to set as the new size of the file
126  * @opflags: a combination of @storage_op_flags
127  *
128  * Return: 0 on success, negative error code on failure.
129  */
130 int storage_set_file_size(file_handle_t handle, storage_off_t file_size,
131                           uint32_t opflags);
132 
133 /**
134  * storage_get_file_size() - Gets the size of the file.
135  * @session: the storage_session_t returned from a call to storage_open_session
136  * @handle: the file_handle_t retrieved from storage_open_file
137  * @size: pointer to storage_off_t in which to store the file size
138  *
139  * Return: 0 on success, negative error code on failure.
140  */
141 int storage_get_file_size(file_handle_t handle, storage_off_t *size);
142 
143 
144 /**
145  * storage_end_transaction: End current transaction
146  * @session: the storage_session_t returned from a call to storage_open_session
147  * @complete: if true, commit current transaction, discard it otherwise
148  *
149  * Return: 0 on success, negative error code on failure.
150  */
151 int storage_end_transaction(storage_session_t session, bool complete);
152 
153 
154 __END_DECLS
155