sm_genid.c revision 300346ae
1126a8a12Smrg/*
2126a8a12Smrg
33c15da26SmrgCopyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
4555991fdSmrg
5555991fdSmrgPermission is hereby granted, free of charge, to any person obtaining a
6555991fdSmrgcopy of this software and associated documentation files (the "Software"),
7555991fdSmrgto deal in the Software without restriction, including without limitation
8555991fdSmrgthe rights to use, copy, modify, merge, publish, distribute, sublicense,
9555991fdSmrgand/or sell copies of the Software, and to permit persons to whom the
10555991fdSmrgSoftware is furnished to do so, subject to the following conditions:
11555991fdSmrg
12555991fdSmrgThe above copyright notice and this permission notice (including the next
13555991fdSmrgparagraph) shall be included in all copies or substantial portions of the
14555991fdSmrgSoftware.
15555991fdSmrg
16555991fdSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17555991fdSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18555991fdSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19555991fdSmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20555991fdSmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21555991fdSmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22555991fdSmrgDEALINGS IN THE SOFTWARE.
23555991fdSmrg
24555991fdSmrg*/
25555991fdSmrg/*
26555991fdSmrg
27126a8a12SmrgCopyright 1993, 1998  The Open Group
28126a8a12Smrg
29126a8a12SmrgPermission to use, copy, modify, distribute, and sell this software and its
30126a8a12Smrgdocumentation for any purpose is hereby granted without fee, provided that
31126a8a12Smrgthe above copyright notice appear in all copies and that both that
32126a8a12Smrgcopyright notice and this permission notice appear in supporting
33126a8a12Smrgdocumentation.
34126a8a12Smrg
35126a8a12SmrgThe above copyright notice and this permission notice shall be included in
36126a8a12Smrgall copies or substantial portions of the Software.
37126a8a12Smrg
38126a8a12SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
39126a8a12SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
40126a8a12SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
41126a8a12SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
42126a8a12SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
43126a8a12SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
44126a8a12Smrg
45126a8a12SmrgExcept as contained in this notice, the name of The Open Group shall not be
46126a8a12Smrgused in advertising or otherwise to promote the sale, use or other dealings
47126a8a12Smrgin this Software without prior written authorization from The Open Group.
48126a8a12Smrg
49126a8a12Smrg*/
50126a8a12Smrg
51126a8a12Smrg/*
52126a8a12Smrg * Author: Ralph Mor, X Consortium
53126a8a12Smrg */
54126a8a12Smrg
55126a8a12Smrg#ifdef WIN32
563c15da26Smrg# define _WILLWINSOCK_
57126a8a12Smrg#endif
58126a8a12Smrg#ifdef HAVE_CONFIG_H
593c15da26Smrg# include <config.h>
60126a8a12Smrg#endif
61126a8a12Smrg#include <X11/SM/SMlib.h>
62126a8a12Smrg#include "SMlibint.h"
63126a8a12Smrg#ifdef XTHREADS
643c15da26Smrg# include <X11/Xthreads.h>
65126a8a12Smrg#endif
66126a8a12Smrg#include <stdio.h>
67300346aeSmrg#include <unistd.h>
68126a8a12Smrg
69126a8a12Smrg#include <time.h>
70126a8a12Smrg#define Time_t time_t
71126a8a12Smrg
72126a8a12Smrg#ifndef WIN32
73126a8a12Smrg
740a6b08f8Smrg# ifdef TCPCONN
753c15da26Smrg#  include <sys/socket.h>
763c15da26Smrg#  include <netinet/in.h>
773c15da26Smrg#  include <arpa/inet.h>
783c15da26Smrg#  define XOS_USE_NO_LOCKING
793c15da26Smrg#  define X_INCLUDE_NETDB_H
803c15da26Smrg#  include <X11/Xos_r.h>
813c15da26Smrg# endif
82126a8a12Smrg
83126a8a12Smrg#else /* WIN32 */
84126a8a12Smrg
853c15da26Smrg# include <X11/Xwinsock.h>
863c15da26Smrg# include <X11/Xw32defs.h>
873c15da26Smrg# define X_INCLUDE_NETDB_H
883c15da26Smrg# define XOS_USE_MTSAFE_NETDBAPI
893c15da26Smrg# include <X11/Xos_r.h>
90126a8a12Smrg
91126a8a12Smrg#endif /* WIN32 */
92126a8a12Smrg
93126a8a12Smrg#ifdef MNX_TCPCONN
943c15da26Smrg# include <net/gen/netdb.h>
95126a8a12Smrg
963c15da26Smrg# define TCPCONN
97126a8a12Smrg#endif
98126a8a12Smrg
99d656433aSmrg#if defined(HAVE_UUID_CREATE)
1003c15da26Smrg# include <uuid.h>
101d656433aSmrg#elif defined(HAVE_LIBUUID)
1023c15da26Smrg# include <uuid/uuid.h>
103d656433aSmrg#endif
104d656433aSmrg
105126a8a12Smrg
106126a8a12Smrgchar *
107d656433aSmrgSmsGenerateClientID(SmsConn smsConn)
108126a8a12Smrg{
109d656433aSmrg#if defined(HAVE_UUID_CREATE)
110d656433aSmrg    char *id;
111300346aeSmrg    char *temp;
112d656433aSmrg    uuid_t uuid;
113d656433aSmrg    uint32_t status;
114300346aeSmrg    size_t len;
115d656433aSmrg
116d656433aSmrg    uuid_create(&uuid, &status);
117d656433aSmrg
118d656433aSmrg    uuid_to_string(&uuid, &temp, &status);
119d656433aSmrg
120300346aeSmrg    len = strlen(temp) + 2;
121300346aeSmrg    if ((id = malloc(len)) != NULL)
122300346aeSmrg        snprintf(id, len, "2%s", temp);
123d656433aSmrg
124d656433aSmrg    free(temp);
125d656433aSmrg
126d656433aSmrg    return id;
127d656433aSmrg#elif defined(HAVE_LIBUUID)
128d656433aSmrg    char *id;
129d656433aSmrg    char temp[256];
130d656433aSmrg    uuid_t uuid;
131d656433aSmrg
132d656433aSmrg    uuid_generate(uuid);
133d656433aSmrg
134d656433aSmrg    temp[0] = '2';
135d656433aSmrg    temp[1] = '\0';
136d656433aSmrg    uuid_unparse_lower(uuid, &temp[1]);
137d656433aSmrg
1383c15da26Smrg    id = strdup (temp);
139d656433aSmrg
140d656433aSmrg    return id;
141d656433aSmrg#else
1420a6b08f8Smrg# ifdef TCPCONN
143126a8a12Smrg    static const char hex[] = "0123456789abcdef";
144126a8a12Smrg    char hostname[256];
145126a8a12Smrg    char address[64], *addr_ptr = address;
146126a8a12Smrg    char temp[256];
147126a8a12Smrg    char *id;
148126a8a12Smrg    static int sequence = 0;
149126a8a12Smrg    char* inet_addr;
1503c15da26Smrg    char *ptr1;
151126a8a12Smrg    unsigned char decimal[4];
1520a6b08f8Smrg    int i;
153126a8a12Smrg    struct in_addr *haddr = NULL;
1543c15da26Smrg#  if defined(IPv6) && defined(AF_INET6)
155126a8a12Smrg    struct addrinfo *ai, *first_ai;
1563c15da26Smrg#  endif
1573c15da26Smrg
1583c15da26Smrg    if (gethostname (hostname, sizeof (hostname)))
1593c15da26Smrg	return (NULL);
1603c15da26Smrg
1613c15da26Smrg#  if defined(IPv6) && defined(AF_INET6)
162126a8a12Smrg    if (getaddrinfo(hostname,NULL,NULL,&ai) != 0)
163126a8a12Smrg	return NULL;
164126a8a12Smrg
165126a8a12Smrg    for (first_ai = ai; ai != NULL; ai = ai->ai_next) {
1663c15da26Smrg	if ( (ai->ai_family == AF_INET) || (ai->ai_family == AF_INET6) )
167126a8a12Smrg	    break;
168126a8a12Smrg    }
169126a8a12Smrg    if (ai == NULL) {
170126a8a12Smrg	freeaddrinfo(first_ai);
171126a8a12Smrg	return NULL;
1723c15da26Smrg    }
173126a8a12Smrg
174126a8a12Smrg    if (ai->ai_family == AF_INET6) {
175126a8a12Smrg	unsigned char *cp = (unsigned char *) &((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr.s6_addr;
1763c15da26Smrg
177126a8a12Smrg	*addr_ptr++ = '6';	/* IPv6 address code */
178126a8a12Smrg
179126a8a12Smrg	for (i = 0 ; i < 16 ; i++) {
180126a8a12Smrg            *addr_ptr++ = hex[cp[i] >> 4];
181126a8a12Smrg            *addr_ptr++ = hex[cp[i] & 0x0f];
182126a8a12Smrg	}
183126a8a12Smrg
184126a8a12Smrg        *addr_ptr++ = '\0';
185126a8a12Smrg
186126a8a12Smrg    } else { /* Fall through to IPv4 address handling */
187126a8a12Smrg	haddr = &((struct sockaddr_in *)ai->ai_addr)->sin_addr;
1883c15da26Smrg#  else
1893c15da26Smrg#   ifdef XTHREADS_NEEDS_BYNAMEPARAMS
1903c15da26Smrg	_Xgethostbynameparams hparams;
1913c15da26Smrg#   endif
1923c15da26Smrg	struct hostent *hostp;
1933c15da26Smrg
1943c15da26Smrg	if ((hostp = _XGethostbyname (hostname,hparams)) != NULL)
1953c15da26Smrg	    haddr = (struct in_addr *)(hostp->h_addr);
1963c15da26Smrg	else
1973c15da26Smrg	    return NULL;
1983c15da26Smrg#  endif
1993c15da26Smrg
2003c15da26Smrg	inet_addr = inet_ntoa (*haddr);
2013c15da26Smrg	for (i = 0, ptr1 = inet_addr; i < 3; i++)
2023c15da26Smrg	{
2033c15da26Smrg	    char temp4[4];
2043c15da26Smrg	    char *ptr2 = strchr (ptr1, '.');
2050a6b08f8Smrg	    size_t len = (size_t) (ptr2 - ptr1);
2063c15da26Smrg
2073c15da26Smrg	    if (!ptr2 || len > 3) {
2083c15da26Smrg#  if defined(IPv6) && defined(AF_INET6)
2093c15da26Smrg		freeaddrinfo(first_ai);
2103c15da26Smrg#  endif
2113c15da26Smrg		return (NULL);
2123c15da26Smrg	    }
2133c15da26Smrg	    strncpy (temp4, ptr1, len);
2143c15da26Smrg	    temp4[len] = '\0';
2150a6b08f8Smrg	    decimal[i] = (unsigned char) atoi (temp4);
2163c15da26Smrg	    ptr1 = ptr2 + 1;
217126a8a12Smrg	}
218126a8a12Smrg
2190a6b08f8Smrg	decimal[3] = (unsigned char) atoi (ptr1);
220126a8a12Smrg
2213c15da26Smrg	*addr_ptr++ = '1';
222126a8a12Smrg
2233c15da26Smrg	for (i = 0; i < 4; i++) {
2243c15da26Smrg	    *addr_ptr++ = hex[decimal[i] >> 4];
2253c15da26Smrg	    *addr_ptr++ = hex[decimal[i] & 0x0f];
2263c15da26Smrg	}
227126a8a12Smrg
2283c15da26Smrg	*addr_ptr++ = '\0';
229126a8a12Smrg
2303c15da26Smrg#  if defined(IPv6) && defined(AF_INET6)
231126a8a12Smrg    }
232126a8a12Smrg    freeaddrinfo(first_ai);
2333c15da26Smrg#  endif
234126a8a12Smrg
235126a8a12Smrg    sprintf (temp, "1%s%.13ld%.10ld%.4d", address, (long)time((Time_t*)0),
236126a8a12Smrg	     (long)getpid(), sequence);
237126a8a12Smrg
238126a8a12Smrg    if (++sequence > 9999)
239126a8a12Smrg	sequence = 0;
240126a8a12Smrg
2413c15da26Smrg    id = strdup (temp);
242126a8a12Smrg
243126a8a12Smrg    return (id);
2443c15da26Smrg# else
245126a8a12Smrg    return (NULL);
2463c15da26Smrg# endif
247d656433aSmrg#endif
248126a8a12Smrg}
249