/[lwip]/lwip/src/api/sockets.c
ViewVC logotype

Diff of /lwip/src/api/sockets.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.16.2.1 by likewise, Tue Jun 17 14:04:54 2003 UTC revision 1.16.2.2 by kieranm, Thu Aug 21 09:59:21 2003 UTC
# Line 164  lwip_accept(int s, struct sockaddr *addr Line 164  lwip_accept(int s, struct sockaddr *addr
164    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s));    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s));
165    sock = get_socket(s);    sock = get_socket(s);
166    if (!sock) {    if (!sock) {
167        set_errno(EBADF);
168      return -1;      return -1;
169    }    }
170    
# Line 217  lwip_bind(int s, struct sockaddr *name, Line 218  lwip_bind(int s, struct sockaddr *name,
218    
219    sock = get_socket(s);    sock = get_socket(s);
220    if (!sock) {    if (!sock) {
221        set_errno(EBADF);
222      return -1;      return -1;
223    }    }
224    
# Line 257  lwip_close(int s) Line 259  lwip_close(int s)
259    sock = get_socket(s);    sock = get_socket(s);
260    if (!sock) {    if (!sock) {
261        sys_sem_signal(socksem);        sys_sem_signal(socksem);
262          set_errno(EBADF);
263        return -1;        return -1;
264    }    }
265    
# Line 280  lwip_connect(int s, struct sockaddr *nam Line 283  lwip_connect(int s, struct sockaddr *nam
283    
284    sock = get_socket(s);    sock = get_socket(s);
285    if (!sock) {    if (!sock) {
286        set_errno(EBADF);
287      return -1;      return -1;
288    }    }
289    
# Line 322  lwip_listen(int s, int backlog) Line 326  lwip_listen(int s, int backlog)
326    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog));    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog));
327    sock = get_socket(s);    sock = get_socket(s);
328    if (!sock) {    if (!sock) {
329        set_errno(EBADF);
330      return -1;      return -1;
331    }    }
332    
# Line 351  lwip_recvfrom(int s, void *mem, int len, Line 356  lwip_recvfrom(int s, void *mem, int len,
356    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %d, 0x%x, ..)\n", s, mem, len, flags));    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %d, 0x%x, ..)\n", s, mem, len, flags));
357    sock = get_socket(s);    sock = get_socket(s);
358    if (!sock) {    if (!sock) {
359        set_errno(EBADF);
360      return -1;      return -1;
361    }    }
362    
# Line 468  lwip_send(int s, void *data, int size, u Line 474  lwip_send(int s, void *data, int size, u
474    
475    sock = get_socket(s);    sock = get_socket(s);
476    if (!sock) {    if (!sock) {
477        set_errno(EBADF);
478      return -1;      return -1;
479    }    }
480    
481    switch (netconn_type(sock->conn)) {    switch (netconn_type(sock->conn)) {
482    case NETCONN_UDP:    case NETCONN_UDP:
483      case NETCONN_UDPLITE:
484      case NETCONN_UDPNOCHKSUM:
485      /* create a buffer */      /* create a buffer */
486      buf = netbuf_new();      buf = netbuf_new();
487    
# Line 521  lwip_sendto(int s, void *data, int size, Line 530  lwip_sendto(int s, void *data, int size,
530    
531    sock = get_socket(s);    sock = get_socket(s);
532    if (!sock) {    if (!sock) {
533        set_errno(EBADF);
534      return -1;      return -1;
535    }    }
536    
# Line 895  int lwip_getpeername (int s, struct sock Line 905  int lwip_getpeername (int s, struct sock
905    
906    sock = get_socket(s);    sock = get_socket(s);
907    if (!sock) {    if (!sock) {
908        set_errno(EBADF);
909      return -1;      return -1;
910    }    }
911    
# Line 930  int lwip_getsockname (int s, struct sock Line 941  int lwip_getsockname (int s, struct sock
941    
942    sock = get_socket(s);    sock = get_socket(s);
943    if (!sock) {    if (!sock) {
944        set_errno(EBADF);
945      return -1;      return -1;
946    }    }
947    
# Line 959  int lwip_getsockname (int s, struct sock Line 971  int lwip_getsockname (int s, struct sock
971    
972  int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen)  int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen)
973  {  {
974    int err = ENOSYS;    int err = 0;
975    struct lwip_socket *sock = get_socket(s);    struct lwip_socket *sock = get_socket(s);
976    
977    if (!sock) {    if(!sock) {
978            set_errno(EBADF);
979        return -1;
980      }
981    
982      if( NULL == optval || NULL == optlen ) {
983        sock_set_errno( sock, EFAULT );
984      return -1;      return -1;
985    }    }
986    
987    if (level == SOL_SOCKET) {    /* Do length and type checks for the various options first, to keep it readable. */
988      switch (optname) {    switch( level ) {
989      
990    /* Level: SOL_SOCKET */
991      case SOL_SOCKET:
992          switch(optname) {
993            
994          case SO_ACCEPTCONN:
995          case SO_BROADCAST:
996          /* UNIMPL case SO_DEBUG: */
997          /* UNIMPL case SO_DONTROUTE: */
998        case SO_ERROR:        case SO_ERROR:
999          if (!optval || !optlen || (*optlen != sizeof(int))) {        case SO_KEEPALIVE:
1000          /* UNIMPL case SO_OOBINLINE: */
1001          /* UNIMPL case SO_RCVBUF: */
1002          /* UNIMPL case SO_SNDBUF: */
1003          /* UNIMPL case SO_RCVLOWAT: */
1004          /* UNIMPL case SO_SNDLOWAT: */
1005          /* UNIMPL case SO_REUSEADDR: */
1006          /* UNIMPL case SO_REUSEPORT: */
1007          case SO_TYPE:
1008          /* UNIMPL case SO_USELOOPBACK: */
1009            if( *optlen < sizeof(int) ) {
1010            err = EINVAL;            err = EINVAL;
1011            }
1012            break;            break;
1013    
1014          default:
1015            LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname));
1016            err = ENOPROTOOPT;
1017          }  /* switch */
1018          break;
1019                        
1020    /* Level: IPPROTO_IP */
1021      case IPPROTO_IP:
1022          switch(optname) {
1023          /* UNIMPL case IP_HDRINCL: */
1024          /* UNIMPL case IP_RCVDSTADDR: */
1025          /* UNIMPL case IP_RCVIF: */
1026          case IP_TTL:
1027          case IP_TOS:
1028            if( *optlen < sizeof(int) ) {
1029              err = EINVAL;
1030          }          }
         *(int *)optval = sock->err;  
         sock->err = 0;  
         LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n", s, *(int *)optval));  
         err = 0;  
1031          break;          break;
1032    
1033        default:        default:
1034          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname));          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", s, optname));
1035            err = ENOPROTOOPT;
1036          }  /* switch */
1037          break;
1038            
1039    /* Level: IPPROTO_TCP */
1040      case IPPROTO_TCP:
1041          if( *optlen < sizeof(int) ) {
1042            err = EINVAL;
1043          break;          break;
1044      }      }
1045    } else {        
1046      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname));        /* If this is no TCP socket, ignore any options. */
1047          if ( sock->conn->type != NETCONN_TCP ) return 0;
1048    
1049          switch( optname ) {
1050          case TCP_NODELAY:
1051          case TCP_KEEPALIVE:
1052            break;
1053            
1054          default:
1055            LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", s, optname));
1056            err = ENOPROTOOPT;
1057          }  /* switch */
1058          break;
1059    
1060    /* UNDEFINED LEVEL */
1061      default:
1062          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname));
1063          err = ENOPROTOOPT;
1064      }  /* switch */
1065    
1066      
1067      if( 0 != err ) {
1068        sock_set_errno(sock, err);
1069        return -1;
1070    }    }
1071      
1072    
1073    
1074      /* Now do the actual option processing */
1075    
1076      switch(level) {
1077      
1078    /* Level: SOL_SOCKET */
1079      case SOL_SOCKET:
1080        switch( optname ) {
1081    
1082        /* The option flags */
1083        case SO_ACCEPTCONN:
1084        case SO_BROADCAST:
1085        /* UNIMPL case SO_DEBUG: */
1086        /* UNIMPL case SO_DONTROUTE: */
1087        case SO_KEEPALIVE:
1088        /* UNIMPL case SO_OOBINCLUDE: */
1089        /* UNIMPL case SO_REUSEADDR: */
1090        /* UNIMPL case SO_REUSEPORT: */
1091        /*case SO_USELOOPBACK: UNIMPL */
1092          *(int*)optval = sock->conn->pcb.tcp->so_options & optname;
1093          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n", s, optname, (*(int*)optval?"on":"off")));
1094          break;
1095    
1096        case SO_TYPE:
1097          switch (sock->conn->type) {
1098          case NETCONN_TCP:
1099            *(int*)optval = SOCK_STREAM;
1100            break;
1101          case NETCONN_UDP:
1102          case NETCONN_UDPLITE:
1103          case NETCONN_UDPNOCHKSUM:
1104            *(int*)optval = SOCK_DGRAM;
1105            break;
1106          default: /* unrecognized socket type */
1107            *(int*)optval = sock->conn->type;
1108            LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\n", s, *(int *)optval));
1109          }  /* switch */
1110          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE) = %d\n", s, *(int *)optval));
1111          break;
1112    
1113        case SO_ERROR:
1114          *(int *)optval = sock->err;
1115          sock->err = 0;
1116          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n", s, *(int *)optval));
1117          break;
1118        }  /* switch */
1119        break;
1120    
1121    /* Level: IPPROTO_IP */
1122      case IPPROTO_IP:
1123        switch( optname ) {
1124        case IP_TTL:
1125          *(int*)optval = sock->conn->pcb.tcp->ttl;
1126          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TTL) = %d\n", s, *(int *)optval));
1127          break;
1128        case IP_TOS:
1129          *(int*)optval = sock->conn->pcb.tcp->tos;
1130          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TOS) = %d\n", s, *(int *)optval));
1131          break;
1132        }  /* switch */
1133        break;
1134    
1135    /* Level: IPPROTO_TCP */
1136      case IPPROTO_TCP:
1137        switch( optname ) {
1138        case TCP_NODELAY:
1139          *(int*)optval = (sock->conn->pcb.tcp->flags & TF_NODELAY);
1140          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\n", s, (*(int*)optval)?"on":"off") );
1141          break;
1142        case TCP_KEEPALIVE:
1143          *(int*)optval = sock->conn->pcb.tcp->keepalive;
1144          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, TCP_KEEPALIVE) = %d\n", s, *(int *)optval));
1145          break;
1146        }  /* switch */
1147        break;
1148      }
1149    
1150    
1151    sock_set_errno(sock, err);    sock_set_errno(sock, err);
1152    return err ? -1 : 0;    return err ? -1 : 0;
1153  }  }
# Line 992  int lwip_getsockopt (int s, int level, i Line 1155  int lwip_getsockopt (int s, int level, i
1155  int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen)  int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen)
1156  {  {
1157    struct lwip_socket *sock = get_socket(s);    struct lwip_socket *sock = get_socket(s);
1158    int err = ENOSYS;    int err = 0;
1159    
1160    if (!sock) {    if(!sock) {
1161            set_errno(EBADF);
1162      return -1;      return -1;
1163    }    }
1164    
1165    if (level == SOL_SOCKET) {    if( NULL == optval ) {
1166      switch (optname) {      sock_set_errno( sock, EFAULT );
1167        case SO_REUSEADDR:      return -1;
1168          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, SO_REUSEADDR, ..)\n", s));    }
1169             /* XXX just pretend we support this for now */  
1170            err = 0;  
1171      /* Do length and type checks for the various options first, to keep it readable. */
1172      switch( level ) {
1173    
1174    /* Level: SOL_SOCKET */
1175      case SOL_SOCKET:
1176        switch(optname) {
1177    
1178        case SO_BROADCAST:
1179        /* UNIMPL case SO_DEBUG: */
1180        /* UNIMPL case SO_DONTROUTE: */
1181        case SO_KEEPALIVE:
1182        /* UNIMPL case SO_OOBINLINE: */
1183        /* UNIMPL case SO_RCVBUF: */
1184        /* UNIMPL case SO_SNDBUF: */
1185        /* UNIMPL case SO_RCVLOWAT: */
1186        /* UNIMPL case SO_SNDLOWAT: */
1187        /* UNIMPL case SO_REUSEADDR: */
1188        /* UNIMPL case SO_REUSEPORT: */
1189        /* UNIMPL case SO_USELOOPBACK: */
1190          if( optlen < sizeof(int) ) {
1191            err = EINVAL;
1192          }
1193          break;
1194        default:
1195          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname));
1196          err = ENOPROTOOPT;
1197        }  /* switch */
1198        break;
1199    
1200    /* Level: IPPROTO_IP */
1201      case IPPROTO_IP:
1202        switch(optname) {
1203        /* UNIMPL case IP_HDRINCL: */
1204        /* UNIMPL case IP_RCVDSTADDR: */
1205        /* UNIMPL case IP_RCVIF: */
1206        case IP_TTL:
1207        case IP_TOS:
1208          if( optlen < sizeof(int) ) {
1209            err = EINVAL;
1210          }
1211          break;          break;
1212        default:        default:
1213          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname));        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", s, optname));
1214          err = ENOPROTOOPT;
1215        }  /* switch */
1216        break;
1217    
1218    /* Level: IPPROTO_TCP */
1219      case IPPROTO_TCP:
1220        if( optlen < sizeof(int) ) {
1221          err = EINVAL;
1222          break;          break;
1223      }      }
1224    } else {  
1225        /* If this is no TCP socket, ignore any options. */
1226        if ( sock->conn->type != NETCONN_TCP ) return 0;
1227    
1228        switch( optname ) {
1229        case TCP_NODELAY:
1230        case TCP_KEEPALIVE:
1231          break;
1232    
1233        default:
1234          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", s, optname));
1235          err = ENOPROTOOPT;
1236        }  /* switch */
1237        break;
1238    
1239    /* UNDEFINED LEVEL */      
1240      default:
1241      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname));      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname));
1242        err = ENOPROTOOPT;
1243      }  /* switch */
1244    
1245    
1246      if( 0 != err ) {
1247        sock_set_errno(sock, err);
1248        return -1;
1249    }    }
1250    
1251    
1252    
1253      /* Now do the actual option processing */
1254    
1255      switch(level) {
1256    
1257    /* Level: SOL_SOCKET */
1258      case SOL_SOCKET:
1259        switch(optname) {
1260    
1261        /* The option flags */
1262        case SO_BROADCAST:
1263        /* UNIMPL case SO_DEBUG: */
1264        /* UNIMPL case SO_DONTROUTE: */
1265        case SO_KEEPALIVE:
1266        /* UNIMPL case SO_OOBINCLUDE: */
1267        /* UNIMPL case SO_REUSEADDR: */
1268        /* UNIMPL case SO_REUSEPORT: */
1269        /* UNIMPL case SO_USELOOPBACK: */
1270          if ( *(int*)optval ) {
1271            sock->conn->pcb.tcp->so_options |= optname;
1272          } else {
1273            sock->conn->pcb.tcp->so_options &= ~optname;
1274          }
1275          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, optname=0x%x, ..) -> %s\n", s, optname, (*(int*)optval?"on":"off")));
1276          break;
1277        }  /* switch */
1278        break;
1279    
1280    /* Level: IPPROTO_IP */
1281      case IPPROTO_IP:
1282        switch( optname ) {
1283        case IP_TTL:
1284          sock->conn->pcb.tcp->ttl = (u8_t)(*(int*)optval);
1285          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TTL, ..) -> %u\n", s, sock->conn->pcb.tcp->ttl));
1286          break;
1287        case IP_TOS:
1288          sock->conn->pcb.tcp->tos = (u8_t)(*(int*)optval);
1289          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TOS, ..)-> %u\n", s, sock->conn->pcb.tcp->tos));
1290          break;
1291        }  /* switch */
1292        break;
1293    
1294    /* Level: IPPROTO_TCP */
1295      case IPPROTO_TCP:
1296        switch( optname ) {
1297        case TCP_NODELAY:
1298          if ( *(int*)optval ) {
1299            sock->conn->pcb.tcp->flags |= TF_NODELAY;
1300          } else {
1301            sock->conn->pcb.tcp->flags &= ~TF_NODELAY;
1302          }
1303          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\n", s, (*(int *)optval)?"on":"off") );
1304          break;
1305        case TCP_KEEPALIVE:
1306          sock->conn->pcb.tcp->keepalive = (u32_t)(*(int*)optval);;
1307          LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %u\n", s, sock->conn->pcb.tcp->keepalive));
1308          break;
1309        }  /* switch */
1310        break;
1311      }  /* switch */
1312    
1313    sock_set_errno(sock, err);    sock_set_errno(sock, err);
1314    return err ? -1 : 0;    return err ? -1 : 0;
1315  }  }
# Line 1021  int lwip_ioctl(int s, long cmd, void *ar Line 1318  int lwip_ioctl(int s, long cmd, void *ar
1318  {  {
1319    struct lwip_socket *sock = get_socket(s);    struct lwip_socket *sock = get_socket(s);
1320    
1321    if (!sock) {    if(!sock) {
1322            set_errno(EBADF);
1323      return -1;      return -1;
1324    }    }
1325    
# Line 1035  int lwip_ioctl(int s, long cmd, void *ar Line 1333  int lwip_ioctl(int s, long cmd, void *ar
1333      *((u16_t*)argp) = sock->conn->recv_avail;      *((u16_t*)argp) = sock->conn->recv_avail;
1334    
1335      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %u\n", s, argp, *((u16_t*)argp)));      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %u\n", s, argp, *((u16_t*)argp)));
1336        sock_set_errno(sock, 0);      sock_set_errno(sock, 0);
1337      return 0;      return 0;
1338    
1339    case FIONBIO:    case FIONBIO:
# Line 1044  int lwip_ioctl(int s, long cmd, void *ar Line 1342  int lwip_ioctl(int s, long cmd, void *ar
1342      else      else
1343        sock->flags &= ~O_NONBLOCK;        sock->flags &= ~O_NONBLOCK;
1344      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, !!(sock->flags & O_NONBLOCK)));      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, !!(sock->flags & O_NONBLOCK)));
1345        sock_set_errno(sock, 0);      sock_set_errno(sock, 0);
1346      return 0;      return 0;
1347    
1348    default:    default:

Legend:
Removed from v.1.16.2.1  
changed lines
  Added in v.1.16.2.2

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26