#include "nodeparams.hpp" #include #include #include #include #include #include #include #include const int inet_sock_fd = socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, 0); namespace ipNode { int setflags(const char* iface, short flags) { struct ifreq ifr; ifr.ifr_flags = flags; strncpy(ifr.ifr_name, iface, IFNAMSIZ); return ioctl(inet_sock_fd, SIOCSIFFLAGS, &ifr); } int getIfreq(struct ifreq *ifr ) { return ioctl(inet_sock_fd, SIOCGIFFLAGS, ifr); } void nodeGetFlags(const nodeparam& args) { v8::Isolate* isolate = args.GetIsolate(); if (args.Length() < 1 || !args[0]->IsString()) { isolate->ThrowException(v8::Exception::TypeError( v8::String::NewFromUtf8(isolate, "Invalid arguments ip.getflags").ToLocalChecked())); return; } std::string iface = argToString(args[0]); struct ifreq ifr; strncpy(ifr.ifr_name, iface.c_str(), IFNAMSIZ); int err = getIfreq(&ifr); if(err != 0) { char errstr[36]; sprintf(errstr, "Error while getting flags %d", errno); isolate->ThrowException(v8::Exception::TypeError( v8::String::NewFromUtf8(isolate, errstr).ToLocalChecked())); } args.GetReturnValue().Set(ifr.ifr_flags); } void nodeSetFlags(const nodeparam& args) { v8::Isolate* isolate = args.GetIsolate(); if (args.Length() < 2 || !args[0]->IsString() || !args[1]->IsUint32()) { isolate->ThrowException(v8::Exception::TypeError( v8::String::NewFromUtf8(isolate, "Invalid arguments ip.srtFlags").ToLocalChecked())); return; } short flags = (short) argToInt(args[1]); std::string path = argToString(args[0]); args.GetReturnValue().Set(setflags(path.c_str(), flags)); } void Initialize(v8::Local exports) { NODE_SET_METHOD(exports, "setFlags", nodeSetFlags); NODE_SET_METHOD(exports, "getFlags", nodeGetFlags); } NODE_MODULE(ip_api, Initialize) }