113 lines
3.5 KiB
C++
113 lines
3.5 KiB
C++
#include "nodeparams.hpp"
|
|
#include <iostream>
|
|
#include <sys/ioctl.h>
|
|
#include <net/if.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <net/route.h>
|
|
#include <linux/sockios.h>
|
|
#include <unistd.h>
|
|
#include <node.h>
|
|
#include <errno.h>
|
|
|
|
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 nodeSetIpv4(const nodeparam& args) {
|
|
v8::Isolate* isolate = args.GetIsolate();
|
|
|
|
if (args.Length() < 2 || !args[0]->IsString() || !args[1]->IsString()) {
|
|
isolate->ThrowException(v8::Exception::TypeError(
|
|
v8::String::NewFromUtf8(isolate, "Invalid arguments ip.setIpv4").ToLocalChecked()));
|
|
return;
|
|
}
|
|
|
|
const std::string iface = argToString(args[0]);;
|
|
const std::string ip = argToString(args[1]);
|
|
|
|
struct ifreq ifr;
|
|
struct sockaddr_in sai;
|
|
|
|
strncpy(ifr.ifr_name, iface.c_str(), IFNAMSIZ);
|
|
|
|
memset(&sai, 0, sizeof(struct sockaddr));
|
|
sai.sin_family = AF_INET;
|
|
sai.sin_port = 0;
|
|
|
|
sai.sin_addr.s_addr = inet_addr(ip.c_str());
|
|
|
|
memcpy( &ifr.ifr_ifru, &sai, sizeof(struct sockaddr));
|
|
|
|
int err = ioctl(inet_sock_fd, SIOCSIFADDR, &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<v8::Object> exports) {
|
|
NODE_SET_METHOD(exports, "setFlags", nodeSetFlags);
|
|
NODE_SET_METHOD(exports, "getFlags", nodeGetFlags);
|
|
NODE_SET_METHOD(exports, "setIpv4", nodeSetIpv4);
|
|
}
|
|
|
|
NODE_MODULE(ip_api, Initialize)
|
|
}
|
|
|