sm_genid.c revision 0a6b08f8
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> 67126a8a12Smrg 68126a8a12Smrg#include <time.h> 69126a8a12Smrg#define Time_t time_t 70126a8a12Smrg 71126a8a12Smrg#ifndef WIN32 72126a8a12Smrg 730a6b08f8Smrg# ifdef TCPCONN 743c15da26Smrg# include <sys/socket.h> 753c15da26Smrg# include <netinet/in.h> 763c15da26Smrg# include <arpa/inet.h> 773c15da26Smrg# define XOS_USE_NO_LOCKING 783c15da26Smrg# define X_INCLUDE_NETDB_H 793c15da26Smrg# include <X11/Xos_r.h> 803c15da26Smrg# endif 81126a8a12Smrg 82126a8a12Smrg#else /* WIN32 */ 83126a8a12Smrg 843c15da26Smrg# include <X11/Xwinsock.h> 853c15da26Smrg# include <X11/Xw32defs.h> 863c15da26Smrg# define X_INCLUDE_NETDB_H 873c15da26Smrg# define XOS_USE_MTSAFE_NETDBAPI 883c15da26Smrg# include <X11/Xos_r.h> 89126a8a12Smrg 90126a8a12Smrg#endif /* WIN32 */ 91126a8a12Smrg 92126a8a12Smrg#ifdef MNX_TCPCONN 933c15da26Smrg# include <net/gen/netdb.h> 94126a8a12Smrg 953c15da26Smrg# define TCPCONN 96126a8a12Smrg#endif 97126a8a12Smrg 98d656433aSmrg#if defined(HAVE_UUID_CREATE) 993c15da26Smrg# include <uuid.h> 100d656433aSmrg#elif defined(HAVE_LIBUUID) 1013c15da26Smrg# include <uuid/uuid.h> 102d656433aSmrg#endif 103d656433aSmrg 104126a8a12Smrg 105126a8a12Smrgchar * 106d656433aSmrgSmsGenerateClientID(SmsConn smsConn) 107126a8a12Smrg{ 108d656433aSmrg#if defined(HAVE_UUID_CREATE) 109d656433aSmrg char *id; 110d656433aSmrg char **temp; 111d656433aSmrg uuid_t uuid; 112d656433aSmrg uint32_t status; 113d656433aSmrg 114d656433aSmrg uuid_create(&uuid, &status); 115d656433aSmrg 116d656433aSmrg uuid_to_string(&uuid, &temp, &status); 117d656433aSmrg 118d656433aSmrg if ((id = malloc (strlen (temp) + 2)) != NULL) 119d656433aSmrg { 120555991fdSmrg id[0] = '2'; 121d656433aSmrg strcpy (id+1, temp); 122d656433aSmrg } 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