Annotation of sbbs/sbbs3/sockopts.c, revision 1.1.1.1

1.1       root        1: /* sockopts.c */
                      2: 
                      3: /* Set socket options based on contents of ctrl/sockopts.cfg */
                      4: 
                      5: /* $Id: sockopts.c,v 1.18 2003/05/09 01:30:41 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: 
                     40: typedef struct {
                     41:        char*   name;
                     42:        int             level;
                     43:        int             value;
                     44: } sockopt_name;
                     45: 
                     46: static const sockopt_name option_names[] = {
                     47:        { "TYPE",                               SOL_SOCKET,             SO_TYPE                         },
                     48:        { "DEBUG",                              SOL_SOCKET,             SO_DEBUG                        },
                     49:        { "LINGER",                             SOL_SOCKET,             SO_LINGER                       },
                     50:        { "SNDBUF",                             SOL_SOCKET,             SO_SNDBUF                       },
                     51:        { "RCVBUF",                             SOL_SOCKET,             SO_RCVBUF                       },
                     52:        { "SNDLOWAT",                   SOL_SOCKET,             SO_SNDLOWAT                     },
                     53:        { "RCVLOWAT",                   SOL_SOCKET,             SO_RCVLOWAT                     },
                     54:        { "SNDTIMEO",                   SOL_SOCKET,             SO_SNDTIMEO                     },
                     55:        { "RCVTIMEO",                   SOL_SOCKET,             SO_RCVTIMEO                     },
                     56:        { "REUSEADDR",                  SOL_SOCKET,             SO_REUSEADDR            },      
                     57:        { "KEEPALIVE",                  SOL_SOCKET,             SO_KEEPALIVE            },
                     58:        { "DONTROUTE",                  SOL_SOCKET,             SO_DONTROUTE            },
                     59:        { "BROADCAST",                  SOL_SOCKET,             SO_BROADCAST            },
                     60:        { "OOBINLINE",                  SOL_SOCKET,             SO_OOBINLINE            },
                     61: #ifdef SO_ACCEPTCONN                                                                                   
                     62:        { "ACCEPTCONN",                 SOL_SOCKET,             SO_ACCEPTCONN           },
                     63: #endif
                     64: 
                     65:        /* IPPROTO-level socket options */
                     66:        { "TCP_NODELAY",                IPPROTO_TCP,    TCP_NODELAY                     },
                     67:        /* The following are platform-specific */                                       
                     68: #ifdef TCP_MAXSEG                                                                                      
                     69:        { "TCP_MAXSEG",                 IPPROTO_TCP,    TCP_MAXSEG                      },
                     70: #endif                                                                                                                 
                     71: #ifdef TCP_CORK                                                                                                        
                     72:        { "TCP_CORK",                   IPPROTO_TCP,    TCP_CORK                        },
                     73: #endif                                                                                                                 
                     74: #ifdef TCP_KEEPIDLE                                                                                            
                     75:        { "TCP_KEEPIDLE",               IPPROTO_TCP,    TCP_KEEPIDLE            },
                     76: #endif                                                                                                                 
                     77: #ifdef TCP_KEEPINTVL                                                                                   
                     78:        { "TCP_KEEPINTVL",              IPPROTO_TCP,    TCP_KEEPINTVL           },
                     79: #endif                                                                                                                 
                     80: #ifdef TCP_KEEPCNT                                                                                             
                     81:        { "TCP_KEEPCNT",                IPPROTO_TCP,    TCP_KEEPCNT                     },
                     82: #endif                                                                                                                 
                     83: #ifdef TCP_SYNCNT                                                                                              
                     84:        { "TCP_SYNCNT",                 IPPROTO_TCP,    TCP_SYNCNT                      },
                     85: #endif                                                                                                                 
                     86: #ifdef TCP_LINGER2                                                                                             
                     87:        { "TCP_LINGER2",                IPPROTO_TCP,    TCP_LINGER2                     },
                     88: #endif                                                                                                         
                     89: #ifdef TCP_DEFER_ACCEPT                                                                                
                     90:        { "TCP_DEFER_ACCEPT",   IPPROTO_TCP,    TCP_DEFER_ACCEPT        },
                     91: #endif                                                                                                                 
                     92: #ifdef TCP_WINDOW_CLAMP                                                                                        
                     93:        { "TCP_WINDOW_CLAMP",   IPPROTO_TCP,    TCP_WINDOW_CLAMP        },
                     94: #endif                                                                                                         
                     95: #ifdef TCP_QUICKACK                                                                                    
                     96:        { "TCP_QUICKACK",               IPPROTO_TCP,    TCP_QUICKACK            },
                     97: #endif                                         
                     98: #ifdef TCP_NOPUSH                      
                     99:        { "TCP_NOPUSH",                 IPPROTO_TCP,    TCP_NOPUSH                      },
                    100: #endif                                         
                    101: #ifdef TCP_NOOPT                       
                    102:        { "TCP_NOOPT",                  IPPROTO_TCP,    TCP_NOOPT                       },
                    103: #endif
                    104:        { NULL }
                    105: };
                    106: 
                    107: int DLLCALL sockopt(char* str, int* level)
                    108: {
                    109:        int i;
                    110: 
                    111:        *level=SOL_SOCKET;      /* default option level */
                    112:        for(i=0;option_names[i].name;i++) {
                    113:                if(stricmp(str,option_names[i].name)==0) {
                    114:                        *level = option_names[i].level;
                    115:                        return(option_names[i].value);
                    116:                }
                    117:        }
                    118:        if(!isdigit(str[0]))    /* unknown option name */
                    119:                return(-1);
                    120:        return(strtoul(str,NULL,0));
                    121: }
                    122: 
                    123: int DLLCALL set_socket_options(scfg_t* cfg, SOCKET sock, char* error)
                    124: {
                    125:        char            cfgfile[MAX_PATH+1];
                    126:        char            str[256];
                    127:        char*           p;
                    128:        char*           name;
                    129:        BYTE*           vp;
                    130:        FILE*           fp;
                    131:        int                     option;
                    132:        int                     level;
                    133:        int                     value;
                    134:        int                     type;
                    135:        int                     result=0;
                    136:        LINGER          linger;
                    137:        socklen_t       len;
                    138: 
                    139:        /* Set user defined socket options */
                    140:        sprintf(cfgfile,"%ssockopts.cfg",cfg->ctrl_dir);
                    141:        if((fp=fopen(cfgfile,"r"))==NULL)
                    142:                return(0);
                    143: 
                    144:        len = sizeof(type);
                    145:        result=getsockopt(sock,SOL_SOCKET,SO_TYPE,(void*)&type,&len);
                    146:        if(result) {
                    147:                sprintf(error,"%d getting socket option (TYPE, %d)"
                    148:                        ,ERROR_VALUE, SO_TYPE);
                    149:                return(result);
                    150:        }
                    151: 
                    152:        while(!feof(fp)) {
                    153:                if(!fgets(str,sizeof(str),fp))
                    154:                        break;
                    155:                name=str;
                    156:                while(*name && *name<=' ') name++;
                    157:                if(*name==';' || *name==0)      /* blank line or comment */
                    158:                        continue;
                    159:                p=name;
                    160:                while(*p && *p>' ') p++;
                    161:                if(*p) *(p++)=0;
                    162:                if((option=sockopt(name,&level))==-1)
                    163:                        continue;
                    164:                if(level==IPPROTO_TCP && type!=SOCK_STREAM)
                    165:                        continue;
                    166:                while(*p && *p<=' ') p++;
                    167:                len=sizeof(value);
                    168:                value=strtol(p,NULL,0);
                    169:                vp=(BYTE*)&value;
                    170:                while(*p && *p>' ') p++;
                    171:                if(*p) p++;
                    172:                while(*p && *p<=' ') p++;
                    173:                switch(option) {
                    174:                        case SO_LINGER:
                    175:                                linger.l_onoff = value;
                    176:                                linger.l_linger = (int)strtol(p,NULL,0);
                    177:                                vp=(BYTE*)&linger;
                    178:                                len=sizeof(linger);
                    179:                                break;
                    180:                        case SO_KEEPALIVE:
                    181:                                if(type!=SOCK_STREAM)
                    182:                                        continue;
                    183:                                break;
                    184:                }
                    185: #if 0
                    186:                lprintf("%04d setting socket option: %s to %d", sock, str, value);
                    187: #endif
                    188:                result=setsockopt(sock,level,option,vp,len);
                    189:                if(result) {
                    190:                        sprintf(error,"%d setting socket option (%s, %d) to %d"
                    191:                                ,ERROR_VALUE, name, option, value);
                    192:                        break;
                    193:                }
                    194: #if 0
                    195:                len = sizeof(value);
                    196:                getsockopt(sock,level,option,(void*)&value,&len);
                    197:                lprintf("%04d socket option: %s set to %d", sock, name, value);
                    198: #endif
                    199:        }
                    200:        fclose(fp);
                    201:        return(result);
                    202: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.