void mu_getlst(char *name, int4 size) { char *c1, *c2, *c3, *c4, rbuff[MAX_FN_LEN + 1], fbuff[MAX_FN_LEN + 1]; unsigned short rlen, flen, i; gd_region *reg; tp_region *list; boolean_t matched; error_def(ERR_MUNODBNAME); error_def(ERR_MUBCKNODIR); error_def(ERR_MUNOACTION); error_def(ERR_TEXT); mu_star_specified = FALSE; assert(size > 0); rlen = sizeof(rbuff); flen = sizeof(fbuff); if (!cli_get_str(name, rbuff, &rlen)) mupip_exit(ERR_MUNODBNAME); if (in_backup && ((!cli_get_str("SAVE_DIR", fbuff, &flen)) || (0 == flen))) mupip_exit(ERR_MUBCKNODIR); is_directory = FALSE; for (c1 = c2 = rbuff, c3 = c4 = fbuff;;) { for (; *c2 && (*c2 != ','); c2++) /* locate a reg spec */ ; if (c2 - c1 > MAX_RN_LEN) { error_mupip = TRUE; util_out_print("!UL exceeds maximum REGION name length of !UL characters.", TRUE, c2 - c1, MAX_RN_LEN); } else { /* handle the reg spec here */ if ('*' == *c1 && (1 == c2 - c1)) mu_star_specified = TRUE; matched = FALSE; for (i = 0, reg = gd_header->regions; i < gd_header->n_regions; i++, reg++) { if (TRUE == str_match((char *)reg->rname, reg->rname_len, c1, c2 - c1)) { matched = TRUE; if (NULL == (list = insert_region(reg, &(grlist), NULL, size))) { error_mupip = TRUE; rts_error(VARLSTCNT(4) ERR_TEXT, 2, RTS_ERROR_STRING("Region not found")); continue; } if ((FALSE == in_backup) || (0 != ((backup_reg_list *)list)->backup_file.len)) continue; if (TRUE == is_directory) { assert(NULL != grlist->fPtr); mubexpfilnam(directory.addr, directory.len, (backup_reg_list *)list); } else { for (; *c4 && (*c4 != ','); c4++) /* locate a file spec */ ; if (FALSE == mubgetfil((backup_reg_list *)list, c3, c4 - c3)) break; if (*c4) c3 = ++c4; else if (FALSE == is_directory) break; } } } if (!matched) { util_out_print("REGION !AD not found", TRUE, c2 - c1, c1); mupip_exit(ERR_MUNOACTION); } } if (!*c2) break; else c1 = ++c2; } return; }
bool mubgetfil(backup_reg_list *list, char *name, unsigned short len) { struct stat stat_buf; int stat_res; char temp; char tcp[5]; if (0 == len) return FALSE; if (list != mu_repl_inst_reg_list) { /* Do the following checks only if this region does NOT correspond to the replication instance region. */ if ('|' == *name) { len -= 1; list->backup_to = backup_to_exec; list->backup_file.len = len; list->backup_file.addr = (char *)malloc(len + 1); memcpy(list->backup_file.addr, name + 1, len); return TRUE; } if (len > 5) { lower_to_upper((uchar_ptr_t)tcp, (uchar_ptr_t)name, 5); if (0 == memcmp(tcp, "TCP:/", 5)) { list->backup_to = backup_to_tcp; len -= 5; name += 5; while ('/' == *name) { len--; name++; } list->backup_file.len = len; list->backup_file.addr = (char *)malloc(len + 1); memcpy(list->backup_file.addr, name, len); *(list->backup_file.addr + len) = 0; return TRUE; } } } temp = name[len]; name[len] = 0; STAT_FILE(name, &stat_buf, stat_res); if (-1 == stat_res) { if (errno != ENOENT) { util_out_print("Error accessing backup output file or directory: !AD", TRUE, len, name); mupip_exit(errno); } else { /* new file */ list->backup_file.len = len; list->backup_file.addr = (char *)malloc(len + 1); memcpy(list->backup_file.addr, name, len); *(list->backup_file.addr + len) = 0; } } else if (S_ISDIR(stat_buf.st_mode)) { if (!is_directory) { is_directory = TRUE; directory.len = len; directory.addr = (char *)malloc(len + 1); memcpy(directory.addr, name, len); *(directory.addr + len) = 0; } mubexpfilnam(name, len, list); } else { /* the file already exists */ util_out_print("File !AD already exists.", TRUE, len, name); error_mupip = TRUE; return FALSE; } name[len] = temp; return TRUE; }