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)},
Exemple #2
0
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;
}