int my_load_defaults(const char *conf_file, const char **groups, int *argc, char ***argv, const char ***default_directories) { DYNAMIC_ARRAY args; TYPELIB group; my_bool found_print_defaults= 0; uint args_used= 0; int error= 0; MEM_ROOT alloc; char *ptr,**res; struct handle_option_ctx ctx; const char **dirs; uint args_sep= my_getopt_use_args_separator ? 1 : 0; DBUG_ENTER("load_defaults"); init_alloc_root(&alloc, 512, 0, MYF(0)); if ((dirs= init_default_directories(&alloc)) == NULL) goto err; /* Check if the user doesn't want any default option processing --no-defaults is always the first option */ if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ uint i, j; if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (*argc + 1)*sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); res[0]= **argv; /* Copy program name */ j= 1; /* Start from 1 for the reset result args */ if (my_getopt_use_args_separator) { /* set arguments separator */ set_args_separator(&res[1]); j++; } for (i=2 ; i < (uint) *argc ; i++, j++) res[j]=argv[0][i]; res[j]=0; /* End pointer */ /* Update the argc, if have not added args separator, then we have to decrease argc because we have removed the "--no-defaults". */ if (!my_getopt_use_args_separator) (*argc)--; *argv=res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ if (default_directories) *default_directories= dirs; DBUG_RETURN(0); } group.count=0; group.name= "defaults"; group.type_names= groups; for (; *groups ; groups++) group.count++; if (my_init_dynamic_array(&args, sizeof(char*),*argc, 32, MYF(0))) goto err; ctx.alloc= &alloc; ctx.args= &args; ctx.group= &group; error= my_search_option_files(conf_file, argc, argv, &args_used, handle_default_option, (void *) &ctx, dirs); /* Here error contains <> 0 only if we have a fully specified conf_file or a forced default file */ if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (args.elements + *argc + 1 + args_sep) *sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); /* copy name + found arguments + command line arguments to new array */ res[0]= argv[0][0]; /* Name MUST be set, even by embedded library */ memcpy((uchar*) (res+1), args.buffer, args.elements*sizeof(char*)); /* Skip --defaults-xxx options */ (*argc)-= args_used; (*argv)+= args_used; /* Check if we wan't to see the new argument list This options must always be the last of the default options */ if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults")) { found_print_defaults=1; --*argc; ++*argv; /* skip argument */ } if (my_getopt_use_args_separator) { /* set arguments separator for arguments from config file and command line */ set_args_separator(&res[args.elements+1]); } if (*argc) memcpy((uchar*) (res+1+args.elements+args_sep), (char*) ((*argv)+1), (*argc-1)*sizeof(char*)); res[args.elements+ *argc+args_sep]=0; /* last null */ (*argc)+=args.elements+args_sep; *argv= (char**) res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ delete_dynamic(&args); if (found_print_defaults) { int i; printf("%s would have been started with the following arguments:\n", **argv); for (i=1 ; i < *argc ; i++) if (!my_getopt_is_args_separator((*argv)[i])) /* skip arguments separator */ printf("%s ", (*argv)[i]); puts(""); exit(0); } if (error == 0 && default_directories) *default_directories= dirs; DBUG_RETURN(error); err: fprintf(stderr,"Fatal error in defaults handling. Program aborted\n"); exit(1); return 0; /* Keep compiler happy */ }
bool setup_config(atrt_config& config, const char* atrt_mysqld) { BaseString tmp(g_clusters); if (atrt_mysqld) { tmp.appfmt(",.atrt"); } Vector<BaseString> clusters; tmp.split(clusters, ","); bool fqpn = clusters.size() > 1 || g_fqpn; size_t j; for (unsigned i = 0; i<clusters.size(); i++) { struct atrt_cluster *cluster = new atrt_cluster; config.m_clusters.push_back(cluster); cluster->m_name = clusters[i]; cluster->m_options.m_features = 0; if (fqpn) { cluster->m_dir.assfmt("cluster%s/", cluster->m_name.c_str()); } else { cluster->m_dir = ""; } cluster->m_next_nodeid= 1; int argc = 1; const char * argv[] = { "atrt", 0, 0 }; BaseString buf; buf.assfmt("--defaults-group-suffix=%s", clusters[i].c_str()); argv[argc++] = buf.c_str(); char ** tmp = (char**)argv; const char *groups[] = { "cluster_config", 0 }; int ret = load_defaults(g_my_cnf, groups, &argc, &tmp); if (ret) { g_logger.error("Unable to load defaults for cluster: %s", clusters[i].c_str()); return false; } struct { atrt_process::Type type; const char * name; const char * value; } proc_args[] = { { atrt_process::AP_NDB_MGMD, "--ndb_mgmd=", 0 }, { atrt_process::AP_NDBD, "--ndbd=", 0 }, { atrt_process::AP_NDB_API, "--ndbapi=", 0 }, { atrt_process::AP_NDB_API, "--api=", 0 }, { atrt_process::AP_MYSQLD, "--mysqld=", 0 }, { atrt_process::AP_ALL, 0, 0} }; /** * Find all processes... */ for (j = 0; j<(size_t)argc; j++) { if (my_getopt_is_args_separator(tmp[j])) /* skip arguments separator */ continue; for (unsigned k = 0; proc_args[k].name; k++) { if (!strncmp(tmp[j], proc_args[k].name, strlen(proc_args[k].name))) { proc_args[k].value = tmp[j] + strlen(proc_args[k].name); break; } } } if (strcmp(clusters[i].c_str(), ".atrt") == 0) { /** * Only use a mysqld... */ proc_args[0].value = 0; proc_args[1].value = 0; proc_args[2].value = 0; proc_args[3].value = 0; proc_args[4].value = atrt_mysqld; } /** * Load each process */ for (j = 0; proc_args[j].name; j++) { if (proc_args[j].value) { BaseString tmp(proc_args[j].value); Vector<BaseString> list; tmp.split(list, ","); for (unsigned k = 0; k<list.size(); k++) if (!load_process(config, *cluster, proc_args[j].type, k + 1, list[k].c_str())) return false; } } { /** * Load cluster options */ int argc = 1; const char * argv[] = { "atrt", 0, 0 }; argv[argc++] = buf.c_str(); const char *groups[] = { "mysql_cluster", 0 }; char ** tmp = (char**)argv; ret = load_defaults(g_my_cnf, groups, &argc, &tmp); if (ret) { g_logger.error("Unable to load defaults for cluster: %s", clusters[i].c_str()); return false; } load_options(argc, tmp, atrt_process::AP_CLUSTER, cluster->m_options); } } return true; }