Statistics
| Branch: | Revision:

root / include / migration / qemu-file.h @ be903b2a

History | View | Annotate | Download (6.7 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
/*
55
 * This function writes an iovec to file.
56
 */
57
typedef ssize_t (QEMUFileWritevBufferFunc)(void *opaque, struct iovec *iov,
58
                                           int iovcnt, int64_t pos);
59

    
60
typedef struct QEMUFileOps {
61
    QEMUFilePutBufferFunc *put_buffer;
62
    QEMUFileGetBufferFunc *get_buffer;
63
    QEMUFileCloseFunc *close;
64
    QEMUFileGetFD *get_fd;
65
    QEMUFileWritevBufferFunc *writev_buffer;
66
} QEMUFileOps;
67

    
68
QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops);
69
QEMUFile *qemu_fopen(const char *filename, const char *mode);
70
QEMUFile *qemu_fdopen(int fd, const char *mode);
71
QEMUFile *qemu_fopen_socket(int fd, const char *mode);
72
QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
73
int qemu_get_fd(QEMUFile *f);
74
int qemu_fclose(QEMUFile *f);
75
int64_t qemu_ftell(QEMUFile *f);
76
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
77
void qemu_put_byte(QEMUFile *f, int v);
78
/*
79
 * put_buffer without copying the buffer.
80
 * The buffer should be available till it is sent asynchronously.
81
 */
82
void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, int size);
83
bool qemu_file_mode_is_not_valid(const char *mode);
84

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

    
90
#define qemu_put_sbyte qemu_put_byte
91

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

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

    
104
#define qemu_get_sbyte qemu_get_byte
105

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

    
110
int qemu_file_rate_limit(QEMUFile *f);
111
void qemu_file_reset_rate_limit(QEMUFile *f);
112
void 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
void qemu_fflush(QEMUFile *f);
116

    
117
static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
118
{
119
    qemu_put_be64(f, *pv);
120
}
121

    
122
static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
123
{
124
    qemu_put_be32(f, *pv);
125
}
126

    
127
static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
128
{
129
    qemu_put_be16(f, *pv);
130
}
131

    
132
static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
133
{
134
    qemu_put_byte(f, *pv);
135
}
136

    
137
static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
138
{
139
    *pv = qemu_get_be64(f);
140
}
141

    
142
static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
143
{
144
    *pv = qemu_get_be32(f);
145
}
146

    
147
static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
148
{
149
    *pv = qemu_get_be16(f);
150
}
151

    
152
static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
153
{
154
    *pv = qemu_get_byte(f);
155
}
156

    
157
// Signed versions for type safety
158
static inline void qemu_put_sbuffer(QEMUFile *f, const int8_t *buf, int size)
159
{
160
    qemu_put_buffer(f, (const uint8_t *)buf, size);
161
}
162

    
163
static inline void qemu_put_sbe16(QEMUFile *f, int v)
164
{
165
    qemu_put_be16(f, (unsigned int)v);
166
}
167

    
168
static inline void qemu_put_sbe32(QEMUFile *f, int v)
169
{
170
    qemu_put_be32(f, (unsigned int)v);
171
}
172

    
173
static inline void qemu_put_sbe64(QEMUFile *f, int64_t v)
174
{
175
    qemu_put_be64(f, (uint64_t)v);
176
}
177

    
178
static inline size_t qemu_get_sbuffer(QEMUFile *f, int8_t *buf, int size)
179
{
180
    return qemu_get_buffer(f, (uint8_t *)buf, size);
181
}
182

    
183
static inline int qemu_get_sbe16(QEMUFile *f)
184
{
185
    return (int)qemu_get_be16(f);
186
}
187

    
188
static inline int qemu_get_sbe32(QEMUFile *f)
189
{
190
    return (int)qemu_get_be32(f);
191
}
192

    
193
static inline int64_t qemu_get_sbe64(QEMUFile *f)
194
{
195
    return (int64_t)qemu_get_be64(f);
196
}
197

    
198
static inline void qemu_put_s8s(QEMUFile *f, const int8_t *pv)
199
{
200
    qemu_put_8s(f, (const uint8_t *)pv);
201
}
202

    
203
static inline void qemu_put_sbe16s(QEMUFile *f, const int16_t *pv)
204
{
205
    qemu_put_be16s(f, (const uint16_t *)pv);
206
}
207

    
208
static inline void qemu_put_sbe32s(QEMUFile *f, const int32_t *pv)
209
{
210
    qemu_put_be32s(f, (const uint32_t *)pv);
211
}
212

    
213
static inline void qemu_put_sbe64s(QEMUFile *f, const int64_t *pv)
214
{
215
    qemu_put_be64s(f, (const uint64_t *)pv);
216
}
217

    
218
static inline void qemu_get_s8s(QEMUFile *f, int8_t *pv)
219
{
220
    qemu_get_8s(f, (uint8_t *)pv);
221
}
222

    
223
static inline void qemu_get_sbe16s(QEMUFile *f, int16_t *pv)
224
{
225
    qemu_get_be16s(f, (uint16_t *)pv);
226
}
227

    
228
static inline void qemu_get_sbe32s(QEMUFile *f, int32_t *pv)
229
{
230
    qemu_get_be32s(f, (uint32_t *)pv);
231
}
232

    
233
static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
234
{
235
    qemu_get_be64s(f, (uint64_t *)pv);
236
}
237
#endif