Imported Upstream version 3.3.0
[debian/amanda] / server-src / diskfile.c
index e11ffd83e851025750b6e47c3c8aaf16fdba2171..71e2ef55cb7a54a656e949288e5a44dd2883fe43 100644 (file)
@@ -89,6 +89,12 @@ end:
     return config_errors(NULL);
 }
 
+am_host_t *
+get_hostlist(void)
+{
+    return hostlist;
+}
+
 am_host_t *
 lookup_host(
     const char *hostname)
@@ -198,6 +204,8 @@ add_disk(
     disk = alloc(SIZEOF(disk_t));
     bzero(disk, SIZEOF(disk_t));
     disk->line = 0;
+    disk->allow_split = 0;
+    disk->splitsize = (off_t)0;
     disk->tape_splitsize = (off_t)0;
     disk->split_diskbuffer = NULL;
     disk->fallback_splitsize = (off_t)0;
@@ -641,6 +649,7 @@ parse_diskline(
     }
 
     disk->dtype_name        = dumptype_name(dtype);
+    disk->config            = dtype;
     disk->program           = dumptype_get_program(dtype);
     disk->exclude_list     = duplicate_sl(dumptype_get_exclude(dtype).sl_list);
     disk->exclude_file     = duplicate_sl(dumptype_get_exclude(dtype).sl_file);
@@ -653,9 +662,16 @@ parse_diskline(
 /*    disk->frequency       = dumptype_get_frequency(dtype);*/
     disk->auth               = dumptype_get_auth(dtype);
     disk->maxdumps          = dumptype_get_maxdumps(dtype);
+    disk->allow_split        = dumptype_get_allow_split(dtype);
     disk->tape_splitsize     = dumptype_get_tape_splitsize(dtype);
     disk->split_diskbuffer   = dumptype_get_split_diskbuffer(dtype);
     disk->fallback_splitsize = dumptype_get_fallback_splitsize(dtype);
+    if (disk->allow_split) {
+       tapetype_t *tapetype = lookup_tapetype(getconf_str(CNF_TAPETYPE));
+       disk->splitsize = tapetype_get_part_size(tapetype);
+    } else {
+       disk->splitsize = disk->tape_splitsize;
+    }
     disk->maxpromoteday             = dumptype_get_maxpromoteday(dtype);
     disk->bumppercent       = dumptype_get_bumppercent(dtype);
     disk->bumpsize          = dumptype_get_bumpsize(dtype);
@@ -693,6 +709,7 @@ parse_diskline(
     disk->comprate[0]       = dumptype_get_comprate(dtype)[0];
     disk->comprate[1]       = dumptype_get_comprate(dtype)[1];
     disk->data_path         = dumptype_get_data_path(dtype);
+    disk->dump_limit        = dumptype_get_dump_limit(dtype);
 
     /*
      * Boolean parameters with no value (Appears here as value 2) defaults
@@ -1216,13 +1233,13 @@ xml_optionstr(
     disk_t *           dp,
     int                 to_server)
 {
-    char *auth_opt = stralloc("");
-    char *kencrypt_opt = stralloc("");
-    char *compress_opt = stralloc("");
+    char *auth_opt;
+    char *kencrypt_opt;
+    char *compress_opt;
     char *encrypt_opt = stralloc("");
     char *decrypt_opt = stralloc("");
-    char *record_opt = stralloc("");
-    char *index_opt = stralloc("");
+    char *record_opt;
+    char *index_opt;
     char *data_path_opt = stralloc("");
     char *exclude = stralloc("");
     char *exclude_file = NULL;
@@ -1246,14 +1263,16 @@ xml_optionstr(
     qdpname = quote_string(dp->name);
     if (am_has_feature(their_features, fe_options_auth)) {
        auth_opt = vstralloc("  <auth>", dp->auth, "</auth>\n", NULL);
+    } else {
+       auth_opt = stralloc("");
     }
 
     switch(dp->compress) {
     case COMP_FAST:
-       compress_opt = "  <compress>FAST</compress>\n";
+       compress_opt = stralloc("  <compress>FAST</compress>\n");
        break;
     case COMP_BEST:
-       compress_opt = "  <compress>BEST</compress>\n";
+       compress_opt = stralloc("  <compress>BEST</compress>\n");
        break;
     case COMP_CUST:
        compress_opt = vstralloc("  <compress>CUSTOM"
@@ -1263,19 +1282,20 @@ xml_optionstr(
                                 "  </compress>\n", NULL);
        break;
     case COMP_SERVER_FAST:
-       compress_opt = "  <compress>SERVER-FAST</compress>\n";
+       compress_opt = stralloc("  <compress>SERVER-FAST</compress>\n");
        break;
     case COMP_SERVER_BEST:
-       compress_opt = "  <compress>SERVER-BEST</compress>\n";
+       compress_opt = stralloc("  <compress>SERVER-BEST</compress>\n");
        break;
     case COMP_SERVER_CUST:
-       compress_opt = "  <compress>SERVER-CUSTOM</compress>\n";
        compress_opt = vstralloc("  <compress>SERVER-CUSTOM"
                                 "<custom-compress-program>",
                                 dp->srvcompprog,
                                 "</custom-compress-program>\n"
                                 "  </compress>\n", NULL);
        break;
+    default:
+       compress_opt = stralloc("");
     }
 
     switch(dp->encrypt) {
@@ -1321,15 +1341,20 @@ xml_optionstr(
 
     if(dp->index) {
        index_opt = "  <index>YES</index>\n";
+    } else {
+       index_opt = "";
     }
 
     if (dp->kencrypt) {
        kencrypt_opt = "  <kencrypt>YES</kencrypt>\n";
+    } else {
+       kencrypt_opt = "";
     }
 
     if (am_has_feature(their_features, fe_xml_data_path)) {
        switch(dp->data_path) {
        case DATA_PATH_AMANDA:
+           amfree(data_path_opt);
            data_path_opt = stralloc("  <datapath>AMANDA</datapath>\n");
            break;
        case DATA_PATH_DIRECTTCP:
@@ -1338,6 +1363,7 @@ xml_optionstr(
                char *s, *sc;
                char *value, *b64value;
 
+               amfree(data_path_opt);
                data_path_opt = stralloc("  <datapath>DIRECTTCP");
                if (dp->dataport_list) {
                    s = sc = stralloc(dp->dataport_list);
@@ -1441,6 +1467,7 @@ xml_optionstr(
     amfree(qdpname);
     amfree(auth_opt);
     amfree(data_path_opt);
+    amfree(compress_opt);
     amfree(exclude);
     amfree(exclude_list);
     amfree(exclude_file);
@@ -1450,6 +1477,7 @@ xml_optionstr(
     amfree(exc);
     amfree(decrypt_opt);
     amfree(encrypt_opt);
+    amfree(script_opt);
 
     /* result contains at least 'auth=...' */
     return result;
@@ -1563,6 +1591,7 @@ xml_application(
 {
     char       *plugin;
     char       *b64plugin;
+    char       *client_name;
     xml_app_t   xml_app;
     proplist_t  proplist;
 
@@ -1576,6 +1605,13 @@ xml_application(
     proplist = application_get_property(application);
     g_hash_table_foreach(proplist, xml_property, &xml_app);
 
+    client_name = application_get_client_name(application);
+    if (client_name && strlen(client_name) > 0 &&
+       am_has_feature(their_features, fe_application_client_name)) {
+       char *b64client_name = amxml_format_tag("client_name", client_name);
+       vstrextend(&xml_app.result, "    ", b64client_name, "\n", NULL);
+    }
+
     vstrextend(&xml_app.result, "  </backup-program>\n", NULL);
 
     amfree(b64plugin);
@@ -1591,6 +1627,7 @@ xml_scripts(
 {
     char       *plugin;
     char       *b64plugin;
+    char       *client_name;
     char       *xml_scr;
     char       *xml_scr1;
     char       *str = "";
@@ -1627,7 +1664,7 @@ xml_scripts(
 
        execute_on = pp_script_get_execute_on(pp_script);
        sep = "";
-       eo_str = NULL;
+       eo_str = stralloc("");
        if (execute_on & EXECUTE_ON_PRE_DLE_AMCHECK) {
            eo_str = vstrextend(&eo_str, sep, "PRE-DLE-AMCHECK", NULL);
            sep = ",";
@@ -1704,9 +1741,19 @@ xml_scripts(
        proplist = pp_script_get_property(pp_script);
        xml_app.result   = stralloc("");
        g_hash_table_foreach(proplist, xml_property, &xml_app);
+
+       client_name = pp_script_get_client_name(pp_script);
+       if (client_name && strlen(client_name) > 0 &&
+           am_has_feature(their_features, fe_script_client_name)) {
+           char *b64client_name = amxml_format_tag("client_name",
+                                                   client_name);
+           vstrextend(&xml_app.result, "    ", b64client_name, "\n", NULL);
+       }
+
        xml_scr = vstrextend(&xml_scr, xml_scr1, xml_app.result, "  </script>\n", NULL);
        amfree(b64plugin);
        amfree(xml_app.result);
+       amfree(xml_scr1);
     }
     return xml_scr;
 }
@@ -1771,10 +1818,13 @@ match_disklist(
                        dp->todo = 1;
                        match_a_disk = 1;
                        prev_match = 0;
-                   } else { /* dp->todo == 0 */
+                   } else if (dp->todo == 0) {
                        match_a_disk = 1;
                        prev_match = 0;
                        dp_skip = dp;
+                   } else { /* dp->todo == 1 */
+                       match_a_disk = 1;
+                       prev_match = 0;
                    }
                }
            }
@@ -1848,6 +1898,37 @@ match_disklist(
     return errstr;
 }
 
+gboolean
+match_dumpfile(
+    dumpfile_t  *file,
+    int                sargc,
+    char **    sargv)
+{
+    disk_t d;
+    am_host_t h;
+    disklist_t dl;
+
+    /* rather than try to reproduce the adaptive matching logic in
+     * match_disklist, this simply creates a new, fake disklist with one
+     * element in it, and calls match_disklist directly */
+
+    bzero(&h, sizeof(h));
+    h.hostname = file->name;
+    h.disks = &d;
+
+    bzero(&d, sizeof(d));
+    d.host = &h;
+    d.hostname = file->name;
+    d.name = file->disk;
+    d.device = file->disk;
+    d.todo = 1;
+
+    dl.head = dl.tail = &d;
+
+    (void)match_disklist(&dl, sargc, sargv);
+    return d.todo;
+}
+
 netif_t *
 disklist_netifs(void)
 {