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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
} |
} |
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 |
} |
} |
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 |
|
|
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: |
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: |