I'm experimenting with IP options and have added the following to the file object.
void file_get_ip_options(INT32 args) { char buffer[44]; socklen_t len = sizeof(buffer); int ret;
pop_n_elems(args); ret = getsockopt(FD, IPPROTO_IP, IP_OPTIONS, buffer, &len); if(ret!=0) { push_int(0); return; } push_string( make_shared_binary_string( buffer, len ) ); }
void file_set_ip_options(INT32 args) { int ret;
if(args!=1 || TYPEOF(Pike_sp[-args]) != PIKE_T_STRING) Pike_error("Illegal arguments to set_ip_options.\n");
ret = setsockopt(FD, IPPROTO_IP, IP_OPTIONS, Pike_sp[-args].u.string->str, Pike_sp[-args].u.string->len); pop_n_elems(args); push_int( ret==0 ); }
I can successfully set the NOP IP options with
Stdio.File f = Stdio.File(); f->open_socket(); f->set_ip_options("\1");
and can see it set in wireshark. However, I'm unable to read it out on the server side. Is it my poor understanding of C or of network code that is the problem?