2
0

qemu-file.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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. /* This function writes a chunk of data to a file at the given position.
  27. * The pos argument can be ignored if the file is only being used for
  28. * streaming. The handler should try to write all of the data it can.
  29. */
  30. typedef int (QEMUFilePutBufferFunc)(void *opaque, const uint8_t *buf,
  31. int64_t pos, int size);
  32. /* Read a chunk of data from a file at the given position. The pos argument
  33. * can be ignored if the file is only be used for streaming. The number of
  34. * bytes actually read should be returned.
  35. */
  36. typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
  37. int64_t pos, int size);
  38. /* Close a file
  39. *
  40. * Return negative error number on error, 0 or positive value on success.
  41. *
  42. * The meaning of return value on success depends on the specific back-end being
  43. * used.
  44. */
  45. typedef int (QEMUFileCloseFunc)(void *opaque);
  46. /* Called to determine if the file has exceeded its bandwidth allocation. The
  47. * bandwidth capping is a soft limit, not a hard limit.
  48. */
  49. typedef int (QEMUFileRateLimit)(void *opaque);
  50. /* Called to change the current bandwidth allocation. This function must return
  51. * the new actual bandwidth. It should be new_rate if everything goes ok, and
  52. * the old rate otherwise
  53. */
  54. typedef int64_t (QEMUFileSetRateLimit)(void *opaque, int64_t new_rate);
  55. typedef int64_t (QEMUFileGetRateLimit)(void *opaque);
  56. QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
  57. QEMUFileGetBufferFunc *get_buffer,
  58. QEMUFileCloseFunc *close,
  59. QEMUFileRateLimit *rate_limit,
  60. QEMUFileSetRateLimit *set_rate_limit,
  61. QEMUFileGetRateLimit *get_rate_limit);
  62. QEMUFile *qemu_fopen(const char *filename, const char *mode);
  63. QEMUFile *qemu_fdopen(int fd, const char *mode);
  64. QEMUFile *qemu_fopen_socket(int fd);
  65. QEMUFile *qemu_popen(FILE *popen_file, const char *mode);
  66. QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
  67. int qemu_stdio_fd(QEMUFile *f);
  68. void qemu_fflush(QEMUFile *f);
  69. int qemu_fclose(QEMUFile *f);
  70. void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
  71. void qemu_put_byte(QEMUFile *f, int v);
  72. static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
  73. {
  74. qemu_put_byte(f, (int)v);
  75. }
  76. #define qemu_put_sbyte qemu_put_byte
  77. void qemu_put_be16(QEMUFile *f, unsigned int v);
  78. void qemu_put_be32(QEMUFile *f, unsigned int v);
  79. void qemu_put_be64(QEMUFile *f, uint64_t v);
  80. int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
  81. int qemu_get_byte(QEMUFile *f);
  82. static inline unsigned int qemu_get_ubyte(QEMUFile *f)
  83. {
  84. return (unsigned int)qemu_get_byte(f);
  85. }
  86. #define qemu_get_sbyte qemu_get_byte
  87. unsigned int qemu_get_be16(QEMUFile *f);
  88. unsigned int qemu_get_be32(QEMUFile *f);
  89. uint64_t qemu_get_be64(QEMUFile *f);
  90. int qemu_file_rate_limit(QEMUFile *f);
  91. int64_t qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate);
  92. int64_t qemu_file_get_rate_limit(QEMUFile *f);
  93. int qemu_file_get_error(QEMUFile *f);
  94. void qemu_file_set_error(QEMUFile *f, int error);
  95. /* Try to send any outstanding data. This function is useful when output is
  96. * halted due to rate limiting or EAGAIN errors occur as it can be used to
  97. * resume output. */
  98. void qemu_file_put_notify(QEMUFile *f);
  99. static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
  100. {
  101. qemu_put_be64(f, *pv);
  102. }
  103. static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
  104. {
  105. qemu_put_be32(f, *pv);
  106. }
  107. static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
  108. {
  109. qemu_put_be16(f, *pv);
  110. }
  111. static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
  112. {
  113. qemu_put_byte(f, *pv);
  114. }
  115. static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
  116. {
  117. *pv = qemu_get_be64(f);
  118. }
  119. static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
  120. {
  121. *pv = qemu_get_be32(f);
  122. }
  123. static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
  124. {
  125. *pv = qemu_get_be16(f);
  126. }
  127. static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
  128. {
  129. *pv = qemu_get_byte(f);
  130. }
  131. // Signed versions for type safety
  132. static inline void qemu_put_sbuffer(QEMUFile *f, const int8_t *buf, int size)
  133. {
  134. qemu_put_buffer(f, (const uint8_t *)buf, size);
  135. }
  136. static inline void qemu_put_sbe16(QEMUFile *f, int v)
  137. {
  138. qemu_put_be16(f, (unsigned int)v);
  139. }
  140. static inline void qemu_put_sbe32(QEMUFile *f, int v)
  141. {
  142. qemu_put_be32(f, (unsigned int)v);
  143. }
  144. static inline void qemu_put_sbe64(QEMUFile *f, int64_t v)
  145. {
  146. qemu_put_be64(f, (uint64_t)v);
  147. }
  148. static inline size_t qemu_get_sbuffer(QEMUFile *f, int8_t *buf, int size)
  149. {
  150. return qemu_get_buffer(f, (uint8_t *)buf, size);
  151. }
  152. static inline int qemu_get_sbe16(QEMUFile *f)
  153. {
  154. return (int)qemu_get_be16(f);
  155. }
  156. static inline int qemu_get_sbe32(QEMUFile *f)
  157. {
  158. return (int)qemu_get_be32(f);
  159. }
  160. static inline int64_t qemu_get_sbe64(QEMUFile *f)
  161. {
  162. return (int64_t)qemu_get_be64(f);
  163. }
  164. static inline void qemu_put_s8s(QEMUFile *f, const int8_t *pv)
  165. {
  166. qemu_put_8s(f, (const uint8_t *)pv);
  167. }
  168. static inline void qemu_put_sbe16s(QEMUFile *f, const int16_t *pv)
  169. {
  170. qemu_put_be16s(f, (const uint16_t *)pv);
  171. }
  172. static inline void qemu_put_sbe32s(QEMUFile *f, const int32_t *pv)
  173. {
  174. qemu_put_be32s(f, (const uint32_t *)pv);
  175. }
  176. static inline void qemu_put_sbe64s(QEMUFile *f, const int64_t *pv)
  177. {
  178. qemu_put_be64s(f, (const uint64_t *)pv);
  179. }
  180. static inline void qemu_get_s8s(QEMUFile *f, int8_t *pv)
  181. {
  182. qemu_get_8s(f, (uint8_t *)pv);
  183. }
  184. static inline void qemu_get_sbe16s(QEMUFile *f, int16_t *pv)
  185. {
  186. qemu_get_be16s(f, (uint16_t *)pv);
  187. }
  188. static inline void qemu_get_sbe32s(QEMUFile *f, int32_t *pv)
  189. {
  190. qemu_get_be32s(f, (uint32_t *)pv);
  191. }
  192. static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
  193. {
  194. qemu_get_be64s(f, (uint64_t *)pv);
  195. }
  196. int64_t qemu_ftell(QEMUFile *f);
  197. int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence);
  198. #endif