void program_main(const argdata_t *ad) { // Extract executable file descriptor and argument data from sequence. argdata_seq_iterator_t it; argdata_seq_iterate(ad, &it); const argdata_t *fdv, *argv; int fd; if (!argdata_seq_next(&it, &fdv) || argdata_get_fd(fdv, &fd) != 0 || !argdata_seq_next(&it, &argv)) { static const char message[] = "Failed to parse argument data\n"; write(2, message, sizeof(message) - 1); _Exit(127); } // Execute the program. int error = program_exec(fd, argv); // Execution failed. Print error message without depending on stdio. static const char prefix[] = "Failed to start executable: "; struct iovec iov[3] = { {.iov_base = (char *)prefix, .iov_len = sizeof(prefix) - 1}, {.iov_base = strerror(error), .iov_len = strlen(iov[1].iov_base)},
int cmd_exec(int ac, char **av) { int handle=0; int pgmid=0; block_t buf_blk=0; int rc; block_t blk; int readbyte; unsigned long pos; //display_puts("cdfs_open\n"); handle = cdfs_open(av[0]); if(handle<0) { dsp_open_error(handle); goto EXITCMD; } //display_puts("cdfs_stat\n"); char infobuf[sizeof(struct file_info)+CDFS_FULLPATH_MAXLENGTH]; struct file_info *info=(void*)infobuf; rc = cdfs_stat(handle,info,sizeof(infobuf)); if(rc<0) { display_puts("rc="); sint2dec(rc,s); display_puts(s); goto EXITCMD; } //display_puts("block_init\n"); blk = block_init(BLOCK_SHM_ID); if(blk==0) { display_puts("error:block_init\n"); goto EXITCMD; } //display_puts("block_alloc\n"); buf_blk = block_alloc(blk); if(buf_blk==0) { display_puts("error:block_alloc\n"); goto EXITCMD; } char *buf=block_addr(blk,buf_blk); char *pgname = get_filename(av[0]); //display_puts("pgm_alloc\n"); pgmid = environment_allocimage(pgname,info->size); if(pgmid<0) { display_puts("rc="); sint2dec(pgmid,s); display_puts(s); goto EXITCMD; } //display_puts("size="); //sint2dec(info->size,s); //display_puts(s); //display_puts("\n"); //display_puts("cdfs_read\n"); pos=0; for(;;) { readbyte=cdfs_read(handle,pos,BLOCK_SHM_ID,buf_blk,BLOCK_SIZE); if(readbyte<0) { break; } //display_puts(" readbyte="); //sint2dec(readbyte,s); //display_puts(s); rc=environment_loadimage(pgmid,buf,readbyte); if(rc<0) { display_puts(" loadimage rc="); sint2dec(rc,s); display_puts(s); goto EXITCMD; } pos += readbyte; } rc = program_exec(pgmid,ac, av); if(rc<0) { goto EXITCMD; } int exitcode; program_wait(&exitcode, MESSAGE_MODE_WAIT); EXITCMD: if(handle>0) { //display_puts("cdfs_close\n"); rc = cdfs_close(handle); if(rc<0) { display_puts("rc="); sint2dec(rc,s); display_puts(s); } } if(buf_blk) { block_free(blk,buf_blk); } //display_puts("\n"); //syscall_wait(10); //dump(buf); return 0; }