]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/jcr.h
eb7b28428926226594559e8311978a2a2c185521
[bacula/bacula] / bacula / src / jcr.h
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version three of the GNU Affero General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU Affero General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  * Bacula JCR Structure definition for Daemons and the Library
30  *  This definition consists of a "Global" definition common
31  *  to all daemons and used by the library routines, and a
32  *  daemon specific part that is enabled with #defines.
33  *
34  * Kern Sibbald, Nov MM
35  *
36  */
37
38
39 #ifndef __JCR_H_
40 #define __JCR_H_ 1
41
42 /* Backup/Verify level code. These are stored in the DB */
43 #define L_FULL                   'F'  /* Full backup */
44 #define L_INCREMENTAL            'I'  /* since last backup */
45 #define L_DIFFERENTIAL           'D'  /* since last full backup */
46 #define L_SINCE                  'S'
47 #define L_VERIFY_CATALOG         'C'  /* verify from catalog */
48 #define L_VERIFY_INIT            'V'  /* verify save (init DB) */
49 #define L_VERIFY_VOLUME_TO_CATALOG 'O'  /* verify Volume to catalog entries */
50 #define L_VERIFY_DISK_TO_CATALOG 'd'  /* verify Disk attributes to catalog */
51 #define L_VERIFY_DATA            'A'  /* verify data on volume */
52 #define L_BASE                   'B'  /* Base level job */
53 #define L_NONE                   ' '  /* None, for Restore and Admin */
54 #define L_VIRTUAL_FULL           'f'  /* Virtual full backup */
55
56
57 /* Job Types. These are stored in the DB */
58 #define JT_BACKUP                'B'  /* Backup Job */
59 #define JT_MIGRATED_JOB          'M'  /* A previous backup job that was migrated */
60 #define JT_VERIFY                'V'  /* Verify Job */
61 #define JT_RESTORE               'R'  /* Restore Job */
62 #define JT_CONSOLE               'U'  /* console program */
63 #define JT_SYSTEM                'I'  /* internal system "job" */
64 #define JT_ADMIN                 'D'  /* admin job */
65 #define JT_ARCHIVE               'A'  /* Archive Job */
66 #define JT_JOB_COPY              'C'  /* Copy of a Job */
67 #define JT_COPY                  'c'  /* Copy Job */
68 #define JT_MIGRATE               'g'  /* Migration Job */
69 #define JT_SCAN                  'S'  /* Scan Job */
70
71 /* Job Status. Some of these are stored in the DB */
72 #define JS_Canceled              'A'  /* canceled by user */
73 #define JS_Blocked               'B'  /* blocked */
74 #define JS_Created               'C'  /* created but not yet running */
75 #define JS_Differences           'D'  /* Verify differences */
76 #define JS_ErrorTerminated       'E'  /* Job terminated in error */
77 #define JS_WaitFD                'F'  /* waiting on File daemon */
78 #define JS_Incomplete            'I'  /* Incomplete Job */
79 #define JS_DataCommitting        'L'  /* Committing data (last despool) */
80 #define JS_WaitMount             'M'  /* waiting for Mount */
81 #define JS_Running               'R'  /* running */
82 #define JS_WaitSD                'S'  /* waiting on the Storage daemon */
83 #define JS_Terminated            'T'  /* terminated normally */
84 #define JS_Warnings              'W'  /* Terminated normally with warnings */
85
86 #define JS_AttrDespooling        'a'  /* SD despooling attributes */
87 #define JS_WaitClientRes         'c'  /* Waiting for Client resource */
88 #define JS_WaitMaxJobs           'd'  /* Waiting for maximum jobs */
89 #define JS_Error                 'e'  /* Non-fatal error */
90 #define JS_FatalError            'f'  /* Fatal error */
91 #define JS_AttrInserting         'i'  /* Doing batch insert file records */
92 #define JS_WaitJobRes            'j'  /* Waiting for job resource */
93 #define JS_DataDespooling        'l'  /* Doing data despooling */
94 #define JS_WaitMedia             'm'  /* waiting for new media */
95 #define JS_WaitPriority          'p'  /* Waiting for higher priority jobs to finish */
96 #define JS_WaitStoreRes          's'  /* Waiting for storage resource */
97 #define JS_WaitStartTime         't'  /* Waiting for start time */ 
98
99 /* Migration selection types */
100 enum {
101    MT_SMALLEST_VOL = 1,
102    MT_OLDEST_VOL,
103    MT_POOL_OCCUPANCY,
104    MT_POOL_TIME,
105    MT_POOL_UNCOPIED_JOBS,
106    MT_CLIENT,
107    MT_VOLUME,
108    MT_JOB,
109    MT_SQLQUERY
110 };
111
112 #define job_canceled(jcr) \
113   (jcr->JobStatus == JS_Canceled || \
114    jcr->JobStatus == JS_ErrorTerminated || \
115    jcr->JobStatus == JS_FatalError || \
116    jcr->JobStatus == JS_Incomplete \
117   )
118
119 #define job_waiting(jcr) \
120   (jcr->JobStatus == JS_WaitFD       || \
121    jcr->JobStatus == JS_WaitSD       || \
122    jcr->JobStatus == JS_WaitMedia    || \
123    jcr->JobStatus == JS_WaitMount    || \
124    jcr->JobStatus == JS_WaitStoreRes || \
125    jcr->JobStatus == JS_WaitJobRes   || \
126    jcr->JobStatus == JS_WaitClientRes|| \
127    jcr->JobStatus == JS_WaitMaxJobs  || \
128    jcr->JobStatus == JS_WaitPriority || \
129    jcr->SDJobStatus == JS_WaitMedia  || \
130    jcr->SDJobStatus == JS_WaitMount  || \
131    jcr->SDJobStatus == JS_WaitMaxJobs)
132
133
134
135 #define foreach_jcr(jcr) \
136    for (jcr=jcr_walk_start(); jcr; (jcr=jcr_walk_next(jcr)) )
137
138 #define endeach_jcr(jcr) jcr_walk_end(jcr)
139
140 #define SD_APPEND 1
141 #define SD_READ   0
142
143 /* Forward referenced structures */
144 class JCR;
145 struct FF_PKT;
146 class  B_DB;
147 struct ATTR_DBR;
148 struct Plugin;
149 struct save_pkt;
150 struct bpContext;
151 struct xattr_private_data_t;
152
153 #ifdef FILE_DAEMON
154 class htable;
155 struct acl_data_t;
156 struct xattr_data_t;
157
158 struct CRYPTO_CTX {
159    bool pki_sign;                     /* Enable PKI Signatures? */
160    bool pki_encrypt;                  /* Enable PKI Encryption? */
161    DIGEST *digest;                    /* Last file's digest context */
162    X509_KEYPAIR *pki_keypair;         /* Encryption key pair */
163    alist *pki_signers;                /* Trusted Signers */
164    alist *pki_recipients;             /* Trusted Recipients */
165    CRYPTO_SESSION *pki_session;       /* PKE Public Keys + Symmetric Session Keys */
166    POOLMEM *pki_session_encoded;      /* Cached DER-encoded copy of pki_session */
167    int32_t pki_session_encoded_size;  /* Size of DER-encoded pki_session */
168    POOLMEM *crypto_buf;               /* Encryption/Decryption buffer */
169 };
170 #endif
171
172 typedef void (JCR_free_HANDLER)(JCR *jcr);
173
174 /* Job Control Record (JCR) */
175 class JCR {
176 private:
177    pthread_mutex_t mutex;             /* jcr mutex */
178    volatile int32_t _use_count;       /* use count */
179    int32_t m_JobType;                 /* backup, restore, verify ... */
180    int32_t m_JobLevel;                /* Job level */
181    bool my_thread_killable;           /* can we kill the thread? */
182 public:
183    void lock() {P(mutex); };
184    void unlock() {V(mutex); };
185    void inc_use_count(void) {lock(); _use_count++; unlock(); };
186    void dec_use_count(void) {lock(); _use_count--; unlock(); };
187    int32_t use_count() const { return _use_count; };
188    void init_mutex(void) {pthread_mutex_init(&mutex, NULL); };
189    void destroy_mutex(void) {pthread_mutex_destroy(&mutex); };
190    bool is_job_canceled() {return job_canceled(this); };
191    void set_JobLevel(int32_t JobLevel) { m_JobLevel = JobLevel; };
192    void setJobLevel(int32_t JobLevel) { m_JobLevel = JobLevel; };
193    void set_JobType(int32_t JobType) { m_JobType = JobType; };
194    void setJobType(int32_t JobType) { m_JobType = JobType; };
195    int32_t getJobType() const { return m_JobType; };
196    int32_t getJobLevel() const { return m_JobLevel; };
197    int32_t getJobStatus() const { return JobStatus; };
198    bool no_client_used() const {
199       return (m_JobType == JT_MIGRATE || m_JobType == JT_COPY ||
200               m_JobLevel == L_VIRTUAL_FULL);
201    };
202    const char *get_OperationName();       /* in lib/jcr.c */
203    const char *get_ActionName(bool past); /* in lib/jcr.c */
204    void setJobStatus(int JobStatus);      /* in lib/jcr.c */
205    bool JobReads();                       /* in lib/jcr.c */
206    void my_thread_send_signal(int sig);   /* in lib/jcr.c */
207    void set_killable(bool killable);      /* in lib/jcr.c */
208    bool is_killable() const { return my_thread_killable; };
209
210    /* Global part of JCR common to all daemons */
211    dlink link;                        /* JCR chain link */
212    pthread_t my_thread_id;            /* id of thread controlling jcr */
213    BSOCK *dir_bsock;                  /* Director bsock or NULL if we are him */
214    BSOCK *store_bsock;                /* Storage connection socket */
215    BSOCK *file_bsock;                 /* File daemon connection socket */
216    JCR_free_HANDLER *daemon_free_jcr; /* Local free routine */
217    dlist *msg_queue;                  /* Queued messages */
218    pthread_mutex_t msg_queue_mutex;   /* message queue mutex */
219    bool dequeuing_msgs;               /* Set when dequeuing messages */
220    alist job_end_push;                /* Job end pushed calls */
221    POOLMEM *VolumeName;               /* Volume name desired -- pool_memory */
222    POOLMEM *errmsg;                   /* edited error message */
223    char Job[MAX_NAME_LENGTH];         /* Unique name of this Job */
224    char event[MAX_NAME_LENGTH];       /* Current event (python) */
225    uint32_t eventType;                /* Current event type (plugin) */
226
227    uint32_t JobId;                    /* Director's JobId */
228    uint32_t VolSessionId;
229    uint32_t VolSessionTime;
230    uint32_t JobFiles;                 /* Number of files written, this job */
231    uint32_t JobErrors;                /* Number of non-fatal errors this job */
232    uint32_t JobWarnings;              /* Number of warning messages */
233    uint64_t JobBytes;                 /* Number of bytes processed this job */
234    uint64_t ReadBytes;                /* Bytes read -- before compression */
235    FileId_t FileId;                   /* Last FileId used */
236    volatile int32_t JobStatus;        /* ready, running, blocked, terminated */
237    int32_t JobPriority;               /* Job priority */
238    time_t sched_time;                 /* job schedule time, i.e. when it should start */
239    time_t start_time;                 /* when job actually started */
240    time_t run_time;                   /* used for computing speed */
241    time_t end_time;                   /* job end time */
242    time_t wait_time_sum;              /* cumulative wait time since job start */
243    time_t wait_time;                  /* timestamp when job have started to wait */
244    POOLMEM *client_name;              /* client name */
245    POOLMEM *JobIds;                   /* User entered string of JobIds */
246    POOLMEM *RestoreBootstrap;         /* Bootstrap file to restore */
247    POOLMEM *stime;                    /* start time for incremental/differential */
248    char *sd_auth_key;                 /* SD auth key */
249    MSGS *jcr_msgs;                    /* Copy of message resource -- actually used */
250    uint32_t ClientId;                 /* Client associated with Job */
251    char *where;                       /* prefix to restore files to */
252    char *RegexWhere;                  /* file relocation in restore */
253    alist *where_bregexp;              /* BREGEXP alist for path manipulation */
254    int32_t cached_pnl;                /* cached path length */
255    POOLMEM *cached_path;              /* cached path */
256    bool prefix_links;                 /* Prefix links with Where path */
257    bool gui;                          /* set if gui using console */
258    bool authenticated;                /* set when client authenticated */
259    void *Python_job;                  /* Python Job Object */
260    void *Python_events;               /* Python Events Object */
261
262    bool cached_attribute;             /* set if attribute is cached */
263    POOLMEM *attr;                     /* Attribute string from SD */
264    B_DB *db;                          /* database pointer */
265    B_DB *db_batch;                    /* database pointer for batch and accurate */
266    bool batch_started;                /* is batch mode already started ? */
267    bool HasBase;                      /* True if job use base jobs */
268    uint64_t nb_base_files;            /* Number of base files */
269    uint64_t nb_base_files_used;       /* Number of useful files in base */
270
271    ATTR_DBR *ar;                      /* DB attribute record */
272    guid_list *id_list;                /* User/group id to name list */
273    bool accurate;                     /* true if job is accurate */
274
275    bpContext *plugin_ctx_list;        /* list of contexts for plugins */
276    bpContext *plugin_ctx;             /* current plugin context */
277    Plugin *plugin;                    /* plugin instance */
278    save_pkt *plugin_sp;               /* plugin save packet */
279    char *plugin_options;              /* user set options for plugin */
280    bool cmd_plugin;                   /* Set when processing a command Plugin = */
281    POOLMEM *comment;                  /* Comment for this Job */
282
283    /* Daemon specific part of JCR */
284    /* This should be empty in the library */
285
286 #ifdef DIRECTOR_DAEMON
287    /* Director Daemon specific data part of JCR */
288    pthread_t SD_msg_chan;             /* Message channel thread id */
289    pthread_cond_t term_wait;          /* Wait for job termination */
290    workq_ele_t *work_item;            /* Work queue item if scheduled */
291    volatile bool sd_msg_thread_done;  /* Set when Storage message thread done */
292    BSOCK *ua;                         /* User agent */
293    JOB *job;                          /* Job resource */
294    JOB *verify_job;                   /* Job resource of verify previous job */
295    alist *rstorage;                   /* Read storage possibilities */
296    STORE *rstore;                     /* Selected read storage */
297    alist *wstorage;                   /* Write storage possibilities */
298    STORE *wstore;                     /* Selected write storage */
299    CLIENT *client;                    /* Client resource */
300    POOL *pool;                        /* Pool resource = write for migration */
301    POOL *rpool;                       /* Read pool. Used only in migration */
302    POOL *full_pool;                   /* Full backup pool resource */
303    POOL *inc_pool;                    /* Incremental backup pool resource */
304    POOL *diff_pool;                   /* Differential backup pool resource */
305    bool run_pool_override;
306    bool run_full_pool_override;
307    bool run_inc_pool_override;
308    bool run_diff_pool_override;
309    bool sd_canceled;                  /* set if SD canceled */
310    FILESET *fileset;                  /* FileSet resource */
311    CAT *catalog;                      /* Catalog resource */
312    MSGS *messages;                    /* Default message handler */
313    uint32_t SDJobFiles;               /* Number of files written, this job */
314    uint64_t SDJobBytes;               /* Number of bytes processed this job */
315    uint32_t SDErrors;                 /* Number of non-fatal errors */
316    volatile int32_t SDJobStatus;      /* Storage Job Status */
317    volatile int32_t FDJobStatus;      /* File daemon Job Status */
318    uint32_t ExpectedFiles;            /* Expected restore files */
319    uint32_t MediaId;                  /* DB record IDs associated with this job */
320    uint32_t FileIndex;                /* Last FileIndex processed */
321    POOLMEM *fname;                    /* name to put into catalog */
322    JOB_DBR jr;                        /* Job DB record for current job */
323    JOB_DBR previous_jr;               /* previous job database record */
324    JOB *previous_job;                 /* Job resource of migration previous job */
325    JCR *mig_jcr;                      /* JCR for migration/copy job */
326    char FSCreateTime[MAX_TIME_LENGTH]; /* FileSet CreateTime as returned from DB */
327    char since[MAX_TIME_LENGTH];       /* since time */
328    union {
329       JobId_t RestoreJobId;           /* Id specified by UA */
330       JobId_t MigrateJobId;
331    };
332    POOLMEM *client_uname;             /* client uname */
333    POOLMEM *pool_source;              /* Where pool came from */
334    POOLMEM *rpool_source;             /* Where migrate read pool came from */
335    POOLMEM *rstore_source;            /* Where read storage came from */
336    POOLMEM *wstore_source;            /* Where write storage came from */
337    POOLMEM *catalog_source;           /* Where catalog came from */
338    uint32_t replace;                  /* Replace option */
339    int32_t NumVols;                   /* Number of Volume used in pool */
340    int32_t reschedule_count;          /* Number of times rescheduled */
341    int32_t FDVersion;                 /* File daemon version number */
342    int64_t spool_size;                /* Spool size for this job */
343    bool spool_data;                   /* Spool data in SD */
344    bool acquired_resource_locks;      /* set if resource locks acquired */
345    bool term_wait_inited;             /* Set when cond var inited */
346    bool fn_printed;                   /* printed filename */
347    bool write_part_after_job;         /* Write part after job in SD */
348    bool needs_sd;                     /* set if SD needed by Job */
349    bool cloned;                       /* set if cloned */
350    bool unlink_bsr;                   /* Unlink bsr file created */
351    bool VSS;                          /* VSS used by FD */
352    bool Encrypt;                      /* Encryption used by FD */
353    bool stats_enabled;                /* Keep all job records in a table for long term statistics */
354    bool no_maxtime;                   /* Don't check Max*Time for this JCR */
355    bool keep_sd_auth_key;             /* Clear or not the SD auth key after connection*/
356    bool use_accurate_chksum;          /* Use or not checksum option in accurate code */
357 #endif /* DIRECTOR_DAEMON */
358
359
360 #ifdef FILE_DAEMON
361    /* File Daemon specific part of JCR */
362    uint32_t num_files_examined;       /* files examined this job */
363    POOLMEM *last_fname;               /* last file saved/verified */
364    POOLMEM *job_metadata;             /* VSS job metadata */
365    acl_data_t *acl_data;              /* ACLs for backup/restore */
366    xattr_data_t *xattr_data;          /* Extended Attributes for backup/restore */
367    int32_t last_type;                 /* type of last file saved/verified */
368    int incremental;                   /* set if incremental for SINCE */
369    utime_t mtime;                     /* begin time for SINCE */
370    int listing;                       /* job listing in estimate */
371    long Ticket;                       /* Ticket */
372    char *big_buf;                     /* I/O buffer */
373    POOLMEM *compress_buf;             /* Compression buffer */
374    int32_t compress_buf_size;         /* Length of compression buffer */
375    void *pZLIB_compress_workset;      /* zlib compression session data */
376    int32_t replace;                   /* Replace options */
377    int32_t buf_size;                  /* length of buffer */
378    FF_PKT *ff;                        /* Find Files packet */
379    char stored_addr[MAX_NAME_LENGTH]; /* storage daemon address */
380    uint32_t StartFile;
381    uint32_t EndFile;
382    uint32_t StartBlock;
383    uint32_t EndBlock;
384    pthread_t heartbeat_id;            /* id of heartbeat thread */
385    volatile bool hb_started;          /* heartbeat running */
386    BSOCK *hb_bsock;                   /* duped SD socket */
387    BSOCK *hb_dir_bsock;               /* duped DIR socket */
388    alist *RunScripts;                 /* Commands to run before and after job */
389    CRYPTO_CTX crypto;                 /* Crypto ctx */
390    DIRRES* director;                  /* Director resource */
391    bool VSS;                          /* VSS used by FD */
392    bool multi_restore;                /* Dir can do multiple storage restore */
393    htable *file_list;                 /* Previous file list (accurate mode) */
394    uint64_t base_size;                /* compute space saved with base job */
395 #endif /* FILE_DAEMON */
396
397
398 #ifdef STORAGE_DAEMON
399    /* Storage Daemon specific part of JCR */
400    JCR *next_dev;                     /* next JCR attached to device */
401    JCR *prev_dev;                     /* previous JCR attached to device */
402    char *dir_auth_key;                /* Dir auth key */
403    pthread_cond_t job_start_wait;     /* Wait for FD to start Job */
404    int32_t type;
405    DCR *read_dcr;                     /* device context for reading */
406    DCR *dcr;                          /* device context record */
407    alist *dcrs;                       /* list of dcrs open */
408    POOLMEM *job_name;                 /* base Job name (not unique) */
409    POOLMEM *fileset_name;             /* FileSet */
410    POOLMEM *fileset_md5;              /* MD5 for FileSet */
411    VOL_LIST *VolList;                 /* list to read */
412    int32_t NumWriteVolumes;           /* number of volumes written */
413    int32_t NumReadVolumes;            /* total number of volumes to read */
414    int32_t CurReadVolume;             /* current read volume number */
415    int32_t label_errors;              /* count of label errors */
416    bool session_opened;
417    long Ticket;                       /* ticket for this job */
418    bool ignore_label_errors;          /* ignore Volume label errors */
419    bool spool_attributes;             /* set if spooling attributes */
420    bool no_attributes;                /* set if no attributes wanted */
421    int64_t spool_size;                /* Spool size for this job */
422    bool spool_data;                   /* set to spool data */
423    int32_t CurVol;                    /* Current Volume count */
424    DIRRES* director;                  /* Director resource */
425    alist *write_store;                /* list of write storage devices sent by DIR */ 
426    alist *read_store;                 /* list of read devices sent by DIR */
427    alist *reserve_msgs;               /* reserve fail messages */
428    bool write_part_after_job;         /* Set to write part after job */
429    bool PreferMountedVols;            /* Prefer mounted vols rather than new */
430    bool Resched;                      /* Job may be rescheduled */
431
432    /* Parmaters for Open Read Session */
433    BSR *bsr;                          /* Bootstrap record -- has everything */
434    bool mount_next_volume;            /* set to cause next volume mount */
435    uint32_t read_VolSessionId;
436    uint32_t read_VolSessionTime;
437    uint32_t read_StartFile;
438    uint32_t read_EndFile;
439    uint32_t read_StartBlock;
440    uint32_t read_EndBlock;
441    /* Device wait times */
442    int32_t min_wait;
443    int32_t max_wait;
444    int32_t max_num_wait;
445    int32_t wait_sec;
446    int32_t rem_wait_sec;
447    int32_t num_wait;
448 #endif /* STORAGE_DAEMON */
449
450 };
451
452 /*
453  * Setting a NULL in tsd doesn't clear the tsd but instead tells
454  *   pthreads not to call the tsd destructor. Consequently, we 
455  *   define this *invalid* jcr address and stuff it in the tsd
456  *   when the jcr is not valid.
457  */
458 #define INVALID_JCR ((JCR *)(-1))
459
460
461 /*
462  * Structure for all daemons that keeps some summary
463  *  info on the last job run.
464  */
465 struct s_last_job {
466    dlink link;
467    int32_t Errors;                    /* FD/SD errors */
468    int32_t JobType;
469    int32_t JobStatus;
470    int32_t JobLevel;
471    uint32_t JobId;
472    uint32_t VolSessionId;
473    uint32_t VolSessionTime;
474    uint32_t JobFiles;
475    uint64_t JobBytes;
476    utime_t start_time;
477    utime_t end_time;
478    char Job[MAX_NAME_LENGTH];
479 };
480
481 extern struct s_last_job last_job;
482 extern DLL_IMP_EXP dlist *last_jobs;
483
484
485 /* The following routines are found in lib/jcr.c */
486 extern int get_next_jobid_from_list(char **p, uint32_t *JobId);
487 extern bool init_jcr_subsystem(void);
488 extern JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr);
489 extern JCR *get_jcr_by_id(uint32_t JobId);
490 extern JCR *get_jcr_by_session(uint32_t SessionId, uint32_t SessionTime);
491 extern JCR *get_jcr_by_partial_name(char *Job);
492 extern JCR *get_jcr_by_full_name(char *Job);
493 extern JCR *get_next_jcr(JCR *jcr);
494 extern void set_jcr_job_status(JCR *jcr, int JobStatus);
495 extern int DLL_IMP_EXP num_jobs_run;
496
497 #ifdef DEBUG
498 extern void b_free_jcr(const char *file, int line, JCR *jcr);
499 #define free_jcr(jcr) b_free_jcr(__FILE__, __LINE__, (jcr))
500 #else
501 extern void free_jcr(JCR *jcr);
502 #endif
503
504 /* Used to display specific job information after a fatal signal */
505 typedef void (dbg_jcr_hook_t)(JCR *jcr, FILE *fp);
506 extern void dbg_jcr_add_hook(dbg_jcr_hook_t *fct);
507
508 #endif /* __JCR_H_ */