FILE *zfopen(const char *file, const char *mode) { int flags = O_RDONLY; int plus = 0; int fd; while (*mode) { switch (*mode) { case 'r': flags = O_RDONLY; break; case 'w': flags = O_WRONLY | O_CREAT | O_TRUNC; break; case 'a': flags = O_WRONLY | O_CREAT | O_APPEND; break; case '+': plus = 1; break; } mode++; } if (plus) { flags = (flags & ~(O_RDONLY | O_WRONLY)) | O_RDWR; } fd = zopen(file, flags, 0666); if (fd < 0) return NULL; else return fdopen(fd, mode); }
int main(int argc, char **argv) { char buffer[1024]; FILE *in, *out; int result; int lineno; Opt_Parse(argc, argv, options, Opt_Number(options), 0); if (version) { printVersion(RcsId); exit(0); } in = zopen(inFile, "r"); if (in == NULL) { perror(inFile); exit(1); } out = zopen(outFile, "w"); if (out == NULL) { perror(outFile); exit(1); } lineno = 0; while ((numLines == 0 || lineno < numLines) && fgets(buffer, sizeof(buffer), in)) { fputs(buffer, out); lineno ++; } result = zclose(in); fprintf(stderr, "zclose(in) = %d\n", result); result = zclose(out); fprintf(stderr, "zclose(out) = %d\n", result); exit(0); }
int read_file (char *fname, long foff, char *datatype, long *nsamps, void **buf) { FILE *file; int n, size; size = atoi(&datatype[strlen(datatype)-1]); file = zopen (fname); if (file == NULL) { fprintf (stderr, "read_file: Unable to open '%s'\n", fname); return (0); } if (fseek(file, foff, 0) < 0) { fprintf (stderr, "read_file: fseek() error on '%s'\n", fname); fclose (file); return (0); } *buf = (void *) malloc (size*(*nsamps)); if (*buf == NULL) { fprintf (stderr, "read_file: Malloc error.\n"); fclose (file); return (0); } if ((n=fread (*buf, size, *nsamps, file)) < *nsamps) { if (n < 1) { fprintf (stderr, "read_file: fread() error on '%s'\n", fname); fclose (file); free (*buf); return (0); } else { fprintf (stderr, "read_file: Read %d samples but expected %d on '%s'\n", n, (int) (*nsamps), fname); *nsamps = n; } } fclose (file); return (1); }
static void decompress(const char *in, const char *out, int bits) { size_t nr; struct stat sb; FILE *ifp, *ofp; int exists, isreg, oreg; u_char buf[1024]; exists = !stat(out, &sb); if (!force && exists && S_ISREG(sb.st_mode) && !permission(out)) return; isreg = oreg = !exists || S_ISREG(sb.st_mode); ifp = ofp = NULL; if ((ifp = zopen(in, "r", bits)) == NULL) { cwarn("%s", in); return; } if (stat(in, &sb)) { cwarn("%s", in); goto err; } if (!S_ISREG(sb.st_mode)) isreg = 0; /* * Try to read the first few uncompressed bytes from the input file * before blindly truncating the output file. */ if ((nr = fread(buf, 1, sizeof(buf), ifp)) == 0) { cwarn("%s", in); (void)fclose(ifp); return; } if ((ofp = fopen(out, "w")) == NULL || (nr != 0 && fwrite(buf, 1, nr, ofp) != nr)) { cwarn("%s", out); (void)fclose(ifp); return; } while ((nr = fread(buf, 1, sizeof(buf), ifp)) != 0) if (fwrite(buf, 1, nr, ofp) != nr) { cwarn("%s", out); goto err; } if (ferror(ifp) || fclose(ifp)) { cwarn("%s", in); goto err; } ifp = NULL; if (fclose(ofp)) { cwarn("%s", out); goto err; } if (isreg) { setfile(out, &sb); if (unlink(in)) cwarn("%s", in); } return; err: if (ofp) { if (oreg) (void)unlink(out); (void)fclose(ofp); } if (ifp) (void)fclose(ifp); }
static void compress(const char *in, const char *out, int bits) { size_t nr; struct stat isb, sb; FILE *ifp, *ofp; int exists, isreg, oreg; u_char buf[1024]; exists = !stat(out, &sb); if (!force && exists && S_ISREG(sb.st_mode) && !permission(out)) return; isreg = oreg = !exists || S_ISREG(sb.st_mode); ifp = ofp = NULL; if ((ifp = fopen(in, "r")) == NULL) { cwarn("%s", in); return; } if (stat(in, &isb)) { /* DON'T FSTAT! */ cwarn("%s", in); goto err; } if (!S_ISREG(isb.st_mode)) isreg = 0; if ((ofp = zopen(out, "w", bits)) == NULL) { cwarn("%s", out); goto err; } while ((nr = fread(buf, 1, sizeof(buf), ifp)) != 0) if (fwrite(buf, 1, nr, ofp) != nr) { cwarn("%s", out); goto err; } if (ferror(ifp) || fclose(ifp)) { cwarn("%s", in); goto err; } ifp = NULL; if (fclose(ofp)) { cwarn("%s", out); goto err; } ofp = NULL; if (isreg) { if (stat(out, &sb)) { cwarn("%s", out); goto err; } if (!force && sb.st_size >= isb.st_size) { if (verbose) (void)fprintf(stderr, "%s: file would grow; left unmodified\n", in); eval = 2; if (unlink(out)) cwarn("%s", out); goto err; } setfile(out, &isb); if (unlink(in)) cwarn("%s", in); if (verbose) { (void)fprintf(stderr, "%s: ", out); if (isb.st_size > sb.st_size) (void)fprintf(stderr, "%.0f%% compression\n", ((float)sb.st_size / isb.st_size) * 100.0); else (void)fprintf(stderr, "%.0f%% expansion\n", ((float)isb.st_size / sb.st_size) * 100.0); } } return; err: if (ofp) { if (oreg) (void)unlink(out); (void)fclose(ofp); } if (ifp) (void)fclose(ifp); }
int file_open(const char *fname1, const char *fname2, const UINT32 crc, char *fname) { int found = 0, res = -1; struct zip_find_t file; char path[MAX_PATH]; file_close(); sprintf(path, "%s%c%s.zip", zip_dir, delimiter, fname1); if (zip_open(path, "rb") != -1) { if (zip_findfirst(&file)) { if (file.crc32 == crc) { found = 1; } else { while (zip_findnext(&file)) { if (file.crc32 == crc) { found = 1; break; } } } } if (!found) { if ((rom_fd = zopen(fname)) != -1) { file_close(); res = -2; } zip_close(); } } if (!found && fname2 != NULL) { sprintf(path, "%s%c%s.zip", zip_dir, delimiter, fname2); if (zip_open(path, "rb") != -1) { if (zip_findfirst(&file)) { if (file.crc32 == crc) { found = 2; } else { while (zip_findnext(&file)) { if (file.crc32 == crc) { found = 2; break; } } } } if (!found) { if ((rom_fd = zopen(fname)) != -1) { file_close(); res = -2; } zip_close(); } } } if (found) { if (fname) strcpy(fname, file.name); rom_fd = zopen(file.name); return rom_fd; } return res; }
static void DoFile(const char *savedir, const char *device) { static char *buf = NULL; struct partinfo dpart; struct kerneldumpheader kdhf, kdhl; off_t mediasize, dumpsize, firsthd, lasthd, dmpcnt; FILE *info, *fp, *fpkern; mode_t oumask; int fd, fdinfo, fdkernin, error, wl; int nr, nw, hs, he = 0; int bounds, status; u_int sectorsize; bounds = getbounds(); dmpcnt = 0; mediasize = 0; status = STATUS_UNKNOWN; if (buf == NULL) { buf = malloc(BUFFERSIZE); if (buf == NULL) { syslog(LOG_ERR, "%m"); return; } } if (verbose) printf("checking for kernel dump on device %s\n", device); fd = open(device, O_RDWR); if (fd < 0) { syslog(LOG_ERR, "%s: %m", device); return; } bzero(&dpart, sizeof(dpart)); error = ioctl(fd, DIOCGPART, &dpart); if (error) { syslog(LOG_ERR, "couldn't find media and/or sector size of %s: %m", device); goto closefd; } mediasize = dpart.media_size; sectorsize = dpart.media_blksize; if (verbose) { printf("mediasize = %lld\n", (long long)mediasize); printf("sectorsize = %u\n", sectorsize); } lasthd = mediasize - sectorsize; lseek(fd, lasthd, SEEK_SET); error = read(fd, &kdhl, sizeof kdhl); if (error != sizeof kdhl) { syslog(LOG_ERR, "error reading last dump header at offset %lld in %s: %m", (long long)lasthd, device); goto closefd; } if (memcmp(kdhl.magic, KERNELDUMPMAGIC, sizeof kdhl.magic)) { if (verbose) printf("magic mismatch on last dump header on %s\n", device); status = STATUS_BAD; if (force == 0) goto closefd; if (memcmp(kdhl.magic, KERNELDUMPMAGIC_CLEARED, sizeof kdhl.magic) == 0) { if (verbose) printf("forcing magic on %s\n", device); memcpy(kdhl.magic, KERNELDUMPMAGIC, sizeof kdhl.magic); } else { syslog(LOG_ERR, "unable to force dump - bad magic"); goto closefd; } } if (dtoh32(kdhl.version) != KERNELDUMPVERSION) { syslog(LOG_ERR, "unknown version (%d) in last dump header on %s", dtoh32(kdhl.version), device); status = STATUS_BAD; if (force == 0) goto closefd; } nfound++; if (clear) goto nuke; if (kerneldump_parity(&kdhl)) { syslog(LOG_ERR, "parity error on last dump header on %s", device); nerr++; status = STATUS_BAD; if (force == 0) goto closefd; } dumpsize = dtoh64(kdhl.dumplength); firsthd = lasthd - dumpsize - sizeof kdhf; lseek(fd, firsthd, SEEK_SET); error = read(fd, &kdhf, sizeof kdhf); if (error != sizeof kdhf) { syslog(LOG_ERR, "error reading first dump header at offset %lld in %s: %m", (long long)firsthd, device); nerr++; goto closefd; } if (verbose >= 2) { printf("First dump headers:\n"); printheader(stdout, &kdhf, device, bounds, -1); printf("\nLast dump headers:\n"); printheader(stdout, &kdhl, device, bounds, -1); printf("\n"); } if (memcmp(&kdhl, &kdhf, sizeof kdhl)) { syslog(LOG_ERR, "first and last dump headers disagree on %s", device); nerr++; status = STATUS_BAD; if (force == 0) goto closefd; } else { status = STATUS_GOOD; } if (checkfor) { printf("A dump exists on %s\n", device); close(fd); exit(0); } if (kdhl.panicstring[0]) syslog(LOG_ALERT, "reboot after panic: %s", kdhl.panicstring); else syslog(LOG_ALERT, "reboot"); if (verbose) printf("Checking for available free space\n"); if (!check_space(savedir, dumpsize)) { nerr++; goto closefd; } writebounds(bounds + 1); /* * Write kernel file. */ fdkernin = open(getbootfile(), O_RDONLY, 0); if (fdkernin < 0) { syslog(LOG_ERR, "%s: %m", getbootfile()); } if (compress) { sprintf(buf, "kern.%d.gz", bounds); fpkern = zopen(buf, "w"); } else { sprintf(buf, "kern.%d", bounds); fpkern = fopen(buf, "w"); } if (fpkern == NULL) { syslog(LOG_ERR, "%s: %m", buf); close(fdkernin); } syslog(LOG_NOTICE, "writing %skernel to %s", compress ? "compressed " : "", buf); while ((nr = read(fdkernin, buf, sizeof(buf))) > 0) { nw = fwrite(buf, 1, nr, fpkern); if (nw != nr) { syslog(LOG_ERR, "kern.%d: %m", bounds); syslog(LOG_WARNING, "WARNING: kernel may be incomplete"); exit(1); } } if (nr < 0) { syslog(LOG_ERR, "%s: %m", getbootfile()); syslog(LOG_WARNING, "WARNING: kernel may be incomplete"); exit(1); } fclose(fpkern); close(fdkernin); sprintf(buf, "info.%d", bounds); /* * Create or overwrite any existing dump header files. */ fdinfo = open(buf, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (fdinfo < 0) { syslog(LOG_ERR, "%s: %m", buf); nerr++; goto closefd; } oumask = umask(S_IRWXG|S_IRWXO); /* Restrict access to the core file.*/ if (compress) { sprintf(buf, "vmcore.%d.gz", bounds); fp = zopen(buf, "w"); } else { sprintf(buf, "vmcore.%d", bounds); fp = fopen(buf, "w"); } if (fp == NULL) { syslog(LOG_ERR, "%s: %m", buf); close(fdinfo); nerr++; goto closefd; } (void)umask(oumask); info = fdopen(fdinfo, "w"); if (info == NULL) { syslog(LOG_ERR, "fdopen failed: %m"); nerr++; goto closefd; } if (verbose) printheader(stdout, &kdhl, device, bounds, status); printheader(info, &kdhl, device, bounds, status); fclose(info); syslog(LOG_NOTICE, "writing %score to %s", compress ? "compressed " : "", buf); while (dumpsize > 0) { wl = BUFFERSIZE; if (wl > dumpsize) wl = dumpsize; nr = read(fd, buf, wl); if (nr != wl) { if (nr == 0) syslog(LOG_WARNING, "WARNING: EOF on dump device"); else syslog(LOG_ERR, "read error on %s: %m", device); nerr++; goto closeall; } if (compress) { nw = fwrite(buf, 1, wl, fp); } else { for (nw = 0; nw < nr; nw = he) { /* find a contiguous block of zeroes */ for (hs = nw; hs < nr; hs += BLOCKSIZE) { for (he = hs; he < nr && buf[he] == 0; ++he) /* nothing */ ; /* is the hole long enough to matter? */ if (he >= hs + BLOCKSIZE) break; } /* back down to a block boundary */ he &= BLOCKMASK; /* * 1) Don't go beyond the end of the buffer. * 2) If the end of the buffer is less than * BLOCKSIZE bytes away, we're at the end * of the file, so just grab what's left. */ if (hs + BLOCKSIZE > nr) hs = he = nr; /* * At this point, we have a partial ordering: * nw <= hs <= he <= nr * If hs > nw, buf[nw..hs] contains non-zero data. * If he > hs, buf[hs..he] is all zeroes. */ if (hs > nw) if (fwrite(buf + nw, hs - nw, 1, fp) != 1) break; if (he > hs) if (fseeko(fp, he - hs, SEEK_CUR) == -1) break; } } if (nw != wl) { syslog(LOG_ERR, "write error on vmcore.%d file: %m", bounds); syslog(LOG_WARNING, "WARNING: vmcore may be incomplete"); nerr++; goto closeall; } if (verbose) { dmpcnt += wl; printf("%llu\r", (unsigned long long)dmpcnt); fflush(stdout); } dumpsize -= wl; } if (verbose) printf("\n"); if (fclose(fp) < 0) { syslog(LOG_ERR, "error on vmcore.%d: %m", bounds); nerr++; goto closeall; } nsaved++; if (verbose) printf("dump saved\n"); nuke: if (clear || !keep) { if (verbose) printf("clearing dump header\n"); memcpy(kdhl.magic, KERNELDUMPMAGIC_CLEARED, sizeof kdhl.magic); lseek(fd, lasthd, SEEK_SET); error = write(fd, &kdhl, sizeof kdhl); if (error != sizeof kdhl) syslog(LOG_ERR, "error while clearing the dump header: %m"); } close(fd); return; closeall: fclose(fp); closefd: close(fd); }
int file_open(const char *fname1, const char *fname2, const u32 crc, char *fname) { int found = 0; struct zip_find_t file; char path[MAX_PATH]; sprintf(path, "%s/%s.zip", game_dir, fname1); if (zip_open(path) != -1) { if (zip_findfirst(&file)) { if (file.crc32 == crc) { found = 1; } else { while (zip_findnext(&file)) { if (file.crc32 == crc) { found = 1; break; } } } } if (!found) zip_close(); } if (!found && fname2 != NULL) { sprintf(path, "%s/%s.zip", game_dir, fname2); if (zip_open(path) != -1) { if (zip_findfirst(&file)) { if (file.crc32 == crc) { found = 1; } else { while (zip_findnext(&file)) { if (file.crc32 == crc) { found = 1; break; } } } } if (!found) zip_close(); } } if (found) { if (fname) strcpy(fname, file.name); rom_fd = zopen(file.name); return rom_fd; } return -1; }
static void DoFile(const char *savedir, const char *device) { xo_handle_t *xostdout, *xoinfo; static char infoname[PATH_MAX], corename[PATH_MAX], linkname[PATH_MAX]; static char *buf = NULL, *temp = NULL; struct kerneldumpheader kdhf, kdhl; off_t mediasize, dumpsize, firsthd, lasthd; FILE *info, *fp; mode_t oumask; int fd, fdinfo, error; int bounds, status; u_int sectorsize, xostyle; int istextdump; bounds = getbounds(); mediasize = 0; status = STATUS_UNKNOWN; xostdout = xo_create_to_file(stdout, XO_STYLE_TEXT, 0); if (xostdout == NULL) { syslog(LOG_ERR, "%s: %m", infoname); return; } if (maxdumps > 0 && bounds == maxdumps) bounds = 0; if (buf == NULL) { buf = malloc(BUFFERSIZE); if (buf == NULL) { syslog(LOG_ERR, "%m"); return; } } if (verbose) printf("checking for kernel dump on device %s\n", device); fd = open(device, (checkfor || keep) ? O_RDONLY : O_RDWR); if (fd < 0) { syslog(LOG_ERR, "%s: %m", device); return; } error = ioctl(fd, DIOCGMEDIASIZE, &mediasize); if (!error) error = ioctl(fd, DIOCGSECTORSIZE, §orsize); if (error) { syslog(LOG_ERR, "couldn't find media and/or sector size of %s: %m", device); goto closefd; } if (verbose) { printf("mediasize = %lld\n", (long long)mediasize); printf("sectorsize = %u\n", sectorsize); } if (sectorsize < sizeof(kdhl)) { syslog(LOG_ERR, "Sector size is less the kernel dump header %zu", sizeof(kdhl)); goto closefd; } lasthd = mediasize - sectorsize; if (temp == NULL) { temp = malloc(sectorsize); if (temp == NULL) { syslog(LOG_ERR, "%m"); return; } } if (lseek(fd, lasthd, SEEK_SET) != lasthd || read(fd, temp, sectorsize) != (ssize_t)sectorsize) { syslog(LOG_ERR, "error reading last dump header at offset %lld in %s: %m", (long long)lasthd, device); goto closefd; } memcpy(&kdhl, temp, sizeof(kdhl)); istextdump = 0; if (strncmp(kdhl.magic, TEXTDUMPMAGIC, sizeof kdhl) == 0) { if (verbose) printf("textdump magic on last dump header on %s\n", device); istextdump = 1; if (dtoh32(kdhl.version) != KERNELDUMP_TEXT_VERSION) { syslog(LOG_ERR, "unknown version (%d) in last dump header on %s", dtoh32(kdhl.version), device); status = STATUS_BAD; if (force == 0) goto closefd; } } else if (memcmp(kdhl.magic, KERNELDUMPMAGIC, sizeof kdhl.magic) == 0) { if (dtoh32(kdhl.version) != KERNELDUMPVERSION) { syslog(LOG_ERR, "unknown version (%d) in last dump header on %s", dtoh32(kdhl.version), device); status = STATUS_BAD; if (force == 0) goto closefd; } } else { if (verbose) printf("magic mismatch on last dump header on %s\n", device); status = STATUS_BAD; if (force == 0) goto closefd; if (memcmp(kdhl.magic, KERNELDUMPMAGIC_CLEARED, sizeof kdhl.magic) == 0) { if (verbose) printf("forcing magic on %s\n", device); memcpy(kdhl.magic, KERNELDUMPMAGIC, sizeof kdhl.magic); } else { syslog(LOG_ERR, "unable to force dump - bad magic"); goto closefd; } if (dtoh32(kdhl.version) != KERNELDUMPVERSION) { syslog(LOG_ERR, "unknown version (%d) in last dump header on %s", dtoh32(kdhl.version), device); status = STATUS_BAD; if (force == 0) goto closefd; } } nfound++; if (clear) goto nuke; if (kerneldump_parity(&kdhl)) { syslog(LOG_ERR, "parity error on last dump header on %s", device); nerr++; status = STATUS_BAD; if (force == 0) goto closefd; } dumpsize = dtoh64(kdhl.dumplength); firsthd = lasthd - dumpsize - sectorsize; if (lseek(fd, firsthd, SEEK_SET) != firsthd || read(fd, temp, sectorsize) != (ssize_t)sectorsize) { syslog(LOG_ERR, "error reading first dump header at offset %lld in %s: %m", (long long)firsthd, device); nerr++; goto closefd; } memcpy(&kdhf, temp, sizeof(kdhf)); if (verbose >= 2) { printf("First dump headers:\n"); printheader(xostdout, &kdhf, device, bounds, -1); printf("\nLast dump headers:\n"); printheader(xostdout, &kdhl, device, bounds, -1); printf("\n"); } if (memcmp(&kdhl, &kdhf, sizeof(kdhl))) { syslog(LOG_ERR, "first and last dump headers disagree on %s", device); nerr++; status = STATUS_BAD; if (force == 0) goto closefd; } else { status = STATUS_GOOD; } if (checkfor) { printf("A dump exists on %s\n", device); close(fd); exit(0); } if (kdhl.panicstring[0] != '\0') syslog(LOG_ALERT, "reboot after panic: %*s", (int)sizeof(kdhl.panicstring), kdhl.panicstring); else syslog(LOG_ALERT, "reboot"); if (verbose) printf("Checking for available free space\n"); if (!check_space(savedir, dumpsize, bounds)) { nerr++; goto closefd; } writebounds(bounds + 1); saved_dump_remove(bounds); snprintf(infoname, sizeof(infoname), "info.%d", bounds); /* * Create or overwrite any existing dump header files. */ fdinfo = open(infoname, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (fdinfo < 0) { syslog(LOG_ERR, "%s: %m", infoname); nerr++; goto closefd; } oumask = umask(S_IRWXG|S_IRWXO); /* Restrict access to the core file.*/ if (compress) { snprintf(corename, sizeof(corename), "%s.%d.gz", istextdump ? "textdump.tar" : "vmcore", bounds); fp = zopen(corename, "w"); } else { snprintf(corename, sizeof(corename), "%s.%d", istextdump ? "textdump.tar" : "vmcore", bounds); fp = fopen(corename, "w"); } if (fp == NULL) { syslog(LOG_ERR, "%s: %m", corename); close(fdinfo); nerr++; goto closefd; } (void)umask(oumask); info = fdopen(fdinfo, "w"); if (info == NULL) { syslog(LOG_ERR, "fdopen failed: %m"); nerr++; goto closeall; } xostyle = xo_get_style(NULL); xoinfo = xo_create_to_file(info, xostyle, 0); if (xoinfo == NULL) { syslog(LOG_ERR, "%s: %m", infoname); nerr++; goto closeall; } xo_open_container_h(xoinfo, "crashdump"); if (verbose) printheader(xostdout, &kdhl, device, bounds, status); printheader(xoinfo, &kdhl, device, bounds, status); xo_close_container_h(xoinfo, "crashdump"); xo_flush_h(xoinfo); xo_finish_h(xoinfo); fclose(info); syslog(LOG_NOTICE, "writing %score to %s/%s", compress ? "compressed " : "", savedir, corename); if (istextdump) { if (DoTextdumpFile(fd, dumpsize, lasthd, buf, device, corename, fp) < 0) goto closeall; } else { if (DoRegularFile(fd, dumpsize, buf, device, corename, fp) < 0) goto closeall; } if (verbose) printf("\n"); if (fclose(fp) < 0) { syslog(LOG_ERR, "error on %s: %m", corename); nerr++; goto closefd; } symlinks_remove(); if (symlink(infoname, "info.last") == -1) { syslog(LOG_WARNING, "unable to create symlink %s/%s: %m", savedir, "info.last"); } if (compress) { snprintf(linkname, sizeof(linkname), "%s.last.gz", istextdump ? "textdump.tar" : "vmcore"); } else { snprintf(linkname, sizeof(linkname), "%s.last", istextdump ? "textdump.tar" : "vmcore"); } if (symlink(corename, linkname) == -1) { syslog(LOG_WARNING, "unable to create symlink %s/%s: %m", savedir, linkname); } nsaved++; if (verbose) printf("dump saved\n"); nuke: if (!keep) { if (verbose) printf("clearing dump header\n"); memcpy(kdhl.magic, KERNELDUMPMAGIC_CLEARED, sizeof(kdhl.magic)); memcpy(temp, &kdhl, sizeof(kdhl)); if (lseek(fd, lasthd, SEEK_SET) != lasthd || write(fd, temp, sectorsize) != (ssize_t)sectorsize) syslog(LOG_ERR, "error while clearing the dump header: %m"); } xo_close_container_h(xostdout, "crashdump"); xo_finish_h(xostdout); close(fd); return; closeall: fclose(fp); closefd: close(fd); }
int neogeo_check_game(void) { FILE *fp; char fname[16], path[MAX_PATH], linebuf[128]; int i, fd, found = 0, NGH_number; neogeo_ngh = 0; hack_irq = 0; if (neogeo_boot_bios) { strcpy(game_name, games[99].name); game_index = 99; } else { strcpy(game_name, default_name); game_index = 0; sprintf(path, "%sIPL.TMP", launchDir); zip_open(game_dir); i = zlength("IPL.TXT"); if ((fd = zopen("IPL.TXT")) == -1) { zip_close(); return 0; } zread(fd, memory_region_cpu1, i); zclose(fd); zip_close(); if ((fp = fopen(path, "w")) == NULL) { return 0; } fwrite(memory_region_cpu1, 1, i, fp); fclose(fp); if ((fp = fopen(path, "r")) == NULL) { sceIoRemove(path); return 0; } while (fgets(linebuf, 127, fp)) { char *strfname = strtok(linebuf, ",\r\n"); char *strbank = strtok(NULL, ",\r\n"); char *stroffs = strtok(NULL, ",\r\n"); char *ext; int bank, offs; if (strfname == NULL || strbank == NULL || stroffs == NULL) break; sscanf(strbank, "%d", &bank); sscanf(stroffs, "%x", &offs); ext = strrchr(strfname, '.'); if (stricmp(ext, ".PRG") == 0 || stricmp(ext, ".ARG") == 0) { if (!bank && !offs) { strcpy(fname, strfname); found = 1; break; } } } fclose(fp); sceIoRemove(path); if (!found) return 0; zip_open(game_dir); if ((fd = zopen(fname)) == -1) { zip_close(); return 0; } zread(fd, memory_region_cpu1, 0x110); zclose(fd); zip_close(); swab(memory_region_cpu1, memory_region_cpu1, 0x110); memcpy(neogeo_game_vectors, memory_region_cpu1, 0x100); NGH_number = m68000_read_memory_16(0x108); for (i = 0; games[i].ngh_number; i++) { if (games[i].ngh_number == NGH_number) { game_index = i + 1; neogeo_ngh = NGH_number; strcpy(game_name, games[i].name); if (NGH_NUMBER(0x0243)) // lastbld2 hack_irq = 1; break; } } } neogeo_reset_driver_type(); return 1; }