RcArchive
openResourceDB(int argc, char **argv)
{ RcArchive rc;
  char *xfile = NULL;
  int flags = (GD->bootsession ? RC_WRONLY|RC_CREATE|RC_TRUNC : RC_RDONLY);
  char tmp[MAXPATHLEN];
  int n;

  if ( !GD->bootsession && 
       (rc = rc_open_archive(GD->paths.executable, flags)) )
    return rc;
  
  for(n=0; n<argc-1; n++)
  { if ( argv[n][0] == '-' && argv[n][2] == EOS ) /* -? */
    { if ( GD->bootsession )
      { if ( argv[n][1] == 'o' )
	{ xfile = argv[n+1];
	  break; 
	}
      } else
      { if ( argv[n][1] == 'x' )
	{ xfile = argv[n+1];
	  break; 
	}
      }
    }
  }

  if ( xfile )
  { if ( !(rc = rc_open_archive(xfile, flags)) )
      fatalError("Could not open resource database \"%s\": %s",
		 xfile, OsError());

    return rc;
  }

  strcpy(tmp, GD->paths.executable);
  replace_extension(tmp, "prc");

  if ( (rc=rc_open_archive(tmp, flags)) )
    return rc;

  if ( systemDefaults.home )
  { strcpy(tmp, systemDefaults.home);
    strcat(tmp, "/");
    strcat(tmp, BOOTFILE);

    return rc_open_archive(tmp, flags);
  }

  return NULL;
}
Beispiel #2
0
static int
rcls(const char *archive, char **members)
{ RcArchive rca = rc_open_archive(archive, RC_RDONLY);
  RcMember m;

  if ( rca )
  { char *fmt  = "%8ld %-10s %-10s %-14s\n";
    char *sfmt = "%8s %-10s %-10s %-14s\n";

    printf(sfmt, "size", "class", "encoding", "name");

    for(m=rca->members; m; m = m->next)
    { if ( memberOfList(m->name, members) )
      { char *rcclass = m->rc_class ? m->rc_class : "data";
	char *enc     = m->encoding ? m->encoding : "none";

	printf(fmt, m->size, rcclass, enc, m->name);
      }
    }

    rc_close_archive(rca);
    return 0;
  }

  return badarchive(archive);
}
Beispiel #3
0
static int
rcextract(const char *archive, char **members)
{ RcArchive rca = rc_open_archive(archive, RC_RDONLY);
  RcMember m;

  if ( rca )
  { for(m=rca->members; m; m = m->next)
    { if ( memberOfList(m->name, members) )
      { FILE *fd = fopen(m->name, "wb");

	if ( fd )
	{ RcObject o = rc_open(rca, m->name, m->rc_class, RC_RDONLY);
	  char buf[8192];
	  size_t size = m->size;

	  while( size > 0 )
	  { ssize_t n = rc_read(o, buf, sizeof(buf));

	    if ( n > 0 )
	    { if ( fwrite(buf, sizeof(char), (size_t)n, fd) != (size_t)n )
	      { fclose(fd);
		error("Failure writing %s: %s", m->name, strerror(errno));
	      }
	      size -= n;
	    } else if ( n == 0 )
	    { error("Premature EOF on archive %s", m->name);
	      break;
	    } else
	    { error("Read error on archive %s", m->name);
	      break;
	    }
	  }

	  if ( size == 0 )
	    verbose("x %s\n", m->name);

	  fclose(fd);
	  rc_close(o);
	} else
	  error("Could not open %s: %s", m->name, strerror(errno));
      }
    }

    rc_close_archive(rca);
    return 0;
  }

  return badarchive(archive);
}
Beispiel #4
0
static int
rcadd(const char *archive, char **members)
{ RcArchive rca = rc_open_archive(archive, RC_RDWR|RC_CREATE);
  char *rcclass = "data";
  char *enc     = "none";
  size_t clen = strlen("--class=");
  size_t elen = strlen("--encoding=");

  if ( !rca )
    return badarchive(archive);

  if ( members )
  { for( ; *members; members++ )
    { char *m = *members;

      if ( strncmp(m, "--class=", clen) == 0 )
      { rcclass = m+clen;

	continue;
      }
      if ( strncmp(m, "--encoding=", elen) == 0 )
      { enc = m+elen;

	continue;
      }

      if ( !rc_append_file(rca, basename(m), rcclass, enc, m) )
	error("Could not add \"%s\": %s", m, rc_strerror(rc_errno));
      else
	verbose("a %s\n", m);
    }
  }

  if ( rca->modified )
  { if ( !rc_save_archive(rca, NULL) )
    { error("Failed to create \"%s\": %s", archive, rc_strerror(rc_errno));
      return 1;
    }
  }

  rc_close_archive(rca);

  return 0;
}
Beispiel #5
0
static int
rcdel(const char *archive, char **members)
{ RcArchive rca = rc_open_archive(archive, RC_RDWR|RC_CREATE);
  char *rcclass = "data";
  size_t clen = strlen("--class=");

  if ( !rca )
    return badarchive(archive);

  if ( members )
  { for( ; *members; members++ )
    { char *m = *members;

      if ( strncmp(m, "--class=", clen) == 0 )
      { rcclass = m+clen;

	continue;
      }

      if ( !rc_delete(rca, m, rcclass) )
	error("Could not delete \"%s\": %s", m, rc_strerror(rc_errno));
      else
	verbose("d %s\n", m);
    }
  }

  if ( rca->modified )
  { if ( !rc_save_archive(rca, NULL) )
    { error("Failed to create \"%s\": %s", archive, rc_strerror(rc_errno));
      return 1;
    }
  }

  rc_close_archive(rca);

  return 0;
}
Beispiel #6
0
int
PL_initialise(int argc, char **argv)
{ int n;
  bool compile = FALSE;
  const char *rcpath = "<none>";

  if ( GD->initialised )
    succeed;

  initAlloc();
  initPrologThreads();			/* initialise thread system */
  SinitStreams();

  GD->cmdline.os_argc = argc;
  GD->cmdline.os_argv = argv;

  initOs();				/* Initialise OS bindings */
  initDefaults();			/* Initialise global defaults */
  initPaths(argc, (const char**)argv);	/* fetch some useful paths */

  { GET_LD
#ifdef HAVE_SIGNAL
  setPrologFlagMask(PLFLAG_SIGNALS);	/* default: handle signals */
#endif

  if (    (GD->resourceDB = rc_open_archive(GD->paths.executable, RC_RDONLY))
#ifdef __WINDOWS__
       || (GD->resourceDB = rc_open_archive(GD->paths.module, RC_RDONLY))
#endif
     )
  { rcpath = ((RcArchive)GD->resourceDB)->path;
    initDefaultOptions();
  }

  if ( !GD->resourceDB ||
       !streq(GD->options.saveclass, "runtime") )
  { int done;
    argc--; argv++;

    if ( argc == 1 && giveVersionInfo(argv[0]) ) /* -help, -v, etc */
    { exit(0);
    }

    for(n=0; n<argc; n++)		/* need to check this first */
    { if ( streq(argv[n], "--" ) )	/* --: terminates argument list */
	break;
      if ( streq(argv[n], "-b" ) )	/* -b: boot compilation */
      { GD->bootsession = TRUE;
	break;
      }
    }

    DEBUG(1, if (GD->bootsession) Sdprintf("Boot session\n"););

    if ( !GD->resourceDB )
    { if ( !(GD->resourceDB = openResourceDB(argc, argv)) )
      { fatalError("Could not find system resources");
      }
      rcpath = ((RcArchive)GD->resourceDB)->path;

      initDefaultOptions();
    }

    if ( (done = parseCommandLineOptions(argc, argv, &compile)) < 0 )
    { usage();
      fail;
    }
    argc -= done;
    argv += done;
  }