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; }
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); }
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); }
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; }
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; }
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; }