static void handle_sigtrap(struct child *son) { long scno, ret; const char *scname; /* We get this event twice, one at entering a * system call and one at exiting a system * call. */ if (son->insyscall) { if (!pink_util_get_return(son->pid, &ret)) err(1, "pink_util_get_return"); if (son->inexecve) { son->inexecve = false; if (ret == 0) { /* execve was successful */ /* Update bitness */ son->bitness = pink_bitness_get(son->pid); if (son->bitness == PINK_BITNESS_UNKNOWN) err(1, "pink_bitness_get"); printf(" = 0 (Updating the bitness of child %i to %s mode)\n", son->pid, pink_bitness_name(son->bitness)); son->printret = false; return; } } son->insyscall = false; if (!son->printret) { son->printret = true; return; } /* Exiting the system call, print the * return value. */ putchar(' '); print_ret(ret); putchar('\n'); } else { son->insyscall = true; /* Get the system call number and call * the appropriate decoder. */ if (!pink_util_get_syscall(son->pid, son->bitness, &scno)) err(1, "pink_util_get_syscall"); scname = pink_name_syscall(scno, son->bitness); assert(scname != NULL); if (!strcmp(scname, "execve")) son->inexecve = true; if (!strcmp(scname, "open")) decode_open(son->pid, son->bitness); else if (!strcmp(scname, "execve")) decode_execve(son->pid, son->bitness); else if (!strcmp(scname, "bind") || !strcmp(scname, "connect")) decode_socketcall(son->pid, son->bitness, scname); else printf("%s()", scname); } }
static void handle_syscall(struct child *son) { long scno; const char *scname; /* We get this event twice, one at entering a * system call and one at exiting a system * call. */ if (son->insyscall) { /* Exiting the system call, print the * return value. */ son->insyscall = false; putchar(' '); print_ret(son->pid); putchar('\n'); } else { /* Get the system call number and call * the appropriate decoder. */ son->insyscall = true; if (!pink_util_get_syscall(son->pid, son->bitness, &scno)) { perror("pink_util_get_syscall"); return; } scname = pink_name_syscall(scno, son->bitness); if (!scname) printf("%ld()", scno); else if (!strcmp(scname, "open")) decode_open(son->pid, son->bitness); else if (!strcmp(scname, "execve")) decode_execve(son->pid, son->bitness); else if (!strcmp(scname, "socketcall") || !strcmp(scname, "bind") || !strcmp(scname, "connect")) decode_socketcall(son->pid, son->bitness, scname); else printf("%s()", scname); } }
int main(int argc, char *argv[]) { int ret; const char *url; struct sound_file_info *file; struct decode *dec; struct fifo *fifo; pthread_t tid; struct load_thread_arg arg; u8 *lrc; u8 *icon; size_t lrc_size; size_t icon_size; u8 mp3_buff[MP3_BUFF_SIZE]; u8 raw_buff[RAW_BUFF_SIZE]; int mp3_size, raw_size; struct mp3_param mp3_pm; struct audio_output *out; struct window_info *win_info; if (argc < 2) { fprintf(stderr, "Usage: %s PATH\n", argv[0]); return -EINVAL; } url = argv[1]; file = sound_file_open(url); if (NULL == file) { fprintf(stderr, "Fail to open sound file \"%s\"!\n", url); return -ENODEV; } fifo = fifo_open(); if (NULL == fifo) { goto L1; ret = -ENOMEM; } ret = parse_mp3_tag(file, &lrc, &lrc_size, &icon, &icon_size); if (ret < 0) { DPRINT("\n"); goto L2; } DPRINT("mp3_start = %lu, mp3_end = %lu, " "lrc = %p, lrc_size = %lu, icon = %p, icon_size = %lu\n", file->mp3_data_start, file->mp3_data_end, lrc, lrc_size, icon, icon_size); arg.fifo = fifo; arg.file = file; ret = pthread_create(&tid, NULL, load_mp3_data_to_fifo, &arg); if (ret < 0) { DPRINT("\n"); goto L2; } dec = decode_open(MPAUDEC); // fixme! if (NULL == dec) { ret = -ENODEV; goto L2; } while (fifo->used < fifo->size / 3) usleep(1000); mp3_size = fifo_read(fifo, mp3_buff, sizeof(mp3_buff)); get_mp3_param(dec, mp3_buff, mp3_size, &mp3_pm); win_info = window_init(); win_info->icon = icon; win_info->icon_size = icon_size; win_info->lrc = lrc; win_info->lrc_size = lrc_size; win_info->total.tv_sec = (file->mp3_data_end - file->mp3_data_start) * 8 / mp3_pm.bit_rate; win_info->total.tv_usec = (file->mp3_data_end - file->mp3_data_start) * 8 * 1000000 / mp3_pm.bit_rate % 1000000; win_info->param = &mp3_pm; DPRINT("rate = %d, channels = %d, bps = %d, bitrate = %d\n", mp3_pm.rate, mp3_pm.channels, mp3_pm.bits_per_sample, mp3_pm.bit_rate); out = open_audio(AUDIO_ALSA, &mp3_pm); if (NULL == out) { ret = -ENODEV; goto L3; } while (1) { if (file->mp3_data_end == file->offset && mp3_size == 0) break; if (mp3_size > 0) { ret = decode(dec, raw_buff, &raw_size, mp3_buff, mp3_size); mp3_size -= ret; memmove(mp3_buff, mp3_buff + ret, mp3_size); } play_frames(out, raw_buff, raw_size, &mp3_pm); ret = fifo_read(fifo, mp3_buff + mp3_size, sizeof(mp3_buff) - mp3_size); mp3_size += ret; } close_audio(out); window_destroy(); L3: decode_close(dec); L2: fifo_close(fifo); L1: sound_file_close(file); return ret; }