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