static void pctl_util_init_phandle_null() { int lv_status; gv_pctl_phandle_null_inited = true; lv_status = XPROCESSHANDLE_NULLIT_(&gv_pctl_phandle_null); CHK_FEIGNORE(lv_status); }
// --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // Encapsulates the PROCESSHANDLE_NULLIT_ request for the different supported // platforms - NSK, WINNT, and LINUX // // Keeps a copy of phandle in the NAProcessHandle instance and copies to // phandle input parameter to be returned to the caller. // // If an error occurs, return the appropriate file system error // --------------------------------------------------------------------------- short NAProcessHandle::nullit(SB_Phandle_Type *phandle) { Int32 err=0; err = XPROCESSHANDLE_NULLIT_( (SB_Phandle_Type *) &this->phandle_); memcpy (phandle, &this->phandle_, 20); return err; }
SB_Export short XPROCESS_GETPAIRINFO_(SB_Phandle_Type *pp_phandle, char *pp_pair, short pv_maxlen, short *pp_pair_length, SB_Phandle_Type *pp_primary_phandle, SB_Phandle_Type *pp_backup_phandle, int *pp_search, SB_Phandle_Type *pp_ancestor_phandle, char *pp_node, short pv_node_len, short pv_options, char *pp_ancestor_desc, short pv_ancestor_desc_maxlen, short *pp_ancestor_desc_len, short *pp_error_detail) { const char *WHERE = "XPROCESS_GETPAIRINFO_"; char la_name[MS_MON_MAX_PROCESS_NAME]; char *lp_name; short *lp_phandles; int lv_fserr; short lv_param; SB_Phandle_Type lv_phandle; bool lv_phandle_null; MS_Mon_Process_Info_Type lv_pi; bool lv_pi_get; bool lv_pi_ok; short lv_ret; int lv_status; SB_API_CTR (lv_zctr, XPROCESS_GETPAIRINFO_); lv_pi_get = true; lv_pi_ok = false; lp_phandles = reinterpret_cast<short *>(pp_phandle); if ((pp_phandle == NULL) || (lp_phandles[0] == -1)) lv_phandle_null = true; else lv_phandle_null = false; if (gv_ms_trace_params) { char la_phandlet[MSG_UTIL_PHANDLE_LEN]; msg_util_format_phandle(la_phandlet, pp_phandle); trace_where_printf(WHERE, "ENTER phandle=%s, pair=%p, maxlen=%d, pair-length=%p, p-phandle=%p, b-phandle=%p\n", la_phandlet, pfp(pp_pair), pv_maxlen, pfp(pp_pair_length), pfp(pp_primary_phandle), pfp(pp_backup_phandle)); trace_where_printf(WHERE, "search=%p(%d), a-phandle=%p, node=%p, nodelen=%d, options=%d, a-desc=%p, a-desc-maxlen=%d, a-desc-len=%p, err-detail=%p\n", pfp(pp_search), (pp_search != NULL) ? *pp_search : -1, pfp(pp_ancestor_phandle), pfp(pp_node), pv_node_len, pv_options, pfp(pp_ancestor_desc), pv_ancestor_desc_maxlen, pfp(pp_ancestor_desc_len), pfp(pp_error_detail)); } if (!gv_ms_calls_ok) { lv_ret = XPROC_INVSTATE; return ms_err_rtn_msg(WHERE, "msg_init() not called or shutdown", lv_ret); } lv_ret = XPROC_OK; lv_fserr = XZFIL_ERR_OK; if (pp_error_detail != NULL) *pp_error_detail = 0; // check 'legacy' parameters and reject if ((pp_search != NULL) && (*pp_search != -1)) { lv_ret = XPROC_PRM_UNSUP; lv_param = PGPI_PARAM_SEARCH; if (pp_error_detail != NULL) *pp_error_detail = lv_param; return ms_err_rtn_msg(WHERE, "search (non -1) parameter unsupported", lv_ret); } if (pp_ancestor_phandle != NULL) { lv_ret = XPROC_PRM_UNSUP; lv_param = PGPI_PARAM_ANCESTOR_PHANDLE; if (pp_error_detail != NULL) *pp_error_detail = lv_param; return ms_err_rtn_msg(WHERE, "ancestor-phandle parameter unsupported", lv_ret); } if ((pp_node != NULL) && pv_node_len) { lv_ret = XPROC_PRM_UNSUP; lv_param = PGPI_PARAM_NODE; if (pp_error_detail != NULL) *pp_error_detail = lv_param; return ms_err_rtn_msg(WHERE, "node/len parameter unsupported", lv_ret); } if (pv_options) { lv_ret = XPROC_PRM_UNSUP; lv_param = PGPI_PARAM_OPTIONS; if (pp_error_detail != NULL) *pp_error_detail = lv_param; return ms_err_rtn_msg(WHERE, "options (non-zero) parameter unsupported", lv_ret); } if ((pp_ancestor_desc != NULL) && pv_ancestor_desc_maxlen) { lv_ret = XPROC_PRM_UNSUP; lv_param = PGPI_PARAM_ANCESTOR_DESC; if (pp_error_detail != NULL) *pp_error_detail = lv_param; return ms_err_rtn_msg(WHERE, "ancestor-desc/maxlen parameter unsupported", lv_ret); } if (lv_phandle_null) { // null phandle, check pair param if (pp_pair_length == NULL) { // in // use pair name to create phandle if (pp_pair == NULL) { lv_ret = XPROC_BNDS; lv_param = PGPI_PARAM_PAIR; if (pp_error_detail != NULL) *pp_error_detail = lv_param; return ms_err_rtn_msg(WHERE, "invalid pair", lv_ret); } if (gv_ms_trace_params) trace_where_printf(WHERE, "pair=%s\n", pp_pair); lp_name = la_name; memcpy(la_name, pp_pair, sbmin(pv_maxlen, static_cast<int>(sizeof(la_name)))); if (pv_maxlen < static_cast<int>(sizeof(la_name))) la_name[pv_maxlen] = '\0'; else la_name[MS_MON_MAX_PROCESS_NAME-1] = '\0'; lv_pi_get = false; lv_fserr = msg_mon_get_process_info_detail(la_name, &lv_pi); if (lv_fserr == XZFIL_ERR_OK) { ms_util_fill_phandle_name(&lv_phandle, la_name, lv_pi.nid, lv_pi.pid #ifdef SQ_PHANDLE_VERIFIER ,lv_pi.verifier #endif ); lv_pi_ok = true; } else if (lv_fserr == XZFIL_ERR_NOTFOUND) lv_ret = XPROC_NONEXTANT; else lv_ret = XPROC_NODEDOWN; } else { // out // use our phandle and return pair lv_fserr = XPROCESSHANDLE_GETMINE_(&lv_phandle); lp_name = ms_od_map_phandle_to_name(&lv_phandle); if ((pp_pair != NULL) && (lv_fserr == XZFIL_ERR_OK)) { *pp_pair_length = static_cast<short>(strlen(lp_name)); memcpy(pp_pair, lp_name, *pp_pair_length); if (gv_ms_trace_params) trace_where_printf(WHERE, "pair=%s\n", lp_name); } if (lv_fserr != XZFIL_ERR_OK) lv_ret = XPROC_INVSTATE; } } else { lp_name = ms_od_map_phandle_to_name(pp_phandle); lv_pi_get = false; lv_fserr = msg_mon_get_process_info_detail(lp_name, &lv_pi); if (lv_fserr == XZFIL_ERR_OK) { lv_pi_ok = true; ms_util_fill_phandle_name(&lv_phandle, lp_name, lv_pi.nid, lv_pi.pid #ifdef SQ_PHANDLE_VERIFIER ,lv_pi.verifier #endif ); if (pp_pair_length != NULL) { // out *pp_pair_length = static_cast<short>(strlen(lp_name)); memcpy(pp_pair, lp_name, *pp_pair_length); if (gv_ms_trace_params) trace_where_printf(WHERE, "pair=%s\n", lp_name); } } else if (lv_fserr == XZFIL_ERR_NOTFOUND) lv_ret = XPROC_NONEXTANT; else lv_ret = XPROC_NODEDOWN; } // at this point, name pair should be setup if (lv_fserr == XZFIL_ERR_OK) { if (lv_pi_get) lv_fserr = msg_mon_get_process_info_detail(lp_name, &lv_pi); if (lv_fserr == XZFIL_ERR_OK) { lv_pi_ok = true; if (pp_primary_phandle != NULL) { ms_util_fill_phandle_name(pp_primary_phandle, lp_name, !lv_pi.backup ? lv_pi.nid : lv_pi.parent_nid, !lv_pi.backup ? lv_pi.pid : lv_pi.parent_pid #ifdef SQ_PHANDLE_VERIFIER ,!lv_pi.backup ? lv_pi.verifier : lv_pi.parent_verifier #endif ); if (gv_ms_trace_params) { char la_phandlet[MSG_UTIL_PHANDLE_LEN]; msg_util_format_phandle(la_phandlet, pp_primary_phandle); trace_where_printf(WHERE, "p-phandle=%s\n", la_phandlet); } } if (pp_backup_phandle != NULL) { if (strcmp(lv_pi.parent_name, lv_pi.process_name) == 0) ms_util_fill_phandle_name(pp_backup_phandle, lp_name, !lv_pi.backup ? lv_pi.parent_nid : lv_pi.nid, !lv_pi.backup ? lv_pi.parent_pid : lv_pi.pid #ifdef SQ_PHANDLE_VERIFIER ,!lv_pi.backup ? lv_pi.parent_verifier : lv_pi.verifier #endif ); else { lv_status = XPROCESSHANDLE_NULLIT_(pp_backup_phandle); CHK_FEIGNORE(lv_status); } if (gv_ms_trace_params) { char la_phandlet[MSG_UTIL_PHANDLE_LEN]; msg_util_format_phandle(la_phandlet, pp_backup_phandle); trace_where_printf(WHERE, "b-phandle=%s\n", la_phandlet); } } } else if (lv_fserr == XZFIL_ERR_NOTFOUND) lv_ret = XPROC_NONEXTANT; else lv_ret = XPROC_NODEDOWN; } if (lv_pi_ok) { if (strcmp(lv_pi.parent_name, lv_pi.process_name) == 0) { // process-pair if (!lv_pi.backup) { if ((lv_pi.nid == gv_ms_su_nid) && (lv_pi.pid == gv_ms_su_pid)) lv_ret = XPROC_PRIMARY; else if ((lv_pi.parent_nid == gv_ms_su_nid) && (lv_pi.parent_pid == gv_ms_su_pid)) lv_ret = XPROC_BACKUP; else lv_ret = XPROC_OK; // not the calling process } else { if ((lv_pi.nid == gv_ms_su_nid) && (lv_pi.pid == gv_ms_su_pid)) lv_ret = XPROC_BACKUP; else if ((lv_pi.parent_nid == gv_ms_su_nid) && (lv_pi.parent_pid == gv_ms_su_pid)) lv_ret = XPROC_PRIMARY; else lv_ret = XPROC_OK; // not the calling process } } else lv_ret = XPROC_SINGLE; } return ms_err_rtn_msg_noassert(WHERE, "EXIT", lv_ret); }