ni_index ni_proplist_match( const ni_proplist pl, ni_name_const pname, ni_name_const pval ) { ni_index i; ni_index j; ni_namelist nl; for (i = 0; i < pl.nipl_len; i++) { if (ni_name_match(pname, pl.nipl_val[i].nip_name)) { if (pval == NULL) { return (i); } nl = pl.nipl_val[i].nip_val; for (j = 0; j < nl.ninl_len; j++) { if (ni_name_match(pval, nl.ninl_val[j])) { return (i); } } break; } } return (NI_INDEX_NULL); }
ni_index ni_namelist_match( const ni_namelist nl, ni_name_const nm ) { ni_index i; for (i = 0; i < nl.ninl_len; i++) { if (ni_name_match(nl.ninl_val[i], nm)) { return (i); } } return (NI_INDEX_NULL); }
static ni_status start_service(ni_name tag) { ni_name master; ni_name mastertag; ni_status status; ni_name dbname; struct in_addr inaddr; system_log(LOG_DEBUG, "directory cleanup"); dir_cleanup(tag); dir_getnames(tag, &dbname, NULL, NULL); system_log(LOG_DEBUG, "initializing server"); status = ni_init(dbname, &db_ni); ni_name_free(&dbname); if (status != NI_OK) { system_log(LOG_ERR, "ni_init failed: %s", ni_error(status)); return (status); } system_log(LOG_DEBUG, "checksum = %u", ni_getchecksum(db_ni)); /* "local" is never a clone */ if (strcmp(tag, "local")) { if (getmaster(db_ni, &master, &mastertag)) { inaddr.s_addr = getaddress(db_ni, master); if (!sys_is_my_address(&inaddr)) i_am_clone++; if (!ni_name_match(tag, mastertag)) i_am_clone++; ni_name_free(&master); ni_name_free(&mastertag); } } if (forcedIsRoot == 0) forcedIsRoot = get_forced_root(db_ni); system_log(LOG_DEBUG, "registering tag %s", tag); status = register_it(tag); return (status); }
int isnidir(char *dir, ni_name *tag) { char *s; int i; s = rindex(dir, '.'); if (s == NULL) { return (0); } for (i = 0; suffixes[i] != NULL; i++) { if (ni_name_match(s, suffixes[i])) { *tag = ni_name_dup(dir); s = rindex(*tag, '.'); *s = 0; return (1); } } return (0); }
static ni_status register_it(ni_name tag) { SVCXPRT *transp; ni_status status; unsigned udp_port; unsigned tcp_port; struct sockaddr_in addr; bool_t desktop; int ret; memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = get_port(db_ni, NULL); if ((addr.sin_port == 0) && !strcmp(tag, "local")) addr.sin_port = htons(LOCAL_PORT); desktop = is_desktop(db_ni); if (desktop) addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); transp = svcudp_bind(RPC_ANYSOCK, addr); if (transp == NULL) return NI_SYSTEMERR; ret = svc_register(transp, NI_PROG, NI_VERS, ni_prog_2, 0); if (ret == 0) { system_log(LOG_DEBUG, "udp svc_register returned %d\n", ret); return NI_SYSTEMERR; } udp_port = transp->xp_port; udp_sock = transp->xp_sock; transp = svctcp_bind(RPC_ANYSOCK, addr, NI_SENDSIZE, NI_RECVSIZE); if (transp == NULL) return NI_SYSTEMERR; ret = svc_register(transp, NI_PROG, NI_VERS, ni_prog_2, 0); if (ret == 0) { system_log(LOG_DEBUG, "tcp svc_register returned %d\n", ret); return NI_SYSTEMERR; } tcp_port = transp->xp_port; tcp_sock = transp->xp_sock; if ((forcedIsRoot == 0) && (ni_name_match(tag, "local"))) waitforparent(); if (standalone == 0) { system_log(LOG_DEBUG, "registering %s tcp %u udp %u", tag, tcp_port, udp_port); status = ni_register(tag, udp_port, tcp_port); if (status != NI_OK) { system_log(LOG_DEBUG, "ni_register: %s", tag, ni_error(status)); return (status); } } return (NI_OK); }