Statistics
| Branch: | Revision:

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

History | View | Annotate | Download (6.6 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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