int gtmsource_mode_change(int to_mode) { uint4 savepid; int exit_status; int status, detach_status, remove_status; int log_fd = 0, close_status = 0; char* err_code; int save_errno; sgmnt_addrs *repl_csa; assert(holds_sem[SOURCE][JNL_POOL_ACCESS_SEM]); repl_log(stdout, TRUE, TRUE, "Initiating %s operation on source server pid [%d] for secondary instance [%s]\n", (GTMSOURCE_MODE_ACTIVE_REQUESTED == to_mode) ? "ACTIVATE" : "DEACTIVATE", jnlpool.gtmsource_local->gtmsource_pid, jnlpool.gtmsource_local->secondary_instname); if ((jnlpool.gtmsource_local->mode == GTMSOURCE_MODE_ACTIVE_REQUESTED) || (jnlpool.gtmsource_local->mode == GTMSOURCE_MODE_PASSIVE_REQUESTED)) { repl_log(stderr, FALSE, TRUE, "Source Server %s already requested, not changing mode\n", (to_mode == GTMSOURCE_MODE_ACTIVE_REQUESTED) ? "ACTIVATE" : "DEACTIVATE"); return (ABNORMAL_SHUTDOWN); } if (((GTMSOURCE_MODE_ACTIVE == jnlpool.gtmsource_local->mode) && (GTMSOURCE_MODE_ACTIVE_REQUESTED == to_mode)) || ((GTMSOURCE_MODE_PASSIVE == jnlpool.gtmsource_local->mode) && (GTMSOURCE_MODE_PASSIVE_REQUESTED == to_mode))) { repl_log(stderr, FALSE, TRUE, "Source Server already %s, not changing mode\n", (to_mode == GTMSOURCE_MODE_ACTIVE_REQUESTED) ? "ACTIVE" : "PASSIVE"); return (ABNORMAL_SHUTDOWN); } assert(ROOTPRIMARY_UNSPECIFIED != gtmsource_options.rootprimary); /*check if the new log file is writable*/ if ('\0' != gtmsource_options.log_file[0] && 0 != STRCMP(jnlpool.gtmsource_local->log_file, gtmsource_options.log_file)) { OPENFILE3(gtmsource_options.log_file, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, log_fd); if (log_fd < 0) { save_errno = ERRNO; err_code = STRERROR(save_errno); gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(8) ERR_REPLLOGOPN, 6, LEN_AND_STR(gtmsource_options.log_file), LEN_AND_STR(err_code), LEN_AND_STR(NULL_DEVICE)); return (ABNORMAL_SHUTDOWN); } CLOSEFILE_IF_OPEN(log_fd, close_status); assert(close_status==0); } if ((GTMSOURCE_MODE_ACTIVE_REQUESTED == to_mode) && (ROOTPRIMARY_SPECIFIED == gtmsource_options.rootprimary) && jnlpool.jnlpool_ctl->upd_disabled) { /* ACTIVATE is specified with ROOTPRIMARY on a journal pool that was created with PROPAGATEPRIMARY. This is a * case of transition from propagating primary to root primary. Enable updates in this journal pool and append * a histinfo record to the replication instance file. The function "gtmsource_rootprimary_init" does just that. */ gtmsource_rootprimary_init(jnlpool.jnlpool_ctl->jnl_seqno); } DEBUG_ONLY(repl_csa = &FILE_INFO(jnlpool.jnlpool_dummy_reg)->s_addrs;)
int repl_log_init(repl_log_file_t log_type, int *log_fd, int *stats_fd, char *log, char *stats_log) { /* Open the log file */ char log_file_name[MAX_FN_LEN + 1], *err_code; int tmp_fd; int save_errno; int stdout_status, stderr_status; error_def(ERR_REPLLOGOPN); error_def(ERR_TEXT); if (*log == '\0') return(EREPL_LOGFILEOPEN); strcpy(log_file_name, log); if (log_type == REPL_STATISTICS_LOG) { if (strcmp(log_file_name, stats_log) != 0) strcpy(log_file_name, stats_log); else { *stats_fd = *log_fd; return(SS_NORMAL); } } OPENFILE3(log_file_name, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, tmp_fd); if (tmp_fd < 0) { if (log_type == REPL_GENERAL_LOG && *log_fd == -1 || *stats_fd == -1) { save_errno = ERRNO; err_code = STRERROR(save_errno); send_msg(VARLSTCNT(8) ERR_REPLLOGOPN, 6, LEN_AND_STR(log_file_name), LEN_AND_STR(err_code), LEN_AND_STR(NULL_DEVICE)); strcpy(log_file_name, NULL_DEVICE); if (log_type == REPL_GENERAL_LOG) strcpy(log, log_file_name); else strcpy(stats_log, log_file_name); OPENFILE(log_file_name, O_RDWR, tmp_fd); /* Should not fail */ } else { save_errno = ERRNO; err_code = STRERROR(save_errno); gtm_putmsg(VARLSTCNT(8) ERR_REPLLOGOPN, 6, LEN_AND_STR(log_file_name), LEN_AND_STR(err_code), (log_type == REPL_GENERAL_LOG) ? strlen(log) : strlen(stats_log), (log_type == REPL_GENERAL_LOG) ? log : stats_log); return(EREPL_LOGFILEOPEN); } } if (log_type == REPL_GENERAL_LOG) { int dup2_res; /* Duplicate stdout and stderr onto log file */ DUP2(tmp_fd, 1, stdout_status); if (stdout_status >= 0) { DUP2(tmp_fd, 2, stderr_status); if (stderr_status < 0) { save_errno = ERRNO; if (*log_fd != -1) { DUP2(*log_fd, 1, dup2_res); /* Restore old log file */ DUP2(*log_fd, 2, dup2_res); } } } else { save_errno = ERRNO; if (*log_fd != -1) DUP2(*log_fd, 1, dup2_res); /* Restore old log file */ } if (stdout_status >= 0 && stderr_status >= 0) { if (*log_fd != -1) close(*log_fd); *log_fd = tmp_fd; } else { err_code = STRERROR(save_errno); gtm_putmsg(VARLSTCNT(10) ERR_REPLLOGOPN, 6, LEN_AND_STR(log_file_name), LEN_AND_STR(err_code), (log_type == REPL_GENERAL_LOG) ? strlen(log) : strlen(stats_log), (log_type == REPL_GENERAL_LOG) ? log : stats_log, ERR_TEXT, 2, RTS_ERROR_LITERAL("Error in dup2")); } } else { if (*stats_fd != -1) close(*stats_fd); *stats_fd = tmp_fd; } return(SS_NORMAL); }