}
#endif /* DEBUG */
+/* Dump all trees */
+int
+dump_all_config_trees (
+ FILE *df
+ )
+{
+ struct config_tree *cfg_ptr = cfg_tree_history;
+ int return_value = 0;
+
+ for(; cfg_ptr != NULL; cfg_ptr = cfg_ptr->prior)
+ return_value |= dump_config_tree(cfg_ptr, df);
+
+ return return_value;
+}
+
/* The config dumper */
int
void *opts = NULL;
char refid[5];
- printf("dump_config_tree(%p):\n", ptree);
+ printf("dump_config_tree(%p)\n", ptree);
list_ptr = queue_head(ptree->peers);
for (; list_ptr != NULL;
fudge_ptr = next_node(fudge_ptr)) {
- addr_opts = (struct addr_opts_node *) list_ptr;
+ addr_opts = (struct addr_opts_node *) fudge_ptr;
+ struct address_node *peer_addr = peers->addr;
+ struct address_node *fudge_addr = addr_opts->addr;
+
+ char *s1 = peer_addr->address;
+ char *s2 = fudge_addr->address;
- if(!strcmp((peers->addr)->address, (addr_opts->addr)->address)) {
+ if(!strcmp(s1, s2)) {
fprintf(df, "fudge %s", addr_opts->addr->address);
atrv = (struct attr_val *) list_ptr;
- fprintf(df, "enable");
+ fprintf(df, "enable ");
switch(atrv->attr) {
case T_Autokey:
list_ptr = queue_head(ptree->disable_opts);
if (list_ptr != NULL) {
- fprintf(df, "disable");
+ fprintf(df, "disable ");
for(; list_ptr != NULL;
list_ptr = next_node(list_ptr)) {
yyparse();
delete_keyword_scanner(key_scanner);
key_scanner = NULL;
+ cfgt.source.attr = CONF_SOURCE_NTPQ;
DPRINTF(1, ("Finished Parsing!!\n"));
msyslog(LOG_INFO, "getconfig: Couldn't open <%s>", FindConfig(alt_config_file));
return;
}
+ else {
+ cfgt.source.value.s = (char *) emalloc(strlen(alt_config_file));
+ strcpy(cfgt.source.value.s, alt_config_file);
+ }
+
#else /* not SYS_WINNT */
return;
#endif /* not SYS_WINNT */
}
+ else {
+ cfgt.source.value.s = (char *) emalloc(strlen(config_file));
+ strcpy(cfgt.source.value.s, config_file);
+ }
/*** BULK OF THE PARSER ***/
ip_file = fp[curr_include_level];
DPRINTF(1, ("Finished Parsing!!\n"));
+ cfgt.source.attr = CONF_SOURCE_FILE;
+ cfgt.timestamp = time(NULL);
+
save_and_apply_config_tree();
while (curr_include_level != -1) {
char filename[80];
char reply[80];
- snprintf(filename, 80, "ntp_dump%i.conf", time(NULL));
+ FILE *fptr = NULL;
- if(dump_config_dumper(filename) == -1)
+ if((reqend - reqpt) == 0) {
+ snprintf(filename, 80, "ntp_dump%i.conf", time(NULL));
+ }
+ else {
+ strncpy(filename, reqpt, 80);
+ }
+
+ fptr = fopen(filename, "w+");
+
+ if(dump_all_config_trees(fptr) == -1)
snprintf(reply, 80, "Couldn't dump to file %s", filename);
else
snprintf(reply, 80, "Dumped to config file %s", filename);
+ fclose(fptr);
+
ctl_putdata(reply, strlen(reply), 0);
ctl_flushpkt(0);
}
* Commands we understand. Ntpdc imports this.
*/
struct xcmd opcmds[] = {
- { "dumpcfg", dumpcfg, { NO, NO, NO, NO },
- { "", "", "", ""},
+ { "dumpcfg", dumpcfg, { NTP_STR, NO, NO, NO },
+ { "dumpfile", "", "", ""},
"dump ntp server configuration"},
{ "associations", associations, { NO, NO, NO, NO },
{ "", "", "", "" },
u_short rstatus;
register int a = 0;
- printf("%s\n", pcmd->keyword);
-
- for(; a<pcmd->nargs; a++)
- printf("%s\n", pcmd->argval[a]);
-
-
- /* For now let's just send a "signal" and have it realize the dump op */
- res = doquery(CTL_OP_DUMPCONFIG, 0, 0, 0, (char *)0, &rstatus,
- &dsize, &datap);
-
- printf("ntpq: res = %i %s\n", res, datap);
+ /* Is there a way to make an argument optional? */
+ if(pcmd->nargs > 0) {
+ res = doquery(CTL_OP_DUMPCONFIG, 0, 0, strlen(pcmd->argval[0].string),
+ pcmd->argval[0].string, &rstatus, &dsize, &datap);
+ }
+ else {
+ res = doquery(CTL_OP_DUMPCONFIG, 0, 0, 0, (char *) 0,
+ &rstatus, &dsize, &datap);
+ printf("No filename supplied\n");
+ }
}