int open_dump(const char *fn) { int result = 0; close_dump(); if ((dumpfp = fopen(fn, "a")) != 0) result = 1; return result; }
int set_dump(char *fsname, char *dumpname, dumpspec_t *dsp) { char dumppath[MAXPATHLEN+1]; char dumpdir[MAXPATHLEN+1]; int rval; csd_hdrx_t hdr; char *dirp; char *namep; int fd; snapspec_t *snapArray = NULL; uint32_t count; int i; memset(dsp, 0, sizeof (dumpspec_t)); /* * If dumpname is not fully qualified, then prepend * the directory specified in the dump schedule. */ if (dumpname[0] == '/') { strlcpy(dumpdir, dumpname, sizeof (dumpdir)); dirp = dirname(dumpdir); namep = dumpdir + (strlen(dirp) + 1); } else { /* Find the dump-containing directory */ rval = getdumpdir(fsname, dumpdir); if (rval) { Trace(TR_MISC, "set_dump getdumpdir failure %s", samerrmsg); return (rval); } dirp = dumpdir; namep = dumpname; } rval = get_snap_name(dirp, namep, dumppath, NULL, NULL, NULL); if (rval != 0) { return (samrerr(SE_BAD_DUMP_FILE, dumpname)); } /* Use open64() as gzopen() can't handle very large files */ fd = open64(dumppath, O_RDONLY); if (fd < 0) { close_dump(dsp); Trace(TR_MISC, "set_dump opendmp %s failed.", dumppath); return (samrerr(SE_NOTAFILE, dumppath)); } dsp->fildmp = gzdopen(fd, "rb"); if (dsp->fildmp == NULL) { close_dump(dsp); Trace(TR_MISC, "set_dump opendmp %s failed.", dumppath); return (samrerr(SE_NOTAFILE, dumppath)); } /* Read dump file header to verify and determine byte endiannness */ rval = common_get_csd_header(dsp->fildmp, &dsp->byteswapped, &hdr); if (rval != 0) { close_dump(dsp); Trace(TR_MISC, "Corrupt dump file %s", dumppath); return (samrerr(SE_BAD_DUMP_FILE, dumppath)); } dsp->csdversion = hdr.csd_header.version; dsp->snaptime = hdr.csd_header.time; strlcat(dsp->fsname, fsname, sizeof (dsp->fsname)); /* find the index information */ rval = get_snapshot_status(fsname, &snapArray, &count); if (rval == 0) { snprintf(dsp->snapname, sizeof (dumpdir), "%s/%s", dirp, namep); for (i = 0; i < count; i++) { if (strcmp(dsp->snapname, snapArray[i].snapname) == 0) { if (snapArray[i].snapState == INDEXED) { dsp->numfiles = snapArray[i].numEntries; } else { rval = -1; } break; } } if (dsp->numfiles == 0) { rval = -1; } free(snapArray); } if (rval != 0) { close_dump(dsp); Trace(TR_MISC, "Corrupt dump file %s", dumppath); return (samrerr(SE_BAD_DUMP_FILE, dumppath)); } return (0); }