1 /*
2    Bacula(R) - The Network Backup Solution
3 
4    Copyright (C) 2000-2018 Kern Sibbald
5 
6    The original author of Bacula is Kern Sibbald, with contributions
7    from many others, a complete list can be found in the file AUTHORS.
8 
9    You may use this file and others of this release according to the
10    license defined in the LICENSE file, which includes the Affero General
11    Public License, v3.0 ("AGPLv3") and some additional permissions and
12    terms pursuant to its AGPLv3 Section 7.
13 
14    This notice must be preserved when any source code is
15    conveyed and/or propagated.
16 
17    Bacula(R) is a registered trademark of Kern Sibbald.
18 */
19 /*
20  *  Written by James Harper, July 2010
21  *
22  *  Used only in "old Exchange plugin" now deprecated.
23  */
24 
25 #include "exchange-fd.h"
26 
root_node_t(char * name)27 root_node_t::root_node_t(char *name) : node_t(name, NODE_TYPE_ROOT)
28 {
29    service_node = NULL;
30 }
31 
~root_node_t()32 root_node_t::~root_node_t()
33 {
34 }
35 
36 bRC
startBackupFile(exchange_fd_context_t * context,struct save_pkt * sp)37 root_node_t::startBackupFile(exchange_fd_context_t *context, struct save_pkt *sp)
38 {
39    bRC retval = bRC_OK;
40    time_t now;
41 
42    _DebugMessage(100, "startBackupNode_ROOT state = %d\n", state);
43    switch(state)
44    {
45    case 0:
46       if (strcmp(PLUGIN_PATH_PREFIX_BASE, name) != 0)
47       {
48          _JobMessage(M_FATAL, "Invalid backup path specified, must start with '/" PLUGIN_PATH_PREFIX_BASE "/'\n");
49          state = 999;
50          return bRC_Error;
51       }
52       // check that service_node == NULL
53       service_node = new service_node_t(bstrdup(context->path_bits[level + 1]), this);
54       state = 1;
55       // fall through
56    case 1:
57       context->current_node = service_node;
58       break;
59    case 2:
60       now = time(NULL);
61       sp->fname = full_path;
62       sp->link = full_path;
63       sp->statp.st_mode = 0700 | S_IFDIR;
64       sp->statp.st_ctime = now;
65       sp->statp.st_mtime = now;
66       sp->statp.st_atime = now;
67       sp->statp.st_size = 0;
68       sp->type = FT_DIREND;
69       break;
70    case 999:
71       return bRC_Error;
72    default:
73       _JobMessage(M_FATAL, "startBackupFile: invalid internal state %d", state);
74       state = 999;
75    }
76    return retval;
77 }
78 
79 bRC
endBackupFile(exchange_fd_context_t * context)80 root_node_t::endBackupFile(exchange_fd_context_t *context)
81 {
82    bRC retval = bRC_OK;
83 
84    _DebugMessage(100, "endBackupNode_ROOT state = %d\n", state);
85    switch(state)
86    {
87    case 1:
88       state = 2;
89       retval = bRC_More;
90       // free service_node here?
91       break;
92    case 2:
93       retval = bRC_OK;
94       break;
95    case 999:
96       retval = bRC_Error;
97    default:
98       _JobMessage(M_FATAL, "endBackupFile: invalid internal state %d", state);
99       state = 999;
100       return bRC_Error;
101    }
102    return retval;
103 }
104 
105 bRC
createFile(exchange_fd_context_t * context,struct restore_pkt * rp)106 root_node_t::createFile(exchange_fd_context_t *context, struct restore_pkt *rp)
107 {
108    _DebugMessage(0, "createFile_ROOT state = %d\n", state);
109    switch (state) {
110    case 0:
111       if (strcmp(name, PLUGIN_PATH_PREFIX_BASE) != 0) {
112          _JobMessage(M_FATAL, "Invalid restore path specified, must start with '/" PLUGIN_PATH_PREFIX_BASE "/'\n");
113          state = 999;
114          return bRC_Error;
115       }
116       service_node = new service_node_t(bstrdup(context->path_bits[level + 1]), this);
117       context->current_node = service_node;
118       return bRC_OK;
119    case 1:
120       rp->create_status = CF_CREATED;
121       return bRC_OK;
122 
123    /* Skip this file */
124    case 900:
125       rp->create_status = CF_SKIP;
126       return bRC_OK;
127    /* Error */
128    case 999:
129       return bRC_Error;
130    default:
131       _JobMessage(M_FATAL, "createFile: invalid internal state %d", state);
132       state = 999;
133    }
134    return bRC_Error;
135 }
136 
137 bRC
endRestoreFile(exchange_fd_context_t * context)138 root_node_t::endRestoreFile(exchange_fd_context_t *context)
139 {
140    _DebugMessage(0, "endRestoreFile_ROOT state = %d\n", state);
141    switch (state) {
142    case 0:
143       safe_delete(service_node);
144       state = 1;
145       return bRC_OK;
146    case 1:
147       return bRC_OK;
148    case 900:
149       return bRC_OK;
150    default:
151       _JobMessage(M_FATAL, "endRestore: invalid internal state %d", state);
152       state = 999;
153    }
154    return bRC_Error;
155 }
156