X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=savevm.c;h=248aea3edfa1cd1ff32197db94b355273594a9bf;hb=HEAD;hp=ce12628084a9eb765b0cc096b488271b5ea2515d;hpb=3450df304d6f6ad279a8c9ae98984898ea737a44;p=qemu diff --git a/savevm.c b/savevm.c index ce12628..248aea3 100644 --- a/savevm.c +++ b/savevm.c @@ -107,31 +107,46 @@ static int announce_self_create(uint8_t *buf, /* FIXME: should we send a different packet (arp/rarp/ping)? */ + memset(buf, 0, 64); memset(buf, 0xff, 6); /* h_dst */ memcpy(buf + 6, mac_addr, 6); /* h_src */ memcpy(buf + 12, &proto, 2); /* h_proto */ memcpy(buf + 14, &magic, 4); /* magic */ - return 18; /* len */ + return 64; /* len */ } -void qemu_announce_self(void) +static void qemu_announce_self_once(void *opaque) { - int i, j, len; + int i, len; VLANState *vlan; VLANClientState *vc; uint8_t buf[256]; + static int count = SELF_ANNOUNCE_ROUNDS; + QEMUTimer *timer = *(QEMUTimer **)opaque; for (i = 0; i < MAX_NICS; i++) { if (!nd_table[i].used) continue; len = announce_self_create(buf, nd_table[i].macaddr); vlan = nd_table[i].vlan; - for(vc = vlan->first_client; vc != NULL; vc = vc->next) { - for (j=0; j < SELF_ANNOUNCE_ROUNDS; j++) - vc->fd_read(vc->opaque, buf, len); + for(vc = vlan->first_client; vc != NULL; vc = vc->next) { + vc->fd_read(vc->opaque, buf, len); } } + if (count--) { + qemu_mod_timer(timer, qemu_get_clock(rt_clock) + 100); + } else { + qemu_del_timer(timer); + qemu_free_timer(timer); + } +} + +void qemu_announce_self(void) +{ + static QEMUTimer *timer; + timer = qemu_new_timer(rt_clock, qemu_announce_self_once, &timer); + qemu_announce_self_once(&timer); } /***********************************************************/ @@ -144,6 +159,7 @@ struct QEMUFile { QEMUFileGetBufferFunc *get_buffer; QEMUFileCloseFunc *close; QEMUFileRateLimit *rate_limit; + QEMUFileSetRateLimit *set_rate_limit; void *opaque; int is_write; @@ -224,11 +240,10 @@ QEMUFile *qemu_popen(FILE *popen_file, const char *mode) s->popen_file = popen_file; if(mode[0] == 'r') { - s->file = qemu_fopen_ops(s, NULL, popen_get_buffer, popen_close, NULL); + s->file = qemu_fopen_ops(s, NULL, popen_get_buffer, popen_close, NULL, NULL); } else { - s->file = qemu_fopen_ops(s, popen_put_buffer, NULL, popen_close, NULL); + s->file = qemu_fopen_ops(s, popen_put_buffer, NULL, popen_close, NULL, NULL); } - fprintf(stderr, "qemu_popen: returning result of qemu_fopen_ops\n"); return s->file; } @@ -244,12 +259,23 @@ QEMUFile *qemu_popen_cmd(const char *command, const char *mode) return qemu_popen(popen_file, mode); } +int qemu_popen_fd(QEMUFile *f) +{ + QEMUFilePopen *p; + int fd; + + p = (QEMUFilePopen *)f->opaque; + fd = fileno(p->popen_file); + + return fd; +} + QEMUFile *qemu_fopen_socket(int fd) { QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket)); s->fd = fd; - s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, NULL); + s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, NULL, NULL); return s->file; } @@ -293,9 +319,9 @@ QEMUFile *qemu_fopen(const char *filename, const char *mode) goto fail; if (!strcmp(mode, "wb")) - return qemu_fopen_ops(s, file_put_buffer, NULL, file_close, NULL); + return qemu_fopen_ops(s, file_put_buffer, NULL, file_close, NULL, NULL); else if (!strcmp(mode, "rb")) - return qemu_fopen_ops(s, NULL, file_get_buffer, file_close, NULL); + return qemu_fopen_ops(s, NULL, file_get_buffer, file_close, NULL, NULL); fail: if (s->outfile) @@ -310,18 +336,18 @@ typedef struct QEMUFileBdrv int64_t base_offset; } QEMUFileBdrv; -static int bdrv_put_buffer(void *opaque, const uint8_t *buf, +static int block_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size) { QEMUFileBdrv *s = opaque; - bdrv_pwrite(s->bs, s->base_offset + pos, buf, size); + bdrv_put_buffer(s->bs, buf, s->base_offset + pos, size); return size; } -static int bdrv_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size) +static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size) { QEMUFileBdrv *s = opaque; - return bdrv_pread(s->bs, s->base_offset + pos, buf, size); + return bdrv_get_buffer(s->bs, buf, s->base_offset + pos, size); } static int bdrv_fclose(void *opaque) @@ -341,15 +367,16 @@ static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_wr s->base_offset = offset; if (is_writable) - return qemu_fopen_ops(s, bdrv_put_buffer, NULL, bdrv_fclose, NULL); + return qemu_fopen_ops(s, block_put_buffer, NULL, bdrv_fclose, NULL, NULL); - return qemu_fopen_ops(s, NULL, bdrv_get_buffer, bdrv_fclose, NULL); + return qemu_fopen_ops(s, NULL, block_get_buffer, bdrv_fclose, NULL, NULL); } QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, QEMUFileGetBufferFunc *get_buffer, QEMUFileCloseFunc *close, - QEMUFileRateLimit *rate_limit) + QEMUFileRateLimit *rate_limit, + QEMUFileSetRateLimit *set_rate_limit) { QEMUFile *f; @@ -360,6 +387,7 @@ QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, f->get_buffer = get_buffer; f->close = close; f->rate_limit = rate_limit; + f->set_rate_limit = set_rate_limit; f->is_write = 0; return f; @@ -370,6 +398,11 @@ int qemu_file_has_error(QEMUFile *f) return f->has_error; } +void qemu_file_set_error(QEMUFile *f) +{ + f->has_error = 1; +} + void qemu_fflush(QEMUFile *f) { if (!f->put_buffer) @@ -532,6 +565,14 @@ int qemu_file_rate_limit(QEMUFile *f) return 0; } +size_t qemu_file_set_rate_limit(QEMUFile *f, size_t new_rate) +{ + if (f->set_rate_limit) + return f->set_rate_limit(f->opaque, new_rate); + + return 0; +} + void qemu_put_be16(QEMUFile *f, unsigned int v) { qemu_put_byte(f, v >> 8); @@ -642,6 +683,22 @@ int register_savevm(const char *idstr, NULL, save_state, load_state, opaque); } +void unregister_savevm(const char *idstr, void *opaque) +{ + SaveStateEntry **pse; + + pse = &first_se; + while (*pse != NULL) { + if (strcmp((*pse)->idstr, idstr) == 0 && (*pse)->opaque == opaque) { + SaveStateEntry *next = (*pse)->next; + qemu_free(*pse); + *pse = next; + continue; + } + pse = &(*pse)->next; + } +} + #define QEMU_VM_FILE_MAGIC 0x5145564d #define QEMU_VM_FILE_VERSION_COMPAT 0x00000002 #define QEMU_VM_FILE_VERSION 0x00000003 @@ -834,6 +891,7 @@ static int qemu_loadvm_state_v2(QEMUFile *f) if (ret < 0) { fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n", instance_id, idstr); + return ret; } } /* always seek to exact end of record */