os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/generic/tclIOSock.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 /* 
     2  * tclIOSock.c --
     3  *
     4  *	Common routines used by all socket based channel types.
     5  *
     6  * Copyright (c) 1995-1997 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: tclIOSock.c,v 1.7 2002/07/29 16:54:41 rmax Exp $
    12  */
    13 
    14 #include "tclInt.h"
    15 #include "tclPort.h"
    16 
    17 /*
    18  *---------------------------------------------------------------------------
    19  *
    20  * TclSockGetPort --
    21  *
    22  *	Maps from a string, which could be a service name, to a port.
    23  *	Used by socket creation code to get port numbers and resolve
    24  *	registered service names to port numbers.
    25  *
    26  * Results:
    27  *	A standard Tcl result.  On success, the port number is returned
    28  *	in portPtr. On failure, an error message is left in the interp's
    29  *	result.
    30  *
    31  * Side effects:
    32  *	None.
    33  *
    34  *---------------------------------------------------------------------------
    35  */
    36 
    37 int
    38 TclSockGetPort(interp, string, proto, portPtr)
    39     Tcl_Interp *interp;
    40     char *string;		/* Integer or service name */
    41     char *proto;		/* "tcp" or "udp", typically */
    42     int *portPtr;		/* Return port number */
    43 {
    44     struct servent *sp;		/* Protocol info for named services */
    45     Tcl_DString ds;
    46     CONST char *native;
    47 
    48     if (Tcl_GetInt(NULL, string, portPtr) != TCL_OK) {
    49 	/*
    50 	 * Don't bother translating 'proto' to native.
    51 	 */
    52 	 
    53 	native = Tcl_UtfToExternalDString(NULL, string, -1, &ds);
    54 	sp = getservbyname(native, proto);		/* INTL: Native. */
    55 	Tcl_DStringFree(&ds);
    56 	if (sp != NULL) {
    57 	    *portPtr = ntohs((unsigned short) sp->s_port);
    58 	    return TCL_OK;
    59 	}
    60     }
    61     if (Tcl_GetInt(interp, string, portPtr) != TCL_OK) {
    62 	return TCL_ERROR;
    63     }
    64     if (*portPtr > 0xFFFF) {
    65         Tcl_AppendResult(interp, "couldn't open socket: port number too high",
    66                 (char *) NULL);
    67 	return TCL_ERROR;
    68     }
    69     return TCL_OK;
    70 }
    71 
    72 /*
    73  *----------------------------------------------------------------------
    74  *
    75  * TclSockMinimumBuffers --
    76  *
    77  *	Ensure minimum buffer sizes (non zero).
    78  *
    79  * Results:
    80  *	A standard Tcl result.
    81  *
    82  * Side effects:
    83  *	Sets SO_SNDBUF and SO_RCVBUF sizes.
    84  *
    85  *----------------------------------------------------------------------
    86  */
    87 
    88 int
    89 TclSockMinimumBuffers(sock, size)
    90     int sock;			/* Socket file descriptor */
    91     int size;			/* Minimum buffer size */
    92 {
    93     int current;
    94     socklen_t len;
    95 
    96     len = sizeof(int);
    97     getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&current, &len);
    98     if (current < size) {
    99 	len = sizeof(int);
   100 	setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&size, len);
   101     }
   102     len = sizeof(int);
   103     getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&current, &len);
   104     if (current < size) {
   105 	len = sizeof(int);
   106 	setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&size, len);
   107     }
   108     return TCL_OK;
   109 }