12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
16
/****************************************************************************
17
17
Add all options from files named "group".cnf from the default_directories
33
33
--print-defaults ; Print the modified command line and exit
34
34
****************************************************************************/
38
#include "drizzled/internal/my_sys.h"
39
#include "drizzled/internal/m_string.h"
40
#include "drizzled/charset_info.h"
41
#include <drizzled/configmake.h>
42
#include <drizzled/gettext.h>
44
#include "drizzled/cached_directory.h"
46
#ifdef HAVE_SYS_STAT_H
47
# include <sys/stat.h>
36
#include "mysys_priv.h"
37
#include <mystrings/m_string.h>
38
#include <mystrings/m_ctype.h>
60
41
const char *my_defaults_file=0;
61
42
const char *my_defaults_group_suffix=0;
67
48
const char *default_directories[MAX_DEFAULT_DIRS + 1];
69
50
static const char *f_extensions[]= { ".cnf", 0 };
71
int handle_default_option(void *in_ctx, const char *group_name,
53
static int handle_default_option(void *in_ctx, const char *group_name,
75
57
This structure defines the context that we pass to callback
157
139
(char **) &my_defaults_group_suffix);
159
141
if (! my_defaults_group_suffix)
160
my_defaults_group_suffix= getenv("DRIZZLE_GROUP_SUFFIX");
142
my_defaults_group_suffix= getenv(STRINGIFY_ARG(DEFAULT_GROUP_SUFFIX_ENV));
162
144
if (forced_extra_defaults)
163
145
my_defaults_extra_file= (char *) forced_extra_defaults;
165
147
if (forced_default_file)
166
148
my_defaults_file= forced_default_file;
170
152
load_defaults() as otherwise we can't know the type of 'func_ctx'
173
if (my_defaults_group_suffix && (func == handle_default_option))
155
if (my_defaults_group_suffix && func == handle_default_option)
175
157
/* Handle --defaults-group-suffix= */
177
159
const char **extra_groups;
178
const size_t instance_len= strlen(my_defaults_group_suffix);
160
const uint32_t instance_len= strlen(my_defaults_group_suffix);
179
161
struct handle_option_ctx *ctx= (struct handle_option_ctx*) func_ctx;
181
163
TYPELIB *group= ctx->group;
184
(const char**)ctx->alloc->alloc_root(
166
(const char**)alloc_root(ctx->alloc,
185
167
(2*group->count+1)*sizeof(char*))))
188
170
for (i= 0; i < group->count; i++)
191
173
extra_groups[i]= group->type_names[i]; /** copy group */
193
175
len= strlen(extra_groups[i]);
194
if (!(ptr= (char *)ctx->alloc->alloc_root( len+instance_len+1)))
176
if (!(ptr= alloc_root(ctx->alloc, len+instance_len+1)))
197
179
extra_groups[i+group->count]= ptr;
199
181
/** Construct new group */
200
182
memcpy(ptr, extra_groups[i], len);
201
183
memcpy(ptr+len, my_defaults_group_suffix, instance_len+1);
204
186
group->count*= 2;
205
187
group->type_names= extra_groups;
206
188
group->type_names[group->count]= 0;
209
191
if (forced_default_file)
211
193
if ((error= search_default_file_with_ext(func, func_ctx, "", "",
278
261
1 - error occured
281
int handle_default_option(void *in_ctx, const char *group_name,
264
static int handle_default_option(void *in_ctx, const char *group_name,
285
268
struct handle_option_ctx *ctx= (struct handle_option_ctx *) in_ctx;
290
273
if (find_type((char *)group_name, ctx->group, 3))
292
if (!(tmp= (char *)ctx->alloc->alloc_root(strlen(option) + 1)))
275
if (!(tmp= alloc_root(ctx->alloc, strlen(option) + 1)))
294
277
if (insert_dynamic(ctx->args, (unsigned char*) &tmp))
279
my_stpcpy(tmp, option);
324
307
int org_argc= argc, prev_argc= 0;
325
308
*defaults= *extra_defaults= *group_suffix= 0;
327
const std::string DEFAULTS_FILE("--defaults-file=");
328
const std::string DEFAULTS_EXTRA_FILE("--defaults-extra-file=");
329
const std::string DEFAULTS_GROUP_SUFFIX("--defaults-group-suffix=");
331
310
while (argc >= 2 && argc != prev_argc)
333
312
/* Skip program name or previously handled argument */
335
314
prev_argc= argc; /* To check if we found */
336
if (!*defaults && (strncmp(*argv,
337
DEFAULTS_FILE.c_str(),
338
DEFAULTS_FILE.size()) == 0))
315
if (!*defaults && is_prefix(*argv,"--defaults-file="))
340
*defaults= *argv + DEFAULTS_FILE.size();
317
*defaults= *argv + sizeof("--defaults-file=")-1;
344
if (!*extra_defaults && (strncmp(*argv,
345
DEFAULTS_EXTRA_FILE.c_str(),
346
DEFAULTS_EXTRA_FILE.size()) == 0))
321
if (!*extra_defaults && is_prefix(*argv,"--defaults-extra-file="))
348
*extra_defaults= *argv + DEFAULTS_EXTRA_FILE.size();
323
*extra_defaults= *argv + sizeof("--defaults-extra-file=")-1;
352
if (!*group_suffix && (strncmp(*argv,
353
DEFAULTS_GROUP_SUFFIX.c_str(),
354
DEFAULTS_GROUP_SUFFIX.size()) == 0))
327
if (!*group_suffix && is_prefix(*argv, "--defaults-group-suffix="))
357
*group_suffix= *argv + DEFAULTS_GROUP_SUFFIX.size();
329
*group_suffix= *argv + sizeof("--defaults-group-suffix=")-1;
400
372
DYNAMIC_ARRAY args;
374
bool found_print_defaults= 0;
402
375
uint32_t args_used= 0;
404
memory::Root alloc(512);
406
379
struct handle_option_ctx ctx;
408
381
init_default_directories();
382
init_alloc_root(&alloc,512,0);
410
384
Check if the user doesn't want any default option processing
411
385
--no-defaults is always the first option
415
389
/* remove the --no-defaults argument and return only the other arguments */
417
if (!(ptr=(char*) alloc.alloc_root(sizeof(alloc)+ (*argc + 1)*sizeof(char*))))
391
if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+
392
(*argc + 1)*sizeof(char*))))
419
394
res= (char**) (ptr+sizeof(alloc));
420
memset(res,0,(*argc + 1));
421
395
res[0]= **argv; /* Copy program name */
422
for (i=2 ; i < (uint32_t) *argc ; i++)
396
for (i=2 ; i < (uint) *argc ; i++)
423
397
res[i-1]=argv[0][i];
424
398
res[i-1]=0; /* End pointer */
427
*(memory::Root*) ptr= alloc; /* Save alloc root for free */
401
*(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */
448
422
Here error contains <> 0 only if we have a fully specified conf_file
449
423
or a forced default file
451
if (!(ptr=(char*) alloc.alloc_root(sizeof(alloc)+ (args.elements + *argc +1) *sizeof(char*))))
425
if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+
426
(args.elements + *argc +1) *sizeof(char*))))
453
428
res= (char**) (ptr+sizeof(alloc));
463
438
Check if we wan't to see the new argument list
464
439
This options must always be the last of the default options
441
if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults"))
443
found_print_defaults=1;
444
--*argc; ++*argv; /* skip argument */
467
448
memcpy(res+1+args.elements, *argv + 1, (*argc-1)*sizeof(char*));
468
449
res[args.elements+ *argc]=0; /* last null */
470
(*argc)+=int(args.elements);
471
*argv= static_cast<char**>(res);
472
*(memory::Root*) ptr= alloc; /* Save alloc root for free */
451
(*argc)+=args.elements;
453
*(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */
473
454
delete_dynamic(&args);
455
if (found_print_defaults)
458
printf("%s would have been started with the following arguments:\n",
460
for (i=1 ; i < *argc ; i++)
461
printf("%s ", (*argv)[i]);
478
468
fprintf(stderr,"Fatal error in defaults handling. Program aborted\n");
470
return 0; /* Keep compiler happy */
483
474
void free_defaults(char **argv)
486
477
memcpy(&ptr, (char*) argv - sizeof(ptr), sizeof(ptr));
487
ptr.free_root(MYF(0));
478
free_root(&ptr,MYF(0));
567
558
search_default_file_with_ext()
568
559
opt_handler Option handler function. It is used to process
569
560
every separate option.
570
handler_ctx Pointer to the structure to store actual
561
handler_ctx Pointer to the structure to store actual
571
562
parameters of the function.
572
563
dir directory to read
573
564
ext Extension for configuration file
605
599
end=convert_dirname(name, dir, NULL);
606
600
if (dir[0] == FN_HOMELIB) /* Add . to filenames in home */
608
sprintf(end,"%s%s",config_file,ext);
602
strxmov(end,config_file,ext,NULL);
612
strcpy(name,config_file);
606
my_stpcpy(name,config_file);
614
608
fn_format(name,name,"","",4);
620
614
Ignore world-writable regular files.
621
615
This is mainly done to protect us to not read a file created by
622
the mysqld server, but the check is still valid in most context.
616
the mysqld server, but the check is still valid in most context.
624
618
if ((stat_info.st_mode & S_IWOTH) &&
625
619
(stat_info.st_mode & S_IFMT) == S_IFREG)
632
if (!(fp= fopen(name, "r")))
626
if (!(fp= my_fopen(name, O_RDONLY, MYF(0))))
633
627
return 1; /* Ignore wrong files */
635
memset(buff,0,sizeof(buff));
636
629
while (fgets(buff, sizeof(buff) - 1, fp))
649
642
if (recursion_level >= max_recursion_level)
651
for (end= ptr + strlen(ptr) - 1;
644
for (end= ptr + strlen(ptr) - 1;
652
645
my_isspace(&my_charset_utf8_general_ci, *(end - 1));
673
666
ptr, name, line)))
676
CachedDirectory dir_cache(ptr);
678
if (dir_cache.fail())
682
* Since clients still use this code, we use fprintf here.
683
* This fprintf needs to be turned into errmsg_printf
684
* as soon as the client programs no longer use mysys
685
* and can use the pluggable error message system.
687
fprintf(stderr, _("error: could not open directory: %s\n"), ptr);
669
if (!(search_dir= my_dir(ptr, MYF(MY_WME))))
691
CachedDirectory::Entries files= dir_cache.getEntries();
692
CachedDirectory::Entries::iterator file_iter= files.begin();
694
while (file_iter != files.end())
672
for (i= 0; i < (uint) search_dir->number_off_files; i++)
696
CachedDirectory::Entry *entry= *file_iter;
697
ext= fn_ext(entry->filename.c_str());
674
search_file= search_dir->dir_entry + i;
675
ext= fn_ext(search_file->name);
699
677
/* check extension */
700
678
for (tmp_ext= (char**) f_extensions; *tmp_ext; tmp_ext++)
702
680
if (!strcmp(ext, *tmp_ext))
704
fn_format(tmp, entry->filename.c_str(), ptr, "",
705
MY_UNPACK_FILENAME | MY_SAFE_PATH);
707
search_default_file_with_ext(opt_handler, handler_ctx, "", "",
708
tmp, recursion_level + 1);
686
fn_format(tmp, search_file->name, ptr, "",
687
MY_UNPACK_FILENAME | MY_SAFE_PATH);
689
search_default_file_with_ext(opt_handler, handler_ctx, "", "", tmp,
690
recursion_level + 1);
694
my_dirend(search_dir);
715
696
else if ((!strncmp(ptr, include_keyword, sizeof(include_keyword) - 1)) &&
716
697
my_isspace(&my_charset_utf8_general_ci, ptr[sizeof(include_keyword)-1]))
741
722
for ( ; my_isspace(&my_charset_utf8_general_ci,end[-1]) ; end--) ;
744
strncpy(curr_gr, ptr, min((size_t) (end-ptr)+1, sizeof(curr_gr)-1));
745
curr_gr[min((size_t)(end-ptr)+1, sizeof(curr_gr)-1)] = '\0';
725
strmake(curr_gr, ptr, cmin((size_t) (end-ptr)+1, sizeof(curr_gr)-1));
747
727
/* signal that a new group is found */
748
728
opt_handler(handler_ctx, curr_gr, NULL);
761
741
end= remove_end_comment(ptr);
762
742
if ((value= strchr(ptr, '=')))
763
743
end= value; /* Option without argument */
764
for ( ; my_isspace(&my_charset_utf8_general_ci,end[-1]) || end[-1]== '\n'; end--) ;
744
for ( ; my_isspace(&my_charset_utf8_general_ci,end[-1]) ; end--) ;
767
strncpy(strcpy(option,"--")+2,ptr,strlen(ptr)+1);
747
strmake(my_stpcpy(option,"--"),ptr, (size_t) (end-ptr));
768
748
if (opt_handler(handler_ctx, curr_gr, option))
775
755
for (value++ ; my_isspace(&my_charset_utf8_general_ci,*value); value++) ;
776
756
value_end= strchr(value, '\0');
778
We don't have to test for value_end >= value as we know there is
758
We don't have to test for value_end >= value as we know there is
781
761
for ( ; my_isspace(&my_charset_utf8_general_ci,value_end[-1]) ; value_end--) ;
782
762
if (value_end < value) /* Empty string */
785
765
/* remove quotes around argument */
786
766
if ((*value == '\"' || *value == '\'') && /* First char is quote */
787
767
(value + 1 < value_end ) && /* String is longer than 1 */
788
768
*value == value_end[-1] ) /* First char is equal to last char */
794
memset(option,0,2+(size_t)(end-ptr)+1);
795
ptr= strncpy(strcpy(option,"--")+2,ptr,(size_t) (end-ptr));
773
ptr=my_stpncpy(my_stpcpy(option,"--"),ptr,(size_t) (end-ptr));
800
776
for ( ; value != value_end; value++)
905
880
end= convert_dirname(name, pos, NULL);
906
881
if (name[0] == FN_HOMELIB) /* Add . to filenames in home */
908
sprintf(end,"%s%s ",conf_file, *ext);
883
strxmov(end, conf_file, *ext, " ", NULL);
909
884
fputs(name,stdout);
938
913
puts("\nThe following options may be given as the first argument:\n\
939
--no-defaults Don't read default options from any options file\n\
940
--defaults-file=# Only read default options from the given file #\n\
941
--defaults-extra-file=# Read this file after the global files are read");
914
--print-defaults Print the program argument list and exit\n\
915
--no-defaults Don't read default options from any options file\n\
916
--defaults-file=# Only read default options from the given file #\n\
917
--defaults-extra-file=# Read this file after the global files are read");
975
951
memset(default_directories, 0, sizeof(default_directories));
976
952
ADD_DIRECTORY("/etc/");
977
ADD_DIRECTORY("/etc/drizzle/");
978
ADD_DIRECTORY(SYSCONFDIR);
953
ADD_DIRECTORY("/etc/mysql/");
954
#if defined(DEFAULT_SYSCONFDIR)
955
ADD_DIRECTORY(DEFAULT_SYSCONFDIR);
979
957
ADD_COMMON_DIRECTORIES();
980
958
ADD_DIRECTORY("~/");
983
} /* namespace internal */
984
} /* namespace drizzled */