コード例 #1
0
int
open_dump(const char *fn)
{
    int result = 0;
    close_dump();
    if ((dumpfp = fopen(fn, "a")) != 0)
	result = 1;
    return result;
}
コード例 #2
0
ファイル: samrdumps.c プロジェクト: BackupTheBerlios/samqfs
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);
}