/*
* Amanda, The Advanced Maryland Automatic Network Disk Archiver
* Copyright (c) 1991-1998 University of Maryland at College Park
* Copyright (c) 2007-2012 Zmanda, Inc. All Rights Reserved.
* Copyright (c) 2013-2016 Carbonite, Inc. All Rights Reserved.
* All Rights Reserved.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of U.M. not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. U.M. makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Authors: the Amanda Development Team. Its members are listed in a
* file named AUTHORS, in the root directory of this distribution.
*/
/*
* $Id: holding.h,v 1.23 2006/05/25 01:47:20 johnfranks Exp $
*
* Terminology:
*
* Holding disk: a top-level directory given in amanda.conf
* Holding directory: a subdirectory of a holding disk, usually named by
* datestamp. These are not accessible through this API.
* Holding file: one or more os-level files in a holding directory, together
* representing a single dump
* Holding file chunks: the individual os-level files (continuations) of
* a holding file.
*
* Example:
*
* /data/holding <-- holding disk
* /data/holding/20070306123456 <-- holding dir
* /data/holding/20070306123456/videoserver._video_a <-- holding file,
holding file chunk
* /data/holding/20070306123456/videoserver._video_a.1 <-- holding file chunk
*
*/
#ifndef HOLDING_H
#define HOLDING_H
#include "amanda.h"
#include "fileheader.h"
/* Get a list of holding disks. This is equivalent to
* getconf_holdingdisks() with holdingdisk_get_diskdir().
*
* @returns: newly allocated GSList of matching disks
*/
GSList *
holding_get_disks(void);
/* Get a list of holding files, optionally limited to a single holding
* directory. Can return a list either of full pathnames or of
* bare file names.
*
* @param hdir: holding directory to enumerate, or NULL for all
* @param fullpaths: if true, return full pathnames
* @returns: newly allocated GSList of matching files
*/
GSList *
holding_get_files(char *hdir,
int fullpaths,
int take_pid_lock);
/* Get a list of holding files chunks in the given holding
* file. Always returns full paths.
*
* @param hfile: holding file to enumerate
* @returns: newly allocated GSList of matching holding file chunks
*/
GSList *
holding_get_file_chunks(char *hfile);
/* Get a list of holding files that should be flushed, optionally
* matching only certain datestamps. This function does *not*
* match the dumps against the disklist.
*
* @param dateargs: GSList of datestamps expressions to dump, or NULL
* for all
* @returns: a newly allocated GSList listing all matching holding
* files
*/
GSList *
holding_get_files_for_flush(GSList *dateargs);
/* Get a list of all datestamps for which dumps are in the holding
* disk. This scans all dumps and takes the union of their
* datestamps (some/all of which may actually be timestamps,
* depending on the setting of config option usetimestamps)
*
* @returns: a newly allocated GSList listing all datestamps
*/
GSList *
holding_get_all_datestamps(void);
/* Get the total size of a holding file, including all holding
* file chunks, in kilobytes.
*
* @param holding_file: full pathname of holding file
* @param strip_headers: if true, don't count the headers in the
* total size
* @returns: total size in kbytes of the holding file, or -1 in an error
*/
off_t
holding_file_size(char *holding_file,
int strip_headers);
/* Unlink a holding file, including all holding file chunks.
*
* @param holding_file: full pathname of holding file
* @returns: 1 on success, else 0
*/
int
holding_file_unlink(char *holding_file);
/* Given a pathname of a holding file, read the file header.
* the result parameter may be altered even if an error is
* returned.
*
* @param fname: full pathname of holding file
* @param file: (result) dumpfile_t structure
* @returns: 1 on success, else 0
*/
int
holding_file_get_dumpfile(char *fname,
dumpfile_t *file);
/*
* Maintenance
*/
/* Clean up all holding disks, restoring from a possible crash or
* other errors. This function is intentionally opaque, as the
* details of holding disk are hidden from other applications.
*
* All error and warning messages go to the debug log.
*
* @param corrupt_dle: function that is called for any DLEs for
* which corrupt dumps are found.
* @param verbose_output: if non-NULL, send progress messages to
* this file.
*/
typedef void (*corrupt_dle_fn)(char *hostname, char *disk);
void
holding_cleanup(corrupt_dle_fn corrupt_dle,
FILE *verbose_output);
/*
* application-specific support
*/
/* Set the orig_size in the header
*
* @param holding_file: full pathname of holding file.
* @param orig_size: the size.
*/
void
holding_set_from_driver(char *holding_file, off_t orig_size,
crc_t native_crc, crc_t client_crc,
crc_t server_crc);
/* Rename holding files from the temporary names used during
* creation.
*
* This is currently called by driver.c, but will disappear when
* holding is fully converted to the device API
*
* @param holding_file: full pathname of holding file,
* without '.tmp'
* @param complete: if 0, set 'is_partial' to 1 in each file
* @returns: 1 on success, else 0
*/
int
rename_tmp_holding(char *holding_file,
int complete);
/* Set up a holding directory and do basic permission
* checks on it
*
* @param diskdir: holding directory to set up
* @returns: 1 on success, else 0
*/
int
mkholdingdir(char *diskdir);
#endif /* HOLDING_H */