2 * Copyright (c) 2006, 2011 Red Hat, Inc.
6 * Author: Patrick Caulfield (pcaulfie@redhat.com)
7 * Jan Friesse (jfriesse@redhat.com)
9 * This software licensed under BSD license, the text of which follows:
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions are met:
14 * - Redistributions of source code must retain the above copyright notice,
15 * this list of conditions and the following disclaimer.
16 * - Redistributions in binary form must reproduce the above copyright notice,
17 * this list of conditions and the following disclaimer in the documentation
18 * and/or other materials provided with the distribution.
19 * - Neither the name of the MontaVista Software, Inc. nor the names of its
20 * contributors may be used to endorse or promote products derived from this
21 * software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
33 * THE POSSIBILITY OF SUCH DAMAGE.
38 #include <sys/types.h>
40 #include <sys/socket.h>
43 #include <netinet/in.h>
44 #include <arpa/inet.h>
57 #include <corosync/list.h>
58 #include <qb/qbutil.h>
59 #define LOGSYS_UTILS_ONLY 1
60 #include <corosync/logsys.h>
61 #include <corosync/icmap.h>
69 PARSER_CB_SECTION_START
,
70 PARSER_CB_SECTION_END
,
74 typedef int (*parser_cb_f
)(const char *path
,
77 enum parser_cb_type type
,
78 const char **error_string
,
81 enum main_cp_cb_data_state
{
82 MAIN_CP_CB_DATA_STATE_NORMAL
,
83 MAIN_CP_CB_DATA_STATE_TOTEM
,
84 MAIN_CP_CB_DATA_STATE_INTERFACE
,
85 MAIN_CP_CB_DATA_STATE_LOGGER_SUBSYS
,
86 MAIN_CP_CB_DATA_STATE_UIDGID
,
87 MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON
,
88 MAIN_CP_CB_DATA_STATE_MEMBER
,
89 MAIN_CP_CB_DATA_STATE_QUORUM
,
92 struct key_value_list_item
{
95 struct list_head list
;
98 struct main_cp_cb_data
{
99 enum main_cp_cb_data_state state
;
108 struct list_head logger_subsys_items_head
;
110 char *logging_daemon_name
;
111 struct list_head member_items_head
;
114 static int read_config_file_into_icmap(
115 const char **error_string
);
116 static char error_string_response
[512];
118 static int uid_determine (const char *req_user
)
121 struct passwd passwd
;
122 struct passwd
* pwdptr
= &passwd
;
123 struct passwd
* temp_pwd_pt
;
127 pwdlinelen
= sysconf (_SC_GETPW_R_SIZE_MAX
);
129 if (pwdlinelen
== -1) {
133 pwdbuffer
= malloc (pwdlinelen
);
135 if ((getpwnam_r (req_user
, pwdptr
, pwdbuffer
, pwdlinelen
, &temp_pwd_pt
)) != 0) {
136 sprintf (error_string_response
,
137 "The '%s' user is not found in /etc/passwd, please read the documentation.",
141 pw_uid
= passwd
.pw_uid
;
147 static int gid_determine (const char *req_group
)
149 int corosync_gid
= 0;
151 struct group
* grpptr
= &group
;
152 struct group
* temp_grp_pt
;
156 grplinelen
= sysconf (_SC_GETGR_R_SIZE_MAX
);
158 if (grplinelen
== -1) {
162 grpbuffer
= malloc (grplinelen
);
164 if ((getgrnam_r (req_group
, grpptr
, grpbuffer
, grplinelen
, &temp_grp_pt
)) != 0) {
165 sprintf (error_string_response
,
166 "The '%s' group is not found in /etc/group, please read the documentation.",
170 corosync_gid
= group
.gr_gid
;
175 static char *strchr_rs (const char *haystack
, int byte
)
177 const char *end_address
= strchr (haystack
, byte
);
179 end_address
+= 1; /* skip past { or = */
181 while (*end_address
== ' ' || *end_address
== '\t')
185 return ((char *) end_address
);
188 int coroparse_configparse (const char **error_string
)
190 if (read_config_file_into_icmap(error_string
)) {
197 static char *remove_whitespace(char *string
)
203 while (*start
== ' ' || *start
== '\t')
206 end
= start
+(strlen(start
))-1;
207 while ((*end
== ' ' || *end
== '\t' || *end
== ':' || *end
== '{') && end
> start
)
217 static int parse_section(FILE *fp
,
219 const char **error_string
,
220 parser_cb_f parser_cb
,
227 char new_keyname
[ICMAP_KEYNAME_MAXLEN
];
229 if (strcmp(path
, "") == 0) {
230 parser_cb("", NULL
, NULL
, PARSER_CB_START
, error_string
, user_data
);
233 while (fgets (line
, sizeof (line
), fp
)) {
234 if (strlen(line
) > 0) {
235 if (line
[strlen(line
) - 1] == '\n')
236 line
[strlen(line
) - 1] = '\0';
237 if (strlen (line
) > 0 && line
[strlen(line
) - 1] == '\r')
238 line
[strlen(line
) - 1] = '\0';
241 * Clear out white space and tabs
243 for (i
= strlen (line
) - 1; i
> -1; i
--) {
244 if (line
[i
] == '\t' || line
[i
] == ' ') {
252 for (i
= 0; i
< strlen (line
); i
++) {
253 if (line
[i
] != '\t' && line
[i
] != ' ') {
261 * Clear out comments and empty lines
268 if ((loc
= strchr_rs (line
, '{'))) {
269 char *section
= remove_whitespace(line
);
274 strcpy(new_keyname
, path
);
275 if (strcmp(path
, "") != 0) {
276 strcat(new_keyname
, ".");
278 strcat(new_keyname
, section
);
280 if (!parser_cb(new_keyname
, NULL
, NULL
, PARSER_CB_SECTION_START
, error_string
, user_data
)) {
284 if (parse_section(fp
, new_keyname
, error_string
, parser_cb
, user_data
))
289 if ((loc
= strchr_rs (line
, ':'))) {
294 key
= remove_whitespace(line
);
295 value
= remove_whitespace(loc
);
297 strcpy(new_keyname
, path
);
298 if (strcmp(path
, "") != 0) {
299 strcat(new_keyname
, ".");
301 strcat(new_keyname
, key
);
303 if (!parser_cb(new_keyname
, key
, value
, PARSER_CB_ITEM
, error_string
, user_data
)) {
308 if (strchr_rs (line
, '}')) {
309 if (!parser_cb(path
, NULL
, NULL
, PARSER_CB_SECTION_END
, error_string
, user_data
)) {
317 if (strcmp(path
, "") != 0) {
318 *error_string
= "Missing closing brace";
322 if (strcmp(path
, "") == 0) {
323 parser_cb("", NULL
, NULL
, PARSER_CB_END
, error_string
, user_data
);
329 static int main_config_parser_cb(const char *path
,
332 enum parser_cb_type type
,
333 const char **error_string
,
338 char key_name
[ICMAP_KEYNAME_MAXLEN
];
339 struct main_cp_cb_data
*data
= (struct main_cp_cb_data
*)user_data
;
340 struct key_value_list_item
*kv_item
;
341 struct list_head
*iter
, *iter_next
;
345 case PARSER_CB_START
:
346 memset(data
, 0, sizeof(struct main_cp_cb_data
));
347 data
->state
= MAIN_CP_CB_DATA_STATE_NORMAL
;
354 switch (data
->state
) {
355 case MAIN_CP_CB_DATA_STATE_NORMAL
:
357 case MAIN_CP_CB_DATA_STATE_QUORUM
:
358 if ((strcmp(path
, "quorum.expected_votes") == 0) ||
359 (strcmp(path
, "quorum.votes") == 0) ||
360 (strcmp(path
, "quorum.quorumdev_poll") == 0) ||
361 (strcmp(path
, "quorum.last_man_standing_window") == 0) ||
362 (strcmp(path
, "quorum.leaving_timeout") == 0)) {
364 icmap_set_uint32(path
, i
);
368 if ((strcmp(path
, "quorum.two_node") == 0) ||
369 (strcmp(path
, "quorum.wait_for_all") == 0) ||
370 (strcmp(path
, "quorum.auto_tie_breaker") == 0) ||
371 (strcmp(path
, "quorum.last_man_standing") == 0) ||
372 (strcmp(path
, "quorum.quorate") == 0)) {
374 icmap_set_uint8(path
, i
);
378 case MAIN_CP_CB_DATA_STATE_TOTEM
:
379 if ((strcmp(path
, "totem.version") == 0) ||
380 (strcmp(path
, "totem.nodeid") == 0) ||
381 (strcmp(path
, "totem.threads") == 0) ||
382 (strcmp(path
, "totem.token") == 0) ||
383 (strcmp(path
, "totem.token_retransmit") == 0) ||
384 (strcmp(path
, "totem.hold") == 0) ||
385 (strcmp(path
, "totem.token_retransmits_before_loss_const") == 0) ||
386 (strcmp(path
, "totem.join") == 0) ||
387 (strcmp(path
, "totem.send_join") == 0) ||
388 (strcmp(path
, "totem.consensus") == 0) ||
389 (strcmp(path
, "totem.merge") == 0) ||
390 (strcmp(path
, "totem.downcheck") == 0) ||
391 (strcmp(path
, "totem.fail_recv_const") == 0) ||
392 (strcmp(path
, "totem.seqno_unchanged_const") == 0) ||
393 (strcmp(path
, "totem.rrp_token_expired_timeout") == 0) ||
394 (strcmp(path
, "totem.rrp_problem_count_timeout") == 0) ||
395 (strcmp(path
, "totem.rrp_problem_count_threshold") == 0) ||
396 (strcmp(path
, "totem.rrp_problem_count_mcast_threshold") == 0) ||
397 (strcmp(path
, "totem.rrp_autorecovery_check_timeout") == 0) ||
398 (strcmp(path
, "totem.heartbeat_failures_allowed") == 0) ||
399 (strcmp(path
, "totem.max_network_delay") == 0) ||
400 (strcmp(path
, "totem.window_size") == 0) ||
401 (strcmp(path
, "totem.max_messages") == 0) ||
402 (strcmp(path
, "totem.miss_count_const") == 0) ||
403 (strcmp(path
, "totem.netmtu") == 0)) {
405 icmap_set_uint32(path
, i
);
410 case MAIN_CP_CB_DATA_STATE_INTERFACE
:
411 if (strcmp(path
, "totem.interface.ringnumber") == 0) {
412 data
->ringnumber
= atoi(value
);
415 if (strcmp(path
, "totem.interface.bindnetaddr") == 0) {
416 data
->bindnetaddr
= strdup(value
);
419 if (strcmp(path
, "totem.interface.mcastaddr") == 0) {
420 data
->mcastaddr
= strdup(value
);
423 if (strcmp(path
, "totem.interface.broadcast") == 0) {
424 data
->broadcast
= strdup(value
);
427 if (strcmp(path
, "totem.interface.mcastport") == 0) {
428 data
->mcastport
= atoi(value
);
429 if (data
->mcastport
< 0 || data
->mcastport
> 65535) {
430 *error_string
= "Invalid multicast port (should be 0..65535)";
436 if (strcmp(path
, "totem.interface.ttl") == 0) {
437 data
->ttl
= atoi(value
);
438 if (data
->ttl
< 0 || data
->ttl
> 255) {
439 *error_string
= "Invalid TTL (should be 0..255)";
446 case MAIN_CP_CB_DATA_STATE_LOGGER_SUBSYS
:
447 if (strcmp(key
, "subsys") == 0) {
448 data
->subsys
= strdup(value
);
449 if (data
->subsys
== NULL
) {
450 *error_string
= "Can't alloc memory";
455 kv_item
= malloc(sizeof(*kv_item
));
456 if (kv_item
== NULL
) {
457 *error_string
= "Can't alloc memory";
461 memset(kv_item
, 0, sizeof(*kv_item
));
463 kv_item
->key
= strdup(key
);
464 kv_item
->value
= strdup(value
);
465 if (kv_item
->key
== NULL
|| kv_item
->value
== NULL
) {
467 *error_string
= "Can't alloc memory";
471 list_init(&kv_item
->list
);
472 list_add(&kv_item
->list
, &data
->logger_subsys_items_head
);
476 case MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON
:
477 if (strcmp(key
, "subsys") == 0) {
478 data
->subsys
= strdup(value
);
479 if (data
->subsys
== NULL
) {
480 *error_string
= "Can't alloc memory";
484 } else if (strcmp(key
, "name") == 0) {
485 data
->logging_daemon_name
= strdup(value
);
486 if (data
->logging_daemon_name
== NULL
) {
487 *error_string
= "Can't alloc memory";
492 kv_item
= malloc(sizeof(*kv_item
));
493 if (kv_item
== NULL
) {
494 *error_string
= "Can't alloc memory";
498 memset(kv_item
, 0, sizeof(*kv_item
));
500 kv_item
->key
= strdup(key
);
501 kv_item
->value
= strdup(value
);
502 if (kv_item
->key
== NULL
|| kv_item
->value
== NULL
) {
504 *error_string
= "Can't alloc memory";
508 list_init(&kv_item
->list
);
509 list_add(&kv_item
->list
, &data
->logger_subsys_items_head
);
513 case MAIN_CP_CB_DATA_STATE_UIDGID
:
514 if (strcmp(key
, "uid") == 0) {
515 uid
= uid_determine(value
);
517 *error_string
= error_string_response
;
520 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "uidgid.uid.%u",
522 icmap_set_uint8(key_name
, 1);
524 } else if (strcmp(key
, "gid") == 0) {
525 gid
= gid_determine(value
);
527 *error_string
= error_string_response
;
530 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "uidgid.gid.%u",
532 icmap_set_uint8(key_name
, 1);
535 *error_string
= "uidgid: Only uid and gid are allowed items";
539 case MAIN_CP_CB_DATA_STATE_MEMBER
:
540 if (strcmp(key
, "memberaddr") != 0) {
541 *error_string
= "Only memberaddr is allowed in member section";
546 kv_item
= malloc(sizeof(*kv_item
));
547 if (kv_item
== NULL
) {
548 *error_string
= "Can't alloc memory";
552 memset(kv_item
, 0, sizeof(*kv_item
));
554 kv_item
->key
= strdup(key
);
555 kv_item
->value
= strdup(value
);
556 if (kv_item
->key
== NULL
|| kv_item
->value
== NULL
) {
558 *error_string
= "Can't alloc memory";
562 list_init(&kv_item
->list
);
563 list_add(&kv_item
->list
, &data
->member_items_head
);
569 icmap_set_string(path
, value
);
572 case PARSER_CB_SECTION_START
:
573 if (strcmp(path
, "totem.interface") == 0) {
574 data
->state
= MAIN_CP_CB_DATA_STATE_INTERFACE
;
575 data
->ringnumber
= 0;
576 data
->mcastport
= -1;
578 list_init(&data
->member_items_head
);
580 if (strcmp(path
, "totem") == 0) {
581 data
->state
= MAIN_CP_CB_DATA_STATE_TOTEM
;
584 if (strcmp(path
, "logging.logger_subsys") == 0) {
585 data
->state
= MAIN_CP_CB_DATA_STATE_LOGGER_SUBSYS
;
586 list_init(&data
->logger_subsys_items_head
);
589 if (strcmp(path
, "logging.logging_daemon") == 0) {
590 data
->state
= MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON
;
591 list_init(&data
->logger_subsys_items_head
);
593 data
->logging_daemon_name
= NULL
;
595 if (strcmp(path
, "uidgid") == 0) {
596 data
->state
= MAIN_CP_CB_DATA_STATE_UIDGID
;
598 if (strcmp(path
, "totem.interface.member") == 0) {
599 data
->state
= MAIN_CP_CB_DATA_STATE_MEMBER
;
601 if (strcmp(path
, "quorum") == 0) {
602 data
->state
= MAIN_CP_CB_DATA_STATE_QUORUM
;
605 case PARSER_CB_SECTION_END
:
606 switch (data
->state
) {
607 case MAIN_CP_CB_DATA_STATE_NORMAL
:
609 case MAIN_CP_CB_DATA_STATE_INTERFACE
:
611 * Create new interface section
613 if (data
->bindnetaddr
!= NULL
) {
614 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "totem.interface.%u.bindnetaddr",
616 icmap_set_string(key_name
, data
->bindnetaddr
);
618 free(data
->bindnetaddr
);
619 data
->bindnetaddr
= NULL
;
621 *error_string
= "No bindnetaddr for interface";
626 if (data
->mcastaddr
!= NULL
) {
627 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "totem.interface.%u.mcastaddr",
629 icmap_set_string(key_name
, data
->mcastaddr
);
631 free(data
->mcastaddr
);
632 data
->mcastaddr
= NULL
;
635 if (data
->broadcast
!= NULL
) {
636 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "totem.interface.%u.broadcast",
638 icmap_set_string(key_name
, data
->broadcast
);
640 free(data
->broadcast
);
641 data
->broadcast
= NULL
;
644 if (data
->mcastport
> -1) {
645 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "totem.interface.%u.mcastport",
647 icmap_set_uint16(key_name
, data
->mcastport
);
650 if (data
->ttl
> -1) {
651 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "totem.interface.%u.ttl",
653 icmap_set_uint8(key_name
, data
->ttl
);
657 for (iter
= data
->member_items_head
.next
;
658 iter
!= &data
->member_items_head
; iter
= iter_next
) {
659 kv_item
= list_entry(iter
, struct key_value_list_item
, list
);
661 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "totem.interface.%u.member.%u",
662 data
->ringnumber
, i
);
663 icmap_set_string(key_name
, kv_item
->value
);
665 iter_next
= iter
->next
;
667 free(kv_item
->value
);
673 data
->state
= MAIN_CP_CB_DATA_STATE_TOTEM
;
675 case MAIN_CP_CB_DATA_STATE_TOTEM
:
676 data
->state
= MAIN_CP_CB_DATA_STATE_NORMAL
;
678 case MAIN_CP_CB_DATA_STATE_LOGGER_SUBSYS
:
679 if (data
->subsys
== NULL
) {
680 *error_string
= "No subsys key in logger_subsys directive";
685 for (iter
= data
->logger_subsys_items_head
.next
;
686 iter
!= &data
->logger_subsys_items_head
; iter
= iter_next
) {
687 kv_item
= list_entry(iter
, struct key_value_list_item
, list
);
689 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "logging.logger_subsys.%s.%s",
690 data
->subsys
, kv_item
->key
);
691 icmap_set_string(key_name
, kv_item
->value
);
693 iter_next
= iter
->next
;
695 free(kv_item
->value
);
700 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "logging.logger_subsys.%s.subsys",
702 icmap_set_string(key_name
, data
->subsys
);
706 data
->state
= MAIN_CP_CB_DATA_STATE_NORMAL
;
708 case MAIN_CP_CB_DATA_STATE_LOGGING_DAEMON
:
709 if (data
->logging_daemon_name
== NULL
) {
710 *error_string
= "No name key in logging_daemon directive";
715 for (iter
= data
->logger_subsys_items_head
.next
;
716 iter
!= &data
->logger_subsys_items_head
; iter
= iter_next
) {
717 kv_item
= list_entry(iter
, struct key_value_list_item
, list
);
719 if (data
->subsys
== NULL
) {
720 if (strcmp(data
->logging_daemon_name
, "corosync") == 0) {
721 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
,
725 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
,
726 "logging.logging_daemon.%s.%s",
727 data
->logging_daemon_name
, kv_item
->key
);
730 if (strcmp(data
->logging_daemon_name
, "corosync") == 0) {
731 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
,
732 "logging.logger_subsys.%s.%s",
736 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
,
737 "logging.logging_daemon.%s.%s.%s",
738 data
->logging_daemon_name
, data
->subsys
,
742 icmap_set_string(key_name
, kv_item
->value
);
744 iter_next
= iter
->next
;
746 free(kv_item
->value
);
751 if (data
->subsys
== NULL
) {
752 if (strcmp(data
->logging_daemon_name
, "corosync") != 0) {
753 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "logging.logging_daemon.%s.name",
754 data
->logging_daemon_name
);
755 icmap_set_string(key_name
, data
->logging_daemon_name
);
758 if (strcmp(data
->logging_daemon_name
, "corosync") == 0) {
759 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "logging.logger_subsys.%s.subsys",
761 icmap_set_string(key_name
, data
->subsys
);
764 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "logging.logging_daemon.%s.%s.subsys",
765 data
->logging_daemon_name
, data
->subsys
);
766 icmap_set_string(key_name
, data
->subsys
);
767 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "logging.logging_daemon.%s.%s.name",
768 data
->logging_daemon_name
, data
->subsys
);
769 icmap_set_string(key_name
, data
->logging_daemon_name
);
774 free(data
->logging_daemon_name
);
776 data
->state
= MAIN_CP_CB_DATA_STATE_NORMAL
;
778 case MAIN_CP_CB_DATA_STATE_UIDGID
:
779 data
->state
= MAIN_CP_CB_DATA_STATE_UIDGID
;
781 case MAIN_CP_CB_DATA_STATE_MEMBER
:
782 data
->state
= MAIN_CP_CB_DATA_STATE_INTERFACE
;
784 case MAIN_CP_CB_DATA_STATE_QUORUM
:
785 data
->state
= MAIN_CP_CB_DATA_STATE_NORMAL
;
794 static int uidgid_config_parser_cb(const char *path
,
797 enum parser_cb_type type
,
798 const char **error_string
,
801 char key_name
[ICMAP_KEYNAME_MAXLEN
];
805 case PARSER_CB_START
:
810 if (strcmp(path
, "uidgid.uid") == 0) {
811 uid
= uid_determine(value
);
813 *error_string
= error_string_response
;
816 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "uidgid.uid.%u",
818 icmap_set_uint8(key_name
, 1);
819 } else if (strcmp(key
, "uidgid.gid") == 0) {
820 gid
= gid_determine(value
);
822 *error_string
= error_string_response
;
825 snprintf(key_name
, ICMAP_KEYNAME_MAXLEN
, "uidgid.gid.%u",
827 icmap_set_uint8(key_name
, 1);
829 *error_string
= "uidgid: Only uid and gid are allowed items";
833 case PARSER_CB_SECTION_START
:
834 if (strcmp(path
, "uidgid") != 0) {
835 *error_string
= "uidgid: Can't add subsection different then uidgid";
839 case PARSER_CB_SECTION_END
:
846 static int read_uidgid_files_into_icmap(
847 const char **error_string
)
852 struct dirent
*dirent
;
853 struct dirent
*entry
;
854 char filename
[PATH_MAX
+ FILENAME_MAX
+ 1];
858 struct stat stat_buf
;
859 char key_name
[ICMAP_KEYNAME_MAXLEN
];
861 dirname
= COROSYSCONFDIR
"/uidgid.d";
862 dp
= opendir (dirname
);
867 len
= offsetof(struct dirent
, d_name
) + NAME_MAX
+ 1;
875 for (return_code
= readdir_r(dp
, entry
, &dirent
);
876 dirent
!= NULL
&& return_code
== 0;
877 return_code
= readdir_r(dp
, entry
, &dirent
)) {
879 snprintf(filename
, sizeof (filename
), "%s/%s", dirname
, dirent
->d_name
);
880 stat (filename
, &stat_buf
);
881 if (S_ISREG(stat_buf
.st_mode
)) {
883 fp
= fopen (filename
, "r");
884 if (fp
== NULL
) continue;
888 res
= parse_section(fp
, key_name
, error_string
, uidgid_config_parser_cb
, NULL
);
905 /* Read config file and load into icmap */
906 static int read_config_file_into_icmap(
907 const char **error_string
)
910 const char *filename
;
911 char *error_reason
= error_string_response
;
913 char key_name
[ICMAP_KEYNAME_MAXLEN
];
914 struct main_cp_cb_data data
;
916 filename
= getenv ("COROSYNC_MAIN_CONFIG_FILE");
918 filename
= COROSYSCONFDIR
"/corosync.conf";
920 fp
= fopen (filename
, "r");
923 const char *error_ptr
= qb_strerror_r(errno
, error_str
, sizeof(error_str
));
924 snprintf (error_reason
, sizeof(error_string_response
),
925 "Can't read file %s reason = (%s)\n",
926 filename
, error_ptr
);
927 *error_string
= error_reason
;
933 res
= parse_section(fp
, key_name
, error_string
, main_config_parser_cb
, &data
);
938 res
= read_uidgid_files_into_icmap(error_string
);
942 snprintf (error_reason
, sizeof(error_string_response
),
943 "Successfully read main configuration file '%s'.\n", filename
);
944 *error_string
= error_reason
;