X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserverid.c;h=3f2c65914e37cb678f0ac783fd9a4c8de57fc762;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=fb29b468412e6f2b828f4949aacd2b222385094e;hpb=1ad1d027c752dc4193dbacb9192f92de293c9453;p=silc.git diff --git a/apps/silcd/serverid.c b/apps/silcd/serverid.c index fb29b468..3f2c6591 100644 --- a/apps/silcd/serverid.c +++ b/apps/silcd/serverid.c @@ -25,30 +25,24 @@ /* Creates a Server ID. Newly created Server ID is returned to the new_id argument. */ -void silc_id_create_server_id(int sock, SilcRng rng, SilcServerID **new_id) +void silc_id_create_server_id(const char *ip, SilcUInt16 port, SilcRng rng, + SilcServerID **new_id) { - struct sockaddr_in server; - int rval, len; - SILC_LOG_DEBUG(("Creating new Server ID")); *new_id = silc_calloc(1, sizeof(**new_id)); - /* Get IP address */ - len = sizeof(server); - rval = getsockname(sock, (struct sockaddr *)&server, &len); - if (rval < 0) { - SILC_LOG_ERROR(("Could not get IP address: %s", strerror(errno))); + /* Create the ID */ + + if (!silc_net_addr2bin(ip, (*new_id)->ip.data, + sizeof((*new_id)->ip.data))) { silc_free(*new_id); *new_id = NULL; return; } - /* Create the ID */ - /* XXX Does not support IPv6 */ - SILC_PUT32_MSB(server.sin_addr.s_addr, (*new_id)->ip.data); - (*new_id)->ip.data_len = 4; - (*new_id)->port = server.sin_port; + (*new_id)->ip.data_len = silc_net_is_ip4(ip) ? 4 : 16; + (*new_id)->port = htons(port); (*new_id)->rnd = silc_rng_get_rn16(rng); SILC_LOG_DEBUG(("New ID (%s)", silc_id_render(*new_id, SILC_ID_SERVER))); @@ -131,10 +125,8 @@ bool silc_id_create_channel_id(SilcServer server, while (1) { if (!silc_idlist_find_channel_by_id(server->local_list, *new_id, NULL)) - if (!silc_idlist_find_channel_by_id(server->global_list, - *new_id, NULL)) - break; - + break; + (*new_id)->rnd++; if (finding && (*new_id)->rnd == 0)