void mubexpfilnam(char *dirname, unsigned int dirlen, backup_reg_list *list) { char *c1; mstr file; char tmp_mstr_addr[MAX_FN_LEN]; file.len = MAX_FN_LEN; file.addr = tmp_mstr_addr; if (list != mu_repl_inst_reg_list) { /* Database region */ if (!mupfndfil(list->reg, &file, LOG_ERROR_TRUE)) { util_out_print("Backup not finished because of the above error.", TRUE); error_mupip = TRUE; return; } } else { /* Replication instance region */ if (!repl_inst_get_name(file.addr, (unsigned int *)&file.len, MAX_FN_LEN, issue_rts_error)) assertpro(FALSE); /* rts_error should have been issued by repl_inst_get_name */ } for (c1 = file.addr + file.len; (*c1 != '/') && (c1 != file.addr); c1--) ; list->backup_file.len = INTCAST(dirlen + (file.len - (c1 - file.addr))); list->backup_file.addr = (char *)malloc(list->backup_file.len + 1); memcpy(list->backup_file.addr, dirname, dirlen); memcpy(list->backup_file.addr + dirlen, c1, (file.len - (c1 - file.addr))); list->backup_file.addr[list->backup_file.len] = '\0'; return; }
/* * Description: * Grab ftok semaphore on replication instance file * Grab all replication semaphores for the instance (both jnlpool and recvpool) * Release ftok semaphore * Parameters: * Return Value: TRUE, if succsessful * FALSE, if fails. */ boolean_t mu_replpool_grab_sem(boolean_t immediate) { char instfilename[MAX_FN_LEN + 1]; gd_region *r_save; static gd_region *replreg; int status, save_errno; union semun semarg; struct semid_ds semstat; repl_inst_hdr repl_instance; unix_db_info *udi; unsigned int full_len; error_def(ERR_RECVPOOLSETUP); error_def(ERR_JNLPOOLSETUP); error_def(ERR_REPLFTOKSEM); error_def(ERR_TEXT); if (NULL == replreg) { r_save = gv_cur_region; mu_gv_cur_reg_init(); replreg = gv_cur_region; gv_cur_region = r_save; } jnlpool.jnlpool_dummy_reg = replreg; recvpool.recvpool_dummy_reg = replreg; if (!repl_inst_get_name(instfilename, &full_len, MAX_FN_LEN + 1, issue_rts_error)) GTMASSERT; /* rts_error should have been issued by repl_inst_get_name */ assert(full_len); memcpy((char *)replreg->dyn.addr->fname, instfilename, full_len); replreg->dyn.addr->fname_len = full_len; udi = FILE_INFO(replreg); udi->fn = (char *)replreg->dyn.addr->fname; if (!ftok_sem_get(replreg, TRUE, REPLPOOL_ID, immediate)) rts_error(VARLSTCNT(4) ERR_REPLFTOKSEM, 2, full_len, instfilename); repl_inst_read(instfilename, (off_t)0, (sm_uc_ptr_t)&repl_instance, SIZEOF(repl_inst_hdr)); /* * -------------------------- * First semaphores of jnlpool * -------------------------- */ if (-1 == (udi->semid = init_sem_set_source(IPC_PRIVATE, NUM_SRC_SEMS, RWDALL | IPC_CREAT))) { ftok_sem_release(replreg, TRUE, TRUE); rts_error(VARLSTCNT(7) ERR_JNLPOOLSETUP, 0, ERR_TEXT, 2, RTS_ERROR_LITERAL("Error creating journal pool"), REPL_SEM_ERRNO); } semarg.val = GTM_ID; if (-1 == semctl(udi->semid, SOURCE_ID_SEM, SETVAL, semarg)) { save_errno = errno; remove_sem_set(SOURCE); /* Remove what we created */ ftok_sem_release(replreg, TRUE, TRUE); rts_error(VARLSTCNT(7) ERR_JNLPOOLSETUP, 0, ERR_TEXT, 2, RTS_ERROR_LITERAL("Error with jnlpool semctl"), save_errno); } semarg.buf = &semstat; if (-1 == semctl(udi->semid, 0, IPC_STAT, semarg)) { save_errno = errno; remove_sem_set(SOURCE); /* Remove what we created */ ftok_sem_release(replreg, TRUE, TRUE); rts_error(VARLSTCNT(7) ERR_JNLPOOLSETUP, 0, ERR_TEXT, 2, RTS_ERROR_LITERAL("Error with jnlpool semctl"), save_errno); } udi->gt_sem_ctime = semarg.buf->sem_ctime; status = grab_sem_all_source(); if (0 != status) { remove_sem_set(SOURCE); /* Remove what we created */ ftok_sem_release(replreg, TRUE, TRUE); rts_error(VARLSTCNT(1) ERR_JNLPOOLSETUP); } repl_instance.jnlpool_semid = udi->semid; repl_instance.jnlpool_semid_ctime = udi->gt_sem_ctime; /* * -------------------------- * Now semaphores of recvpool * -------------------------- */ assert(NUM_SRC_SEMS == NUM_RECV_SEMS); if (-1 == (udi->semid = init_sem_set_recvr(IPC_PRIVATE, NUM_RECV_SEMS, RWDALL | IPC_CREAT))) { remove_sem_set(SOURCE); ftok_sem_release(replreg, TRUE, TRUE); rts_error(VARLSTCNT(7) ERR_RECVPOOLSETUP, 0, ERR_TEXT, 2, RTS_ERROR_LITERAL("Error creating recv pool"), REPL_SEM_ERRNO); } semarg.val = GTM_ID; if (-1 == semctl(udi->semid, RECV_ID_SEM, SETVAL, semarg)) { save_errno = errno; remove_sem_set(SOURCE); remove_sem_set(RECV); ftok_sem_release(replreg, TRUE, TRUE); rts_error(VARLSTCNT(7) ERR_RECVPOOLSETUP, 0, ERR_TEXT, 2, RTS_ERROR_LITERAL("Error with recvpool semctl"), save_errno); } semarg.buf = &semstat; if (-1 == semctl(udi->semid, 0, IPC_STAT, semarg)) /* For creation time */ { save_errno = errno; remove_sem_set(SOURCE); remove_sem_set(RECV); ftok_sem_release(replreg, TRUE, TRUE); rts_error(VARLSTCNT(7) ERR_RECVPOOLSETUP, 0, ERR_TEXT, 2, RTS_ERROR_LITERAL("Error with recvpool semctl"), save_errno); } udi->gt_sem_ctime = semarg.buf->sem_ctime; status = grab_sem_all_receive(); if (0 != status) { remove_sem_set(SOURCE); remove_sem_set(RECV); ftok_sem_release(replreg, TRUE, TRUE); rts_error(VARLSTCNT(1) ERR_RECVPOOLSETUP); } repl_instance.recvpool_semid = udi->semid; repl_instance.recvpool_semid_ctime = udi->gt_sem_ctime; /* Initialize jnlpool.repl_inst_filehdr as it is used later by gtmrecv_fetchresync() */ assert(NULL == jnlpool.repl_inst_filehdr); jnlpool.repl_inst_filehdr = (repl_inst_hdr_ptr_t)malloc(SIZEOF(repl_inst_hdr)); memcpy(jnlpool.repl_inst_filehdr, &repl_instance, SIZEOF(repl_inst_hdr)); /* Flush changes to the replication instance file header to disk */ repl_inst_write(instfilename, (off_t)0, (sm_uc_ptr_t)&repl_instance, SIZEOF(repl_inst_hdr)); /* Now release jnlpool/recvpool ftok semaphore */ if (!ftok_sem_release(replreg, FALSE, immediate)) { remove_sem_set(SOURCE); remove_sem_set(RECV); rts_error(VARLSTCNT(4) ERR_REPLFTOKSEM, 2, full_len, instfilename); } return TRUE; }