#include <arpa/inet.h>
#include <netdb.h>
#include <sys/poll.h>
- #include <errno.h>
typedef int S_DESCRIPTOR;
typedef struct sockaddr_in S_ADDR_IN;
new socket(domain: FFSocketAddressFamilies, socketType: FFSocketTypes, protocol: FFSocketProtocolFamilies) `{
S_DESCRIPTOR *d = NULL; d = (S_DESCRIPTOR*) malloc( sizeof(S_DESCRIPTOR) );
int ds = socket(domain, socketType, protocol);
+ if(ds == -1){
+ free(d);
+ return NULL;
+ }
memcpy(d, &ds, sizeof(ds));
return d;
`}
fun destroy `{ free(recv); `}
fun close: Int `{ return close( *recv ); `}
fun descriptor: Int `{ return *recv; `}
- fun errno: Int `{ return errno; `}
fun gethostbyname(n: String): FFSocketHostent import String.to_cstring `{ return gethostbyname(String_to_cstring(n)); `}
fun connect(addrIn: FFSocketAddrIn): Int `{ return connect( *recv, (S_ADDR*)addrIn, sizeof(*addrIn) ); `}
fun write(buffer: String): Int import String.to_cstring, String.length `{ return write(*recv, (char*)String_to_cstring(buffer), String_length(buffer)); `}
- fun read: String import NativeString.to_s `{
- char *c = (char*)malloc(1024);
- int n = read(*recv, c, 1023);
- if(n < 0) exit(-1);
- c[n] = '\0';
- return NativeString_to_s(c);
+ fun read: String import NativeString.to_s_with_length `{
+ static char c[1024];
+ int n = read(*recv, c, 1024);
+ if(n < 0) {
+ free(c);
+ return NativeString_to_s_with_length("",0);
+ }
+ char* ret = malloc(n + 1);
+ memcpy(ret, c, n);
+ ret[n] = '\0';
+ free(c);
+ return NativeString_to_s_with_length(ret, n);
+ `}
+
+ # Sets an option for the socket
+ fun setsockopt(level: FFSocketOptLevels, option_name: FFSocketOptNames, option_value: Int) `{
+ int err = setsockopt(*recv, level, option_name, &option_value, sizeof(int));
+ if(err != 0){
+ perror("Error on setsockopts : ");
+ exit(1);
+ }
`}
fun bind(addrIn: FFSocketAddrIn): Int `{ return bind(*recv, (S_ADDR*)addrIn, sizeof(*addrIn)); `}
new pf_inet6 `{ return PF_INET6; `}
new pf_max `{ return PF_MAX; `}
end
-
+# Level on which to set options
+extern FFSocketOptLevels `{ int `}
+ # Dummy for IP (As defined in C)
+ new ip `{ return IPPROTO_IP;`}
+ # Control message protocol
+ new icmp `{ return IPPROTO_ICMP;`}
+ # Use TCP
+ new tcp `{ return IPPROTO_TCP; `}
+ # Socket level options
+ new socket `{ return SOL_SOCKET; `}
+end
+# Options for socket, use with setsockopt
+extern FFSocketOptNames `{ int `}
+ # Enables debugging information
+ new debug `{ return SO_DEBUG; `}
+ # Authorizes the broadcasting of messages
+ new broadcast `{ return SO_BROADCAST; `}
+ # Authorizes the reuse of the local address
+ new reuseaddr `{ return SO_REUSEADDR; `}
+ # Authorizes the use of keep-alive packets in a connection
+ new keepalive `{ return SO_KEEPALIVE; `}
+end
# Used for the poll function of a socket, mix several Poll values to check for events on more than one type of event
extern FFSocketPollValues `{ int `}
new pollin `{ return POLLIN; `} # Data other than high-priority data may be read without blocking.