Commit 5905b2e5fd051b046bf531c9b251fd6559145497
1 parent
7e2515e8
password input support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1035 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
87 additions
and
36 deletions
vl.c
... | ... | @@ -982,6 +982,12 @@ void qemu_chr_printf(CharDriverState *s, const char *fmt, ...) |
982 | 982 | va_end(ap); |
983 | 983 | } |
984 | 984 | |
985 | +void qemu_chr_send_event(CharDriverState *s, int event) | |
986 | +{ | |
987 | + if (s->chr_send_event) | |
988 | + s->chr_send_event(s, event); | |
989 | +} | |
990 | + | |
985 | 991 | void qemu_chr_add_read_handler(CharDriverState *s, |
986 | 992 | IOCanRWHandler *fd_can_read, |
987 | 993 | IOReadHandler *fd_read, void *opaque) |
... | ... | @@ -2179,7 +2185,7 @@ static void main_cpu_reset(void *opaque) |
2179 | 2185 | #endif |
2180 | 2186 | } |
2181 | 2187 | |
2182 | -int main_loop(void) | |
2188 | +void main_loop_wait(int timeout) | |
2183 | 2189 | { |
2184 | 2190 | #ifndef _WIN32 |
2185 | 2191 | struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf; |
... | ... | @@ -2187,39 +2193,12 @@ int main_loop(void) |
2187 | 2193 | uint8_t buf[4096]; |
2188 | 2194 | int n, max_size; |
2189 | 2195 | #endif |
2190 | - int ret, timeout; | |
2191 | - CPUState *env = global_env; | |
2192 | - | |
2193 | - for(;;) { | |
2194 | - if (vm_running) { | |
2195 | - ret = cpu_exec(env); | |
2196 | - if (shutdown_requested) { | |
2197 | - ret = EXCP_INTERRUPT; | |
2198 | - break; | |
2199 | - } | |
2200 | - if (reset_requested) { | |
2201 | - reset_requested = 0; | |
2202 | - qemu_system_reset(); | |
2203 | - ret = EXCP_INTERRUPT; | |
2204 | - } | |
2205 | - if (ret == EXCP_DEBUG) { | |
2206 | - vm_stop(EXCP_DEBUG); | |
2207 | - } | |
2208 | - /* if hlt instruction, we wait until the next IRQ */ | |
2209 | - /* XXX: use timeout computed from timers */ | |
2210 | - if (ret == EXCP_HLT) | |
2211 | - timeout = 10; | |
2212 | - else | |
2213 | - timeout = 0; | |
2214 | - } else { | |
2215 | - timeout = 10; | |
2216 | - } | |
2196 | + int ret; | |
2217 | 2197 | |
2218 | 2198 | #ifdef _WIN32 |
2219 | 2199 | if (timeout > 0) |
2220 | 2200 | Sleep(timeout); |
2221 | 2201 | #else |
2222 | - | |
2223 | 2202 | /* poll any events */ |
2224 | 2203 | /* XXX: separate device handlers from system ones */ |
2225 | 2204 | pf = ufds; |
... | ... | @@ -2269,7 +2248,7 @@ int main_loop(void) |
2269 | 2248 | } |
2270 | 2249 | } |
2271 | 2250 | } |
2272 | - | |
2251 | +#endif /* !defined(_WIN32) */ | |
2273 | 2252 | #if defined(CONFIG_SLIRP) |
2274 | 2253 | /* XXX: merge with poll() */ |
2275 | 2254 | if (slirp_inited) { |
... | ... | @@ -2291,8 +2270,6 @@ int main_loop(void) |
2291 | 2270 | } |
2292 | 2271 | #endif |
2293 | 2272 | |
2294 | -#endif | |
2295 | - | |
2296 | 2273 | if (vm_running) { |
2297 | 2274 | qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL], |
2298 | 2275 | qemu_get_clock(vm_clock)); |
... | ... | @@ -2309,6 +2286,38 @@ int main_loop(void) |
2309 | 2286 | /* real time timers */ |
2310 | 2287 | qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME], |
2311 | 2288 | qemu_get_clock(rt_clock)); |
2289 | +} | |
2290 | + | |
2291 | +int main_loop(void) | |
2292 | +{ | |
2293 | + int ret, timeout; | |
2294 | + CPUState *env = global_env; | |
2295 | + | |
2296 | + for(;;) { | |
2297 | + if (vm_running) { | |
2298 | + ret = cpu_exec(env); | |
2299 | + if (shutdown_requested) { | |
2300 | + ret = EXCP_INTERRUPT; | |
2301 | + break; | |
2302 | + } | |
2303 | + if (reset_requested) { | |
2304 | + reset_requested = 0; | |
2305 | + qemu_system_reset(); | |
2306 | + ret = EXCP_INTERRUPT; | |
2307 | + } | |
2308 | + if (ret == EXCP_DEBUG) { | |
2309 | + vm_stop(EXCP_DEBUG); | |
2310 | + } | |
2311 | + /* if hlt instruction, we wait until the next IRQ */ | |
2312 | + /* XXX: use timeout computed from timers */ | |
2313 | + if (ret == EXCP_HLT) | |
2314 | + timeout = 10; | |
2315 | + else | |
2316 | + timeout = 0; | |
2317 | + } else { | |
2318 | + timeout = 10; | |
2319 | + } | |
2320 | + main_loop_wait(timeout); | |
2312 | 2321 | } |
2313 | 2322 | cpu_disable_ticks(); |
2314 | 2323 | return ret; |
... | ... | @@ -2509,6 +2518,43 @@ static uint8_t *signal_stack; |
2509 | 2518 | |
2510 | 2519 | #endif |
2511 | 2520 | |
2521 | +/* password input */ | |
2522 | + | |
2523 | +static BlockDriverState *get_bdrv(int index) | |
2524 | +{ | |
2525 | + BlockDriverState *bs; | |
2526 | + | |
2527 | + if (index < 4) { | |
2528 | + bs = bs_table[index]; | |
2529 | + } else if (index < 6) { | |
2530 | + bs = fd_table[index - 4]; | |
2531 | + } else { | |
2532 | + bs = NULL; | |
2533 | + } | |
2534 | + return bs; | |
2535 | +} | |
2536 | + | |
2537 | +static void read_passwords(void) | |
2538 | +{ | |
2539 | + BlockDriverState *bs; | |
2540 | + int i, j; | |
2541 | + char password[256]; | |
2542 | + | |
2543 | + for(i = 0; i < 6; i++) { | |
2544 | + bs = get_bdrv(i); | |
2545 | + if (bs && bdrv_is_encrypted(bs)) { | |
2546 | + term_printf("%s is encrypted.\n", bdrv_get_device_name(bs)); | |
2547 | + for(j = 0; j < 3; j++) { | |
2548 | + monitor_readline("Password: ", | |
2549 | + 1, password, sizeof(password)); | |
2550 | + if (bdrv_set_key(bs, password) == 0) | |
2551 | + break; | |
2552 | + term_printf("invalid password\n"); | |
2553 | + } | |
2554 | + } | |
2555 | + } | |
2556 | +} | |
2557 | + | |
2512 | 2558 | #define NET_IF_TUN 0 |
2513 | 2559 | #define NET_IF_USER 1 |
2514 | 2560 | #define NET_IF_DUMMY 2 |
... | ... | @@ -2952,6 +2998,7 @@ int main(int argc, char **argv) |
2952 | 2998 | #endif |
2953 | 2999 | |
2954 | 3000 | /* we always create the cdrom drive, even if no disk is there */ |
3001 | + bdrv_init(); | |
2955 | 3002 | if (has_cdrom) { |
2956 | 3003 | bs_table[2] = bdrv_new("cdrom"); |
2957 | 3004 | bdrv_set_type_hint(bs_table[2], BDRV_TYPE_CDROM); |
... | ... | @@ -2966,7 +3013,7 @@ int main(int argc, char **argv) |
2966 | 3013 | bs_table[i] = bdrv_new(buf); |
2967 | 3014 | } |
2968 | 3015 | if (bdrv_open(bs_table[i], hd_filename[i], snapshot) < 0) { |
2969 | - fprintf(stderr, "qemu: could not open hard disk image '%s\n", | |
3016 | + fprintf(stderr, "qemu: could not open hard disk image '%s'\n", | |
2970 | 3017 | hd_filename[i]); |
2971 | 3018 | exit(1); |
2972 | 3019 | } |
... | ... | @@ -3106,13 +3153,17 @@ int main(int argc, char **argv) |
3106 | 3153 | } else { |
3107 | 3154 | printf("Waiting gdb connection on port %d\n", gdbstub_port); |
3108 | 3155 | } |
3156 | + term_init(); | |
3109 | 3157 | } else |
3110 | 3158 | #endif |
3111 | - if (start_emulation) | |
3112 | 3159 | { |
3113 | - vm_start(); | |
3160 | + term_init(); | |
3161 | + /* XXX: simplify init */ | |
3162 | + read_passwords(); | |
3163 | + if (start_emulation) { | |
3164 | + vm_start(); | |
3165 | + } | |
3114 | 3166 | } |
3115 | - term_init(); | |
3116 | 3167 | main_loop(); |
3117 | 3168 | quit_timers(); |
3118 | 3169 | return 0; | ... | ... |