Statistics
| Branch: | Revision:

root / qemu-file.h @ 01e26b0e

History | View | Annotate | Download (6.9 kB)

1
/*
2
 * QEMU System Emulator
3
 *
4
 * Copyright (c) 2003-2008 Fabrice Bellard
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
#ifndef QEMU_FILE_H
25
#define QEMU_FILE_H 1
26

    
27
/* This function writes a chunk of data to a file at the given position.
28
 * The pos argument can be ignored if the file is only being used for
29
 * streaming.  The handler should try to write all of the data it can.
30
 */
31
typedef int (QEMUFilePutBufferFunc)(void *opaque, const uint8_t *buf,
32
                                    int64_t pos, int size);
33

    
34
/* Read a chunk of data from a file at the given position.  The pos argument
35
 * can be ignored if the file is only be used for streaming.  The number of
36
 * bytes actually read should be returned.
37
 */
38
typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
39
                                    int64_t pos, int size);
40

    
41
/* Close a file
42
 *
43
 * Return negative error number on error, 0 or positive value on success.
44
 *
45
 * The meaning of return value on success depends on the specific back-end being
46
 * used.
47
 */
48
typedef int (QEMUFileCloseFunc)(void *opaque);
49

    
50
/* Called to return the OS file descriptor associated to the QEMUFile.
51
 */
52
typedef int (QEMUFileGetFD)(void *opaque);
53

    
54
/* Called to determine if the file has exceeded its bandwidth allocation.  The
55
 * bandwidth capping is a soft limit, not a hard limit.
56
 */
57
typedef int (QEMUFileRateLimit)(void *opaque);
58

    
59
/* Called to change the current bandwidth allocation. This function must return
60
 * the new actual bandwidth. It should be new_rate if everything goes ok, and
61
 * the old rate otherwise
62
 */
63
typedef int64_t (QEMUFileSetRateLimit)(void *opaque, int64_t new_rate);
64
typedef int64_t (QEMUFileGetRateLimit)(void *opaque);
65

    
66
typedef struct QEMUFileOps {
67
    QEMUFilePutBufferFunc *put_buffer;
68
    QEMUFileGetBufferFunc *get_buffer;
69
    QEMUFileCloseFunc *close;
70
    QEMUFileGetFD *get_fd;
71
    QEMUFileRateLimit *rate_limit;
72
    QEMUFileSetRateLimit *set_rate_limit;
73
    QEMUFileGetRateLimit *get_rate_limit;
74
} QEMUFileOps;
75

    
76
QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops);
77
QEMUFile *qemu_fopen(const char *filename, const char *mode);
78
QEMUFile *qemu_fdopen(int fd, const char *mode);
79
QEMUFile *qemu_fopen_socket(int fd);
80
QEMUFile *qemu_popen(FILE *popen_file, const char *mode);
81
QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
82
int qemu_get_fd(QEMUFile *f);
83
int qemu_fclose(QEMUFile *f);
84
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
85
void qemu_put_byte(QEMUFile *f, int v);
86

    
87
static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
88
{
89
    qemu_put_byte(f, (int)v);
90
}
91

    
92
#define qemu_put_sbyte qemu_put_byte
93

    
94
void qemu_put_be16(QEMUFile *f, unsigned int v);
95
void qemu_put_be32(QEMUFile *f, unsigned int v);
96
void qemu_put_be64(QEMUFile *f, uint64_t v);
97
int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
98
int qemu_get_byte(QEMUFile *f);
99

    
100
static inline unsigned int qemu_get_ubyte(QEMUFile *f)
101
{
102
    return (unsigned int)qemu_get_byte(f);
103
}
104

    
105
#define qemu_get_sbyte qemu_get_byte
106

    
107
unsigned int qemu_get_be16(QEMUFile *f);
108
unsigned int qemu_get_be32(QEMUFile *f);
109
uint64_t qemu_get_be64(QEMUFile *f);
110

    
111
int qemu_file_rate_limit(QEMUFile *f);
112
int64_t qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate);
113
int64_t qemu_file_get_rate_limit(QEMUFile *f);
114
int qemu_file_get_error(QEMUFile *f);
115

    
116
/* Try to send any outstanding data.  This function is useful when output is
117
 * halted due to rate limiting or EAGAIN errors occur as it can be used to
118
 * resume output. */
119
int qemu_file_put_notify(QEMUFile *f);
120

    
121
static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
122
{
123
    qemu_put_be64(f, *pv);
124
}
125

    
126
static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
127
{
128
    qemu_put_be32(f, *pv);
129
}
130

    
131
static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
132
{
133
    qemu_put_be16(f, *pv);
134
}
135

    
136
static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
137
{
138
    qemu_put_byte(f, *pv);
139
}
140

    
141
static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
142
{
143
    *pv = qemu_get_be64(f);
144
}
145

    
146
static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
147
{
148
    *pv = qemu_get_be32(f);
149
}
150

    
151
static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
152
{
153
    *pv = qemu_get_be16(f);
154
}
155

    
156
static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
157
{
158
    *pv = qemu_get_byte(f);
159
}
160

    
161
// Signed versions for type safety
162
static inline void qemu_put_sbuffer(QEMUFile *f, const int8_t *buf, int size)
163
{
164
    qemu_put_buffer(f, (const uint8_t *)buf, size);
165
}
166

    
167
static inline void qemu_put_sbe16(QEMUFile *f, int v)
168
{
169
    qemu_put_be16(f, (unsigned int)v);
170
}
171

    
172
static inline void qemu_put_sbe32(QEMUFile *f, int v)
173
{
174
    qemu_put_be32(f, (unsigned int)v);
175
}
176

    
177
static inline void qemu_put_sbe64(QEMUFile *f, int64_t v)
178
{
179
    qemu_put_be64(f, (uint64_t)v);
180
}
181

    
182
static inline size_t qemu_get_sbuffer(QEMUFile *f, int8_t *buf, int size)
183
{
184
    return qemu_get_buffer(f, (uint8_t *)buf, size);
185
}
186

    
187
static inline int qemu_get_sbe16(QEMUFile *f)
188
{
189
    return (int)qemu_get_be16(f);
190
}
191

    
192
static inline int qemu_get_sbe32(QEMUFile *f)
193
{
194
    return (int)qemu_get_be32(f);
195
}
196

    
197
static inline int64_t qemu_get_sbe64(QEMUFile *f)
198
{
199
    return (int64_t)qemu_get_be64(f);
200
}
201

    
202
static inline void qemu_put_s8s(QEMUFile *f, const int8_t *pv)
203
{
204
    qemu_put_8s(f, (const uint8_t *)pv);
205
}
206

    
207
static inline void qemu_put_sbe16s(QEMUFile *f, const int16_t *pv)
208
{
209
    qemu_put_be16s(f, (const uint16_t *)pv);
210
}
211

    
212
static inline void qemu_put_sbe32s(QEMUFile *f, const int32_t *pv)
213
{
214
    qemu_put_be32s(f, (const uint32_t *)pv);
215
}
216

    
217
static inline void qemu_put_sbe64s(QEMUFile *f, const int64_t *pv)
218
{
219
    qemu_put_be64s(f, (const uint64_t *)pv);
220
}
221

    
222
static inline void qemu_get_s8s(QEMUFile *f, int8_t *pv)
223
{
224
    qemu_get_8s(f, (uint8_t *)pv);
225
}
226

    
227
static inline void qemu_get_sbe16s(QEMUFile *f, int16_t *pv)
228
{
229
    qemu_get_be16s(f, (uint16_t *)pv);
230
}
231

    
232
static inline void qemu_get_sbe32s(QEMUFile *f, int32_t *pv)
233
{
234
    qemu_get_be32s(f, (uint32_t *)pv);
235
}
236

    
237
static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
238
{
239
    qemu_get_be64s(f, (uint64_t *)pv);
240
}
241
#endif