Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}
Exemple #5
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);
}