tclUnixSock.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclUnixSock.c --
  3.  *
  4.  * This file contains Unix-specific socket related code.
  5.  *
  6.  * Copyright (c) 1995 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tclUnixSock.c,v 1.6.2.4 2006/09/07 09:01:07 vasiljevic Exp $
  12.  */
  13. #include "tcl.h"
  14. #include "tclPort.h"
  15. /*
  16.  * There is no portable macro for the maximum length
  17.  * of host names returned by gethostbyname().  We should only
  18.  * trust SYS_NMLN if it is at least 255 + 1 bytes to comply with DNS
  19.  * host name limits.
  20.  *
  21.  * Note:  SYS_NMLN is a restriction on "uname" not on gethostbyname!
  22.  *
  23.  * For example HP-UX 10.20 has SYS_NMLN == 9,  while gethostbyname()
  24.  * can return a fully qualified name from DNS of up to 255 bytes.
  25.  *
  26.  * Fix suggested by Viktor Dukhovni (viktor@esm.com)
  27.  */
  28. #if defined(SYS_NMLN) && SYS_NMLEN >= 256
  29. #define TCL_HOSTNAME_LEN SYS_NMLEN
  30. #else
  31. #define TCL_HOSTNAME_LEN 256
  32. #endif
  33. /*
  34.  * The following variable holds the network name of this host.
  35.  */
  36. static char hostname[TCL_HOSTNAME_LEN + 1];
  37. static int  hostnameInited = 0;
  38. TCL_DECLARE_MUTEX(hostMutex)
  39. /*
  40.  *----------------------------------------------------------------------
  41.  *
  42.  * Tcl_GetHostName --
  43.  *
  44.  * Returns the name of the local host.
  45.  *
  46.  * Results:
  47.  * A string containing the network name for this machine, or
  48.  * an empty string if we can't figure out the name.  The caller 
  49.  * must not modify or free this string.
  50.  *
  51.  * Side effects:
  52.  * None.
  53.  *
  54.  *----------------------------------------------------------------------
  55.  */
  56. CONST char *
  57. Tcl_GetHostName()
  58. {
  59. #ifndef NO_UNAME
  60.     struct utsname u;
  61.     struct hostent *hp;
  62. #else
  63.     char buffer[sizeof(hostname)];
  64. #endif
  65.     CONST char *native;
  66.     Tcl_MutexLock(&hostMutex);
  67.     if (hostnameInited) {
  68. Tcl_MutexUnlock(&hostMutex);
  69.         return hostname;
  70.     }
  71.     native = NULL;
  72. #ifndef NO_UNAME
  73.     (VOID *) memset((VOID *) &u, (int) 0, sizeof(struct utsname));
  74.     if (uname(&u) > -1) { /* INTL: Native. */
  75.         hp = TclpGetHostByName(u.nodename); /* INTL: Native. */
  76. if (hp == NULL) {
  77.     /*
  78.      * Sometimes the nodename is fully qualified, but gets truncated
  79.      * as it exceeds SYS_NMLN.  See if we can just get the immediate
  80.      * nodename and get a proper answer that way.
  81.      */
  82.     char *dot = strchr(u.nodename, '.');
  83.     if (dot != NULL) {
  84. char *node = ckalloc((unsigned) (dot - u.nodename + 1));
  85. memcpy(node, u.nodename, (size_t) (dot - u.nodename));
  86. node[dot - u.nodename] = '';
  87. hp = TclpGetHostByName(node);
  88. ckfree(node);
  89.     }
  90. }
  91.         if (hp != NULL) {
  92.     native = hp->h_name;
  93.         } else {
  94.     native = u.nodename;
  95.         }
  96.     }
  97. #else
  98.     /*
  99.      * Uname doesn't exist; try gethostname instead.
  100.      */
  101.     if (gethostname(buffer, sizeof(buffer)) > -1) { /* INTL: Native. */
  102. native = buffer;
  103.     }
  104. #endif
  105.     if (native == NULL) {
  106. hostname[0] = 0;
  107.     } else {
  108. Tcl_ExternalToUtf(NULL, NULL, native, -1, 0, NULL, hostname,
  109. sizeof(hostname), NULL, NULL, NULL);
  110.     }
  111.     hostnameInited = 1;
  112.     Tcl_MutexUnlock(&hostMutex);
  113.     return hostname;
  114. }
  115. /*
  116.  *----------------------------------------------------------------------
  117.  *
  118.  * TclpHasSockets --
  119.  *
  120.  * Detect if sockets are available on this platform.
  121.  *
  122.  * Results:
  123.  * Returns TCL_OK.
  124.  *
  125.  * Side effects:
  126.  * None.
  127.  *
  128.  *----------------------------------------------------------------------
  129.  */
  130. int
  131. TclpHasSockets(interp)
  132.     Tcl_Interp *interp; /* Not used. */
  133. {
  134.     return TCL_OK;
  135. }
  136. /*
  137.  *----------------------------------------------------------------------
  138.  *
  139.  * TclpFinalizeSockets --
  140.  *
  141.  * Performs per-thread socket subsystem finalization.
  142.  *
  143.  * Results:
  144.  * None.
  145.  *
  146.  * Side effects:
  147.  * None.
  148.  *
  149.  *----------------------------------------------------------------------
  150.  */
  151. void
  152. TclpFinalizeSockets()
  153. {
  154.     return;
  155. }