1*7917SReza.Sabdar@Sun.COM /* 2*7917SReza.Sabdar@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 3*7917SReza.Sabdar@Sun.COM * Use is subject to license terms. 4*7917SReza.Sabdar@Sun.COM */ 5*7917SReza.Sabdar@Sun.COM 6*7917SReza.Sabdar@Sun.COM /* 7*7917SReza.Sabdar@Sun.COM * BSD 3 Clause License 8*7917SReza.Sabdar@Sun.COM * 9*7917SReza.Sabdar@Sun.COM * Copyright (c) 2007, The Storage Networking Industry Association. 10*7917SReza.Sabdar@Sun.COM * 11*7917SReza.Sabdar@Sun.COM * Redistribution and use in source and binary forms, with or without 12*7917SReza.Sabdar@Sun.COM * modification, are permitted provided that the following conditions 13*7917SReza.Sabdar@Sun.COM * are met: 14*7917SReza.Sabdar@Sun.COM * - Redistributions of source code must retain the above copyright 15*7917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer. 16*7917SReza.Sabdar@Sun.COM * 17*7917SReza.Sabdar@Sun.COM * - Redistributions in binary form must reproduce the above copyright 18*7917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer in 19*7917SReza.Sabdar@Sun.COM * the documentation and/or other materials provided with the 20*7917SReza.Sabdar@Sun.COM * distribution. 21*7917SReza.Sabdar@Sun.COM * 22*7917SReza.Sabdar@Sun.COM * - Neither the name of The Storage Networking Industry Association (SNIA) 23*7917SReza.Sabdar@Sun.COM * nor the names of its contributors may be used to endorse or promote 24*7917SReza.Sabdar@Sun.COM * products derived from this software without specific prior written 25*7917SReza.Sabdar@Sun.COM * permission. 26*7917SReza.Sabdar@Sun.COM * 27*7917SReza.Sabdar@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 28*7917SReza.Sabdar@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29*7917SReza.Sabdar@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30*7917SReza.Sabdar@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 31*7917SReza.Sabdar@Sun.COM * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32*7917SReza.Sabdar@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33*7917SReza.Sabdar@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34*7917SReza.Sabdar@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35*7917SReza.Sabdar@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36*7917SReza.Sabdar@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37*7917SReza.Sabdar@Sun.COM * POSSIBILITY OF SUCH DAMAGE. 38*7917SReza.Sabdar@Sun.COM */ 39*7917SReza.Sabdar@Sun.COM /* 40*7917SReza.Sabdar@Sun.COM * This defines structures used to pass information between threads 41*7917SReza.Sabdar@Sun.COM * for both local-backup and NDMP. 42*7917SReza.Sabdar@Sun.COM * 43*7917SReza.Sabdar@Sun.COM */ 44*7917SReza.Sabdar@Sun.COM 45*7917SReza.Sabdar@Sun.COM #ifndef _TLM_BUFFERS_H_ 46*7917SReza.Sabdar@Sun.COM #define _TLM_BUFFERS_H_ 47*7917SReza.Sabdar@Sun.COM 48*7917SReza.Sabdar@Sun.COM #include <sys/types.h> 49*7917SReza.Sabdar@Sun.COM #include <stdlib.h> 50*7917SReza.Sabdar@Sun.COM #include <limits.h> 51*7917SReza.Sabdar@Sun.COM #include <sys/stat.h> 52*7917SReza.Sabdar@Sun.COM #include <thread.h> 53*7917SReza.Sabdar@Sun.COM #include "tlm.h" 54*7917SReza.Sabdar@Sun.COM 55*7917SReza.Sabdar@Sun.COM #ifndef RECORDSIZE 56*7917SReza.Sabdar@Sun.COM #define RECORDSIZE 512 57*7917SReza.Sabdar@Sun.COM #endif /* !RECORDSIZE */ 58*7917SReza.Sabdar@Sun.COM 59*7917SReza.Sabdar@Sun.COM #define DOTDOT_DIR ".." 60*7917SReza.Sabdar@Sun.COM #define IS_DOTDOT(s) (strcmp(s, DOTDOT_DIR) == 0) 61*7917SReza.Sabdar@Sun.COM #define SLASH '/' 62*7917SReza.Sabdar@Sun.COM 63*7917SReza.Sabdar@Sun.COM #define NDMP_MAX_SELECTIONS 64 64*7917SReza.Sabdar@Sun.COM 65*7917SReza.Sabdar@Sun.COM /* 66*7917SReza.Sabdar@Sun.COM * List of files/directories to be excluded from backup list. 67*7917SReza.Sabdar@Sun.COM */ 68*7917SReza.Sabdar@Sun.COM #define EXCL_PROC "/proc" 69*7917SReza.Sabdar@Sun.COM #define EXCL_TMP "/tmp" 70*7917SReza.Sabdar@Sun.COM 71*7917SReza.Sabdar@Sun.COM 72*7917SReza.Sabdar@Sun.COM typedef struct tlm_buffer { 73*7917SReza.Sabdar@Sun.COM char *tb_buffer_data; /* area to be used for I/O */ 74*7917SReza.Sabdar@Sun.COM long tb_buffer_size; /* number of valid bytes in the buffer */ 75*7917SReza.Sabdar@Sun.COM long tb_buffer_spot; /* current location in the I/O buffer */ 76*7917SReza.Sabdar@Sun.COM longlong_t tb_seek_spot; /* for BACKUP */ 77*7917SReza.Sabdar@Sun.COM /* where in the file this buffer stops. */ 78*7917SReza.Sabdar@Sun.COM /* this is used for the Multi Volume */ 79*7917SReza.Sabdar@Sun.COM /* Header record. */ 80*7917SReza.Sabdar@Sun.COM longlong_t tb_file_size; /* for BACKUP */ 81*7917SReza.Sabdar@Sun.COM /* how much of the file is left. */ 82*7917SReza.Sabdar@Sun.COM long tb_full : 1, 83*7917SReza.Sabdar@Sun.COM tb_eot : 1, 84*7917SReza.Sabdar@Sun.COM tb_eof : 1; 85*7917SReza.Sabdar@Sun.COM int tb_errno; /* I/O error values */ 86*7917SReza.Sabdar@Sun.COM } tlm_buffer_t; 87*7917SReza.Sabdar@Sun.COM 88*7917SReza.Sabdar@Sun.COM 89*7917SReza.Sabdar@Sun.COM /* 90*7917SReza.Sabdar@Sun.COM * Flags for tlm_buffers. 91*7917SReza.Sabdar@Sun.COM */ 92*7917SReza.Sabdar@Sun.COM #define TLM_BUF_IN_READY 0x00000001 93*7917SReza.Sabdar@Sun.COM #define TLM_BUF_OUT_READY 0x00000002 94*7917SReza.Sabdar@Sun.COM 95*7917SReza.Sabdar@Sun.COM typedef struct tlm_buffers { 96*7917SReza.Sabdar@Sun.COM int tbs_ref; /* number of threads using this */ 97*7917SReza.Sabdar@Sun.COM short tbs_buffer_in; /* buffer to be filled */ 98*7917SReza.Sabdar@Sun.COM short tbs_buffer_out; /* buffer to be emptied */ 99*7917SReza.Sabdar@Sun.COM /* these are indexes into tlm_buffers */ 100*7917SReza.Sabdar@Sun.COM mutex_t tbs_mtx; 101*7917SReza.Sabdar@Sun.COM cond_t tbs_in_cv; 102*7917SReza.Sabdar@Sun.COM cond_t tbs_out_cv; 103*7917SReza.Sabdar@Sun.COM uint32_t tbs_flags; 104*7917SReza.Sabdar@Sun.COM long tbs_data_transfer_size; /* max size of read/write buffer */ 105*7917SReza.Sabdar@Sun.COM longlong_t tbs_offset; 106*7917SReza.Sabdar@Sun.COM tlm_buffer_t tbs_buffer[TLM_TAPE_BUFFERS]; 107*7917SReza.Sabdar@Sun.COM } tlm_buffers_t; 108*7917SReza.Sabdar@Sun.COM 109*7917SReza.Sabdar@Sun.COM typedef struct tlm_cmd { 110*7917SReza.Sabdar@Sun.COM int tc_ref; /* number of threads using this */ 111*7917SReza.Sabdar@Sun.COM mutex_t tc_mtx; 112*7917SReza.Sabdar@Sun.COM cond_t tc_cv; 113*7917SReza.Sabdar@Sun.COM uint32_t tc_flags; 114*7917SReza.Sabdar@Sun.COM int tc_reader; /* writer to reader */ 115*7917SReza.Sabdar@Sun.COM int tc_writer; /* reader to writer */ 116*7917SReza.Sabdar@Sun.COM char tc_file_name[TLM_MAX_PATH_NAME]; /* name of last file */ 117*7917SReza.Sabdar@Sun.COM /* for restore */ 118*7917SReza.Sabdar@Sun.COM tlm_buffers_t *tc_buffers; /* reader-writer speedup buffers */ 119*7917SReza.Sabdar@Sun.COM } tlm_cmd_t; 120*7917SReza.Sabdar@Sun.COM 121*7917SReza.Sabdar@Sun.COM typedef struct tlm_commands { 122*7917SReza.Sabdar@Sun.COM int tcs_reader; /* commands to all readers */ 123*7917SReza.Sabdar@Sun.COM int tcs_writer; /* commands to all writers */ 124*7917SReza.Sabdar@Sun.COM int tcs_reader_count; /* number of active readers */ 125*7917SReza.Sabdar@Sun.COM int tcs_writer_count; /* number of active writers */ 126*7917SReza.Sabdar@Sun.COM int tcs_error; /* worker errors */ 127*7917SReza.Sabdar@Sun.COM char tcs_message[TLM_LINE_SIZE]; /* worker message back to user */ 128*7917SReza.Sabdar@Sun.COM tlm_cmd_t *tcs_command; /* IPC area between read-write */ 129*7917SReza.Sabdar@Sun.COM } tlm_commands_t; 130*7917SReza.Sabdar@Sun.COM 131*7917SReza.Sabdar@Sun.COM 132*7917SReza.Sabdar@Sun.COM typedef struct tlm_job_stats { 133*7917SReza.Sabdar@Sun.COM char js_job_name[TLM_MAX_BACKUP_JOB_NAME]; 134*7917SReza.Sabdar@Sun.COM longlong_t js_bytes_total; /* tape bytes in or out so far */ 135*7917SReza.Sabdar@Sun.COM longlong_t js_bytes_in_file; /* remaining data in a file */ 136*7917SReza.Sabdar@Sun.COM longlong_t js_files_so_far; /* files backed up so far */ 137*7917SReza.Sabdar@Sun.COM longlong_t js_files_total; /* number of files to be backed up */ 138*7917SReza.Sabdar@Sun.COM int js_errors; 139*7917SReza.Sabdar@Sun.COM time_t js_start_time; /* start time (GMT time) */ 140*7917SReza.Sabdar@Sun.COM time_t js_start_ltime; /* start time (local time) */ 141*7917SReza.Sabdar@Sun.COM time_t js_stop_time; /* stop time (local time) */ 142*7917SReza.Sabdar@Sun.COM time_t js_chkpnt_time; /* checkpoint creation (GMT time) */ 143*7917SReza.Sabdar@Sun.COM void *js_callbacks; 144*7917SReza.Sabdar@Sun.COM } tlm_job_stats_t; 145*7917SReza.Sabdar@Sun.COM 146*7917SReza.Sabdar@Sun.COM 147*7917SReza.Sabdar@Sun.COM struct full_dir_info { 148*7917SReza.Sabdar@Sun.COM fs_fhandle_t fd_dir_fh; 149*7917SReza.Sabdar@Sun.COM char fd_dir_name[TLM_MAX_PATH_NAME]; 150*7917SReza.Sabdar@Sun.COM }; 151*7917SReza.Sabdar@Sun.COM 152*7917SReza.Sabdar@Sun.COM /* 153*7917SReza.Sabdar@Sun.COM * For more info please refer to 154*7917SReza.Sabdar@Sun.COM * "Functional Specification Document: Usgin new LBR engine in NDMP", 155*7917SReza.Sabdar@Sun.COM * Revision: 0.2 156*7917SReza.Sabdar@Sun.COM * Document No.: 101438. 157*7917SReza.Sabdar@Sun.COM * the "File history of backup" section 158*7917SReza.Sabdar@Sun.COM */ 159*7917SReza.Sabdar@Sun.COM typedef struct lbr_fhlog_call_backs { 160*7917SReza.Sabdar@Sun.COM void *fh_cookie; 161*7917SReza.Sabdar@Sun.COM int (*fh_logpname)(); 162*7917SReza.Sabdar@Sun.COM int (*fh_log_dir)(); 163*7917SReza.Sabdar@Sun.COM int (*fh_log_node)(); 164*7917SReza.Sabdar@Sun.COM } lbr_fhlog_call_backs_t; 165*7917SReza.Sabdar@Sun.COM 166*7917SReza.Sabdar@Sun.COM 167*7917SReza.Sabdar@Sun.COM typedef struct bk_selector { 168*7917SReza.Sabdar@Sun.COM void *bs_cookie; 169*7917SReza.Sabdar@Sun.COM int bs_level; 170*7917SReza.Sabdar@Sun.COM int bs_ldate; 171*7917SReza.Sabdar@Sun.COM boolean_t (*bs_fn)(struct bk_selector *bks, struct stat64 *s); 172*7917SReza.Sabdar@Sun.COM } bk_selector_t; 173*7917SReza.Sabdar@Sun.COM 174*7917SReza.Sabdar@Sun.COM 175*7917SReza.Sabdar@Sun.COM /* 176*7917SReza.Sabdar@Sun.COM * Call back structure to create new name for objects at restore time. 177*7917SReza.Sabdar@Sun.COM */ 178*7917SReza.Sabdar@Sun.COM struct rs_name_maker; 179*7917SReza.Sabdar@Sun.COM typedef char *(*rsm_fp_t)(struct rs_name_maker *, 180*7917SReza.Sabdar@Sun.COM char *buf, 181*7917SReza.Sabdar@Sun.COM int pos, 182*7917SReza.Sabdar@Sun.COM char *path); 183*7917SReza.Sabdar@Sun.COM 184*7917SReza.Sabdar@Sun.COM struct rs_name_maker { 185*7917SReza.Sabdar@Sun.COM rsm_fp_t rn_fp; 186*7917SReza.Sabdar@Sun.COM void *rn_nlp; 187*7917SReza.Sabdar@Sun.COM }; 188*7917SReza.Sabdar@Sun.COM 189*7917SReza.Sabdar@Sun.COM 190*7917SReza.Sabdar@Sun.COM /* 191*7917SReza.Sabdar@Sun.COM * RSFLG_OVR_*: overwriting policies. Refer to LBR FSD for more info. 192*7917SReza.Sabdar@Sun.COM * RSFLG_MATCH_WCARD: should wildcards be supported in the selection list. 193*7917SReza.Sabdar@Sun.COM * RSFLG_IGNORE_CASE: should the compare be case-insensetive. NDMP needs 194*7917SReza.Sabdar@Sun.COM * case-sensetive name comparison. 195*7917SReza.Sabdar@Sun.COM */ 196*7917SReza.Sabdar@Sun.COM #define RSFLG_OVR_ALWAYS 0x00000001 197*7917SReza.Sabdar@Sun.COM #define RSFLG_OVR_NEVER 0x00000002 198*7917SReza.Sabdar@Sun.COM #define RSFLG_OVR_UPDATE 0x00000004 199*7917SReza.Sabdar@Sun.COM #define RSFLG_MATCH_WCARD 0x00000008 200*7917SReza.Sabdar@Sun.COM #define RSFLG_IGNORE_CASE 0x00000010 201*7917SReza.Sabdar@Sun.COM 202*7917SReza.Sabdar@Sun.COM 203*7917SReza.Sabdar@Sun.COM /* 204*7917SReza.Sabdar@Sun.COM * Different cases where two paths can match with each other. 205*7917SReza.Sabdar@Sun.COM * Parent means that the current path, is parent of an entry in 206*7917SReza.Sabdar@Sun.COM * the selection list. 207*7917SReza.Sabdar@Sun.COM * Child means that the current path, is child of an entry in the 208*7917SReza.Sabdar@Sun.COM * selection list. 209*7917SReza.Sabdar@Sun.COM */ 210*7917SReza.Sabdar@Sun.COM #define PM_NONE 0 211*7917SReza.Sabdar@Sun.COM #define PM_EXACT 1 212*7917SReza.Sabdar@Sun.COM #define PM_PARENT 2 213*7917SReza.Sabdar@Sun.COM #define PM_CHILD 3 214*7917SReza.Sabdar@Sun.COM 215*7917SReza.Sabdar@Sun.COM extern tlm_job_stats_t *tlm_new_job_stats(char *); 216*7917SReza.Sabdar@Sun.COM extern tlm_job_stats_t *tlm_ref_job_stats(char *); 217*7917SReza.Sabdar@Sun.COM extern void tlm_un_ref_job_stats(char *); 218*7917SReza.Sabdar@Sun.COM extern boolean_t tlm_is_excluded(char *, char *, char **); 219*7917SReza.Sabdar@Sun.COM extern char *tlm_build_snapshot_name(char *, char *, char *); 220*7917SReza.Sabdar@Sun.COM extern char *tlm_remove_checkpoint(char *, char *); 221*7917SReza.Sabdar@Sun.COM extern tlm_buffers_t *tlm_allocate_buffers(boolean_t, long); 222*7917SReza.Sabdar@Sun.COM extern tlm_buffer_t *tlm_buffer_advance_in_idx(tlm_buffers_t *); 223*7917SReza.Sabdar@Sun.COM extern tlm_buffer_t *tlm_buffer_advance_out_idx(tlm_buffers_t *); 224*7917SReza.Sabdar@Sun.COM extern tlm_buffer_t *tlm_buffer_in_buf(tlm_buffers_t *, int *); 225*7917SReza.Sabdar@Sun.COM extern tlm_buffer_t *tlm_buffer_out_buf(tlm_buffers_t *, int *); 226*7917SReza.Sabdar@Sun.COM extern void tlm_buffer_mark_empty(tlm_buffer_t *); 227*7917SReza.Sabdar@Sun.COM extern void tlm_buffer_release_in_buf(tlm_buffers_t *); 228*7917SReza.Sabdar@Sun.COM extern void tlm_buffer_release_out_buf(tlm_buffers_t *); 229*7917SReza.Sabdar@Sun.COM extern void tlm_buffer_in_buf_wait(tlm_buffers_t *); 230*7917SReza.Sabdar@Sun.COM extern void tlm_buffer_out_buf_wait(tlm_buffers_t *); 231*7917SReza.Sabdar@Sun.COM extern void tlm_buffer_in_buf_timed_wait(tlm_buffers_t *, unsigned); 232*7917SReza.Sabdar@Sun.COM extern void tlm_buffer_out_buf_timed_wait(tlm_buffers_t *, unsigned); 233*7917SReza.Sabdar@Sun.COM extern char *tlm_get_write_buffer(long, long *, tlm_buffers_t *, int); 234*7917SReza.Sabdar@Sun.COM extern char *tlm_get_read_buffer(int, int *, tlm_buffers_t *, int *); 235*7917SReza.Sabdar@Sun.COM extern void tlm_unget_read_buffer(tlm_buffers_t *, int); 236*7917SReza.Sabdar@Sun.COM extern void tlm_unget_write_buffer(tlm_buffers_t *, int); 237*7917SReza.Sabdar@Sun.COM extern void tlm_release_buffers(tlm_buffers_t *); 238*7917SReza.Sabdar@Sun.COM extern tlm_cmd_t *tlm_create_reader_writer_ipc(boolean_t, long); 239*7917SReza.Sabdar@Sun.COM extern void tlm_release_reader_writer_ipc(tlm_cmd_t *); 240*7917SReza.Sabdar@Sun.COM 241*7917SReza.Sabdar@Sun.COM extern void tlm_cmd_wait(tlm_cmd_t *, uint32_t); 242*7917SReza.Sabdar@Sun.COM extern void tlm_cmd_signal(tlm_cmd_t *, uint32_t); 243*7917SReza.Sabdar@Sun.COM 244*7917SReza.Sabdar@Sun.COM typedef int (*path_hist_func_t)(lbr_fhlog_call_backs_t *, 245*7917SReza.Sabdar@Sun.COM char *, 246*7917SReza.Sabdar@Sun.COM struct stat64 *, 247*7917SReza.Sabdar@Sun.COM u_longlong_t); 248*7917SReza.Sabdar@Sun.COM 249*7917SReza.Sabdar@Sun.COM typedef int (*dir_hist_func_t)(lbr_fhlog_call_backs_t *, 250*7917SReza.Sabdar@Sun.COM char *, 251*7917SReza.Sabdar@Sun.COM struct stat64 *); 252*7917SReza.Sabdar@Sun.COM 253*7917SReza.Sabdar@Sun.COM typedef int (*node_hist_func_t)(lbr_fhlog_call_backs_t *, 254*7917SReza.Sabdar@Sun.COM char *, 255*7917SReza.Sabdar@Sun.COM char *, 256*7917SReza.Sabdar@Sun.COM struct stat64 *, 257*7917SReza.Sabdar@Sun.COM u_longlong_t); 258*7917SReza.Sabdar@Sun.COM 259*7917SReza.Sabdar@Sun.COM lbr_fhlog_call_backs_t *lbrlog_callbacks_init(void *, 260*7917SReza.Sabdar@Sun.COM path_hist_func_t, 261*7917SReza.Sabdar@Sun.COM dir_hist_func_t, 262*7917SReza.Sabdar@Sun.COM node_hist_func_t); 263*7917SReza.Sabdar@Sun.COM 264*7917SReza.Sabdar@Sun.COM typedef struct { 265*7917SReza.Sabdar@Sun.COM tlm_commands_t *ba_commands; 266*7917SReza.Sabdar@Sun.COM tlm_cmd_t *ba_cmd; 267*7917SReza.Sabdar@Sun.COM char *ba_job; 268*7917SReza.Sabdar@Sun.COM char *ba_dir; 269*7917SReza.Sabdar@Sun.COM char *ba_sels[NDMP_MAX_SELECTIONS]; 270*7917SReza.Sabdar@Sun.COM pthread_barrier_t ba_barrier; 271*7917SReza.Sabdar@Sun.COM } tlm_backup_restore_arg_t; 272*7917SReza.Sabdar@Sun.COM 273*7917SReza.Sabdar@Sun.COM extern void lbrlog_callbacks_done(lbr_fhlog_call_backs_t *); 274*7917SReza.Sabdar@Sun.COM 275*7917SReza.Sabdar@Sun.COM extern boolean_t tlm_cat_path(char *, char *, char *); 276*7917SReza.Sabdar@Sun.COM 277*7917SReza.Sabdar@Sun.COM extern char *trim_name(char *); 278*7917SReza.Sabdar@Sun.COM 279*7917SReza.Sabdar@Sun.COM extern struct full_dir_info *dup_dir_info(struct full_dir_info *); 280*7917SReza.Sabdar@Sun.COM extern void write_tar_eof(tlm_cmd_t *); 281*7917SReza.Sabdar@Sun.COM extern int tlm_get_chkpnt_time(char *, int, time_t *, char *); 282*7917SReza.Sabdar@Sun.COM extern struct full_dir_info *tlm_new_dir_info(fs_fhandle_t *, 283*7917SReza.Sabdar@Sun.COM char *, 284*7917SReza.Sabdar@Sun.COM char *); 285*7917SReza.Sabdar@Sun.COM extern void tlm_release_list(char **); 286*7917SReza.Sabdar@Sun.COM extern longlong_t tlm_get_data_offset(tlm_cmd_t *); 287*7917SReza.Sabdar@Sun.COM extern int tlm_tarhdr_size(void); 288*7917SReza.Sabdar@Sun.COM 289*7917SReza.Sabdar@Sun.COM #endif /* _TLM_BUFFERS_H_ */ 290