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"
60
41
const char *my_defaults_file=0;
61
42
const char *my_defaults_group_suffix=0;
146
128
int my_search_option_files(const char *conf_file, int *argc, char ***argv,
147
uint32_t *args_used, Process_option_func func,
129
uint *args_used, Process_option_func func,
150
132
const char **dirs, *forced_default_file, *forced_extra_defaults;
134
DBUG_ENTER("my_search_option_files");
153
136
/* Check if we want to force the use a specific default file */
154
137
*args_used+= get_defaults_options(*argc - *args_used, *argv + *args_used,
170
153
load_defaults() as otherwise we can't know the type of 'func_ctx'
173
if (my_defaults_group_suffix && (func == handle_default_option))
156
if (my_defaults_group_suffix && func == handle_default_option)
175
158
/* Handle --defaults-group-suffix= */
177
160
const char **extra_groups;
178
const size_t instance_len= strlen(my_defaults_group_suffix);
161
const uint instance_len= strlen(my_defaults_group_suffix);
179
162
struct handle_option_ctx *ctx= (struct handle_option_ctx*) func_ctx;
181
164
TYPELIB *group= ctx->group;
184
(const char**)ctx->alloc->alloc_root(
167
(const char**)alloc_root(ctx->alloc,
185
168
(2*group->count+1)*sizeof(char*))))
188
171
for (i= 0; i < group->count; i++)
191
174
extra_groups[i]= group->type_names[i]; /** copy group */
193
176
len= strlen(extra_groups[i]);
194
if (!(ptr= (char *)ctx->alloc->alloc_root( len+instance_len+1)))
177
if (!(ptr= alloc_root(ctx->alloc, len+instance_len+1)))
197
180
extra_groups[i+group->count]= ptr;
199
182
/** Construct new group */
200
183
memcpy(ptr, extra_groups[i], len);
201
184
memcpy(ptr+len, my_defaults_group_suffix, instance_len+1);
204
187
group->count*= 2;
205
188
group->type_names= extra_groups;
206
189
group->type_names[group->count]= 0;
209
192
if (forced_default_file)
211
194
if ((error= search_default_file_with_ext(func, func_ctx, "", "",
324
308
int org_argc= argc, prev_argc= 0;
325
309
*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
311
while (argc >= 2 && argc != prev_argc)
333
313
/* Skip program name or previously handled argument */
335
315
prev_argc= argc; /* To check if we found */
336
if (!*defaults && (strncmp(*argv,
337
DEFAULTS_FILE.c_str(),
338
DEFAULTS_FILE.size()) == 0))
316
if (!*defaults && is_prefix(*argv,"--defaults-file="))
340
*defaults= *argv + DEFAULTS_FILE.size();
318
*defaults= *argv + sizeof("--defaults-file=")-1;
344
if (!*extra_defaults && (strncmp(*argv,
345
DEFAULTS_EXTRA_FILE.c_str(),
346
DEFAULTS_EXTRA_FILE.size()) == 0))
322
if (!*extra_defaults && is_prefix(*argv,"--defaults-extra-file="))
348
*extra_defaults= *argv + DEFAULTS_EXTRA_FILE.size();
324
*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))
328
if (!*group_suffix && is_prefix(*argv, "--defaults-group-suffix="))
357
*group_suffix= *argv + DEFAULTS_GROUP_SUFFIX.size();
330
*group_suffix= *argv + sizeof("--defaults-group-suffix=")-1;
413
389
if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults"))
415
391
/* remove the --no-defaults argument and return only the other arguments */
417
if (!(ptr=(char*) alloc.alloc_root(sizeof(alloc)+ (*argc + 1)*sizeof(char*))))
393
if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+
394
(*argc + 1)*sizeof(char*))))
419
396
res= (char**) (ptr+sizeof(alloc));
420
memset(res,0,(*argc + 1));
421
397
res[0]= **argv; /* Copy program name */
422
for (i=2 ; i < (uint32_t) *argc ; i++)
398
for (i=2 ; i < (uint) *argc ; i++)
423
399
res[i-1]=argv[0][i];
424
400
res[i-1]=0; /* End pointer */
427
*(memory::Root*) ptr= alloc; /* Save alloc root for free */
403
*(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */
448
424
Here error contains <> 0 only if we have a fully specified conf_file
449
425
or a forced default file
451
if (!(ptr=(char*) alloc.alloc_root(sizeof(alloc)+ (args.elements + *argc +1) *sizeof(char*))))
427
if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+
428
(args.elements + *argc +1) *sizeof(char*))))
453
430
res= (char**) (ptr+sizeof(alloc));
455
432
/* copy name + found arguments + command line arguments to new array */
456
433
res[0]= argv[0][0]; /* Name MUST be set, even by embedded library */
457
memcpy(res+1, args.buffer, args.elements*sizeof(char*));
434
memcpy((uchar*) (res+1), args.buffer, args.elements*sizeof(char*));
458
435
/* Skip --defaults-xxx options */
459
436
(*argc)-= args_used;
460
437
(*argv)+= args_used;
463
440
Check if we wan't to see the new argument list
464
441
This options must always be the last of the default options
443
if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults"))
445
found_print_defaults=1;
446
--*argc; ++*argv; /* skip argument */
467
memcpy(res+1+args.elements, *argv + 1, (*argc-1)*sizeof(char*));
450
memcpy((uchar*) (res+1+args.elements), (char*) ((*argv)+1),
451
(*argc-1)*sizeof(char*));
468
452
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 */
454
(*argc)+=args.elements;
456
*(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */
473
457
delete_dynamic(&args);
458
if (found_print_defaults)
461
printf("%s would have been started with the following arguments:\n",
463
for (i=1 ; i < *argc ; i++)
464
printf("%s ", (*argv)[i]);
478
471
fprintf(stderr,"Fatal error in defaults handling. Program aborted\n");
473
return 0; /* Keep compiler happy */
483
477
void free_defaults(char **argv)
486
memcpy(&ptr, (char*) argv - sizeof(ptr), sizeof(ptr));
487
ptr.free_root(MYF(0));
480
memcpy_fixed((char*) &ptr,(char *) argv - sizeof(ptr), sizeof(ptr));
481
free_root(&ptr,MYF(0));
528
522
static char *get_argument(const char *keyword, size_t kwlen,
529
char *ptr, char *name, uint32_t line)
523
char *ptr, char *name, uint line)
533
527
/* Skip over "include / includedir keyword" and following whitespace */
535
529
for (ptr+= kwlen - 1;
536
my_isspace(&my_charset_utf8_general_ci, ptr[0]);
530
my_isspace(&my_charset_latin1, ptr[0]);
595
589
static const char include_keyword[]= "include";
596
590
const int max_recursion_level= 10;
593
my_bool found_group=0;
596
FILEINFO *search_file;
601
598
if ((dir ? strlen(dir) : 0 )+strlen(config_file) >= FN_REFLEN-3)
602
599
return 0; /* Ignore wrong paths */
605
end=convert_dirname(name, dir, NULL);
602
end=convert_dirname(name, dir, NullS);
606
603
if (dir[0] == FN_HOMELIB) /* Add . to filenames in home */
608
sprintf(end,"%s%s",config_file,ext);
605
strxmov(end,config_file,ext,NullS);
612
strcpy(name,config_file);
609
strmov(name,config_file);
614
611
fn_format(name,name,"","",4);
632
if (!(fp= fopen(name, "r")))
629
if (!(fp= my_fopen(name, O_RDONLY, MYF(0))))
633
630
return 1; /* Ignore wrong files */
635
memset(buff,0,sizeof(buff));
636
632
while (fgets(buff, sizeof(buff) - 1, fp))
639
635
/* Ignore comment and empty lines */
640
for (ptr= buff; my_isspace(&my_charset_utf8_general_ci, *ptr); ptr++)
636
for (ptr= buff; my_isspace(&my_charset_latin1, *ptr); ptr++)
643
639
if (*ptr == '#' || *ptr == ';' || !*ptr)
663
659
/* skip over `!' and following whitespace */
664
for (++ptr; my_isspace(&my_charset_utf8_general_ci, ptr[0]); ptr++)
660
for (++ptr; my_isspace(&my_charset_latin1, ptr[0]); ptr++)
667
663
if ((!strncmp(ptr, includedir_keyword,
668
664
sizeof(includedir_keyword) - 1)) &&
669
my_isspace(&my_charset_utf8_general_ci, ptr[sizeof(includedir_keyword) - 1]))
665
my_isspace(&my_charset_latin1, ptr[sizeof(includedir_keyword) - 1]))
671
667
if (!(ptr= get_argument(includedir_keyword,
672
668
sizeof(includedir_keyword),
673
669
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);
672
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())
675
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());
677
search_file= search_dir->dir_entry + i;
678
ext= fn_ext(search_file->name);
699
680
/* check extension */
700
681
for (tmp_ext= (char**) f_extensions; *tmp_ext; tmp_ext++)
702
683
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);
689
fn_format(tmp, search_file->name, ptr, "",
690
MY_UNPACK_FILENAME | MY_SAFE_PATH);
692
search_default_file_with_ext(opt_handler, handler_ctx, "", "", tmp,
693
recursion_level + 1);
697
my_dirend(search_dir);
715
699
else if ((!strncmp(ptr, include_keyword, sizeof(include_keyword) - 1)) &&
716
my_isspace(&my_charset_utf8_general_ci, ptr[sizeof(include_keyword)-1]))
700
my_isspace(&my_charset_latin1, ptr[sizeof(include_keyword)-1]))
718
702
if (!(ptr= get_argument(include_keyword,
719
703
sizeof(include_keyword), ptr,
740
724
/* Remove end space */
741
for ( ; my_isspace(&my_charset_utf8_general_ci,end[-1]) ; end--) ;
725
for ( ; my_isspace(&my_charset_latin1,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';
728
strmake(curr_gr, ptr, min((size_t) (end-ptr)+1, sizeof(curr_gr)-1));
747
730
/* signal that a new group is found */
748
731
opt_handler(handler_ctx, curr_gr, NULL);
761
744
end= remove_end_comment(ptr);
762
745
if ((value= strchr(ptr, '=')))
763
746
end= value; /* Option without argument */
764
for ( ; my_isspace(&my_charset_utf8_general_ci,end[-1]) || end[-1]== '\n'; end--) ;
747
for ( ; my_isspace(&my_charset_latin1,end[-1]) ; end--) ;
767
strncpy(strcpy(option,"--")+2,ptr,strlen(ptr)+1);
750
strmake(strmov(option,"--"),ptr, (size_t) (end-ptr));
768
751
if (opt_handler(handler_ctx, curr_gr, option))
773
756
/* Remove pre- and end space */
775
for (value++ ; my_isspace(&my_charset_utf8_general_ci,*value); value++) ;
776
value_end= strchr(value, '\0');
758
for (value++ ; my_isspace(&my_charset_latin1,*value); value++) ;
759
value_end=strend(value);
778
We don't have to test for value_end >= value as we know there is
761
We don't have to test for value_end >= value as we know there is
781
for ( ; my_isspace(&my_charset_utf8_general_ci,value_end[-1]) ; value_end--) ;
764
for ( ; my_isspace(&my_charset_latin1,value_end[-1]) ; value_end--) ;
782
765
if (value_end < value) /* Empty string */
785
768
/* remove quotes around argument */
786
769
if ((*value == '\"' || *value == '\'') && /* First char is quote */
787
770
(value + 1 < value_end ) && /* String is longer than 1 */
788
771
*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));
776
ptr=strnmov(strmov(option,"--"),ptr,(size_t) (end-ptr));
800
779
for ( ; value != value_end; value++)
902
882
pos= my_defaults_extra_file;
905
end= convert_dirname(name, pos, NULL);
885
end= convert_dirname(name, pos, NullS);
906
886
if (name[0] == FN_HOMELIB) /* Add . to filenames in home */
908
sprintf(end,"%s%s ",conf_file, *ext);
888
strxmov(end, conf_file, *ext, " ", NullS);
909
889
fputs(name,stdout);
938
918
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");
919
--print-defaults Print the program argument list and exit\n\
920
--no-defaults Don't read default options from any options file\n\
921
--defaults-file=# Only read default options from the given file #\n\
922
--defaults-extra-file=# Read this file after the global files are read");
925
#include <help_end.h>
945
929
This extra complexity is to avoid declaring 'rc' if it won't be
948
#define ADD_DIRECTORY(DIR) (void) array_append_string_unique((DIR), default_directories, \
932
#define ADD_DIRECTORY_INTERNAL(DIR) \
933
array_append_string_unique((DIR), default_directories, \
949
934
array_elements(default_directories))
936
# define ADD_DIRECTORY(DIR) (void) ADD_DIRECTORY_INTERNAL(DIR)
938
#define ADD_DIRECTORY(DIR) \
940
my_bool rc= ADD_DIRECTORY_INTERNAL(DIR); \
941
DBUG_ASSERT(rc == FALSE); /* Success */ \
951
946
#define ADD_COMMON_DIRECTORIES() \
954
if ((env= getenv("DRIZZLE_HOME"))) \
949
if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV)))) \
955
950
ADD_DIRECTORY(env); \
956
951
/* Placeholder for --defaults-extra-file=<path> */ \
957
952
ADD_DIRECTORY(""); \
967
962
3. --sysconfdir=<path> (compile-time option)
968
4. getenv("DRIZZLE_HOME")
963
4. getenv(DEFAULT_HOME_ENV)
969
964
5. --defaults-extra-file=<path> (run-time option)
973
static void init_default_directories(void)
968
static void init_default_directories_unix(void)
975
memset(default_directories, 0, sizeof(default_directories));
970
bzero((char *) default_directories, sizeof(default_directories));
976
971
ADD_DIRECTORY("/etc/");
977
ADD_DIRECTORY("/etc/drizzle/");
978
ADD_DIRECTORY(SYSCONFDIR);
972
ADD_DIRECTORY("/etc/mysql/");
973
#if defined(DEFAULT_SYSCONFDIR)
974
ADD_DIRECTORY(DEFAULT_SYSCONFDIR);
979
976
ADD_COMMON_DIRECTORIES();
980
977
ADD_DIRECTORY("~/");
983
} /* namespace internal */
984
} /* namespace drizzled */
980
static void (*init_default_directories)(void)= init_default_directories_unix;