Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 19 additions & 7 deletions binding.gyp
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
{
"targets": [ {
"target_name": "syslog",
"sources": [ "src/syslog.cc" ],
"include_dirs": [
"<!(node -e \"require('nan')\")"
]
} ]
"targets": [
{
"target_name": "syslog",
"sources": [ "src/syslog.cc" ],
"include_dirs": [
"node_modules/node-addon-api"
],
"defines": [ "NAPI_CPP_EXCEPTIONS" ],
"cflags_cc": [ "-std=c++17", "-fexceptions" ],
"xcode_settings": {
"GCC_ENABLE_CPP_EXCEPTIONS": "YES",
"CLANG_CXX_LIBRARY": "libc++",
"MACOSX_DEPLOYMENT_TARGET": "10.15"
},
"dependencies": [
"node_modules/node-addon-api/node_api.gyp:nothing"
]
}
]
}
24 changes: 11 additions & 13 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,33 +1,31 @@
{
"name": "bunyan-syslog",
"name": "bunyan-syslog-napi",
"description": "Syslog Stream for Bunyan",
"version": "0.3.4",
"author": "Mark Cavage",
"version": "0.4",
"license": "MIT",
"main": "./lib/index.js",
"keywords": [
"bunyan",
"syslog"
],
"repository": {
"type": "git",
"url": "https://github.com/joyent/node-bunyan-syslog.git"
},
"bugs": {
"url": "https://github.com/joyent/node-bunyan-syslog/issues"
"type": "git"
},
"bugs": {},
"dependencies": {
"assert-plus": "0.1.5",
"nan": "^2.14.0",
"nan": "^2.17.0",
"node-addon-api": "^7.1.1",
"node-gyp": "^9.4.0",
"safer-buffer": "~2.1.0"
},
"devDependencies": {
"bunyan": "^1.8.12",
"istanbul": "^0.3.6",
"faucet": "0.0.1",
"tape": "^4.11.0",
"eslint": "^4.13.1",
"eslint-plugin-joyent": "~2.1.0"
"eslint-plugin-joyent": "~2.1.0",
"faucet": "0.0.1",
"istanbul": "^0.3.6",
"tape": "^4.11.0"
},
"scripts": {
"test": "./node_modules/.bin/istanbul cover --print none test/run.js"
Expand Down
184 changes: 91 additions & 93 deletions src/syslog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,119 +2,117 @@
#include <string.h>
#include <syslog.h>

#include <node.h>
#include <v8.h>
#include <nan.h>
#include <napi.h>

using namespace v8;
using namespace Napi;

#define RETURN_EXCEPTION(MSG) \
Nan::ThrowError(MSG)
// -------------------------
// Helper Macros

#define RETURN_ARGS_EXCEPTION(MSG) \
Nan::ThrowError(MSG)
#define THROW_IF_ARGS_EMPTY(info) \
if (info.Length() == 0) { \
Napi::TypeError::New(info.Env(), "Missing arguments").ThrowAsJavaScriptException(); \
return info.Env().Undefined(); \
}

#define REQUIRE_ARGS(ARGS) \
if (ARGS.Length() == 0) \
RETURN_ARGS_EXCEPTION("missing arguments");
#define REQUIRE_INT_ARG(info, I, VAR) \
if (info.Length() <= (I) || !info[I].IsNumber()) { \
Napi::TypeError::New(info.Env(), "Argument " #I " must be an integer").ThrowAsJavaScriptException(); \
return info.Env().Undefined(); \
} \
int VAR = info[I].As<Number>().Int32Value();

#define REQUIRE_INT_ARG(ARGS, I, VAR) \
REQUIRE_ARGS(ARGS); \
if (ARGS.Length() <= (I)) \
RETURN_ARGS_EXCEPTION("argument " #I " must be an Integer"); \
Nan::MaybeLocal<v8::Integer> _ ## VAR(Nan::To<v8::Integer>(ARGS[I])); \
if (_ ## VAR.IsEmpty()) \
RETURN_ARGS_EXCEPTION("argument " #I " must be an Integer"); \
int VAR = _ ## VAR.ToLocalChecked()->Value();
#define REQUIRE_STRING_ARG(info, I, VAR) \
if (info.Length() <= (I) || !info[I].IsString()) { \
Napi::TypeError::New(info.Env(), "Argument " #I " must be a string").ThrowAsJavaScriptException(); \
return info.Env().Undefined(); \
} \
std::string VAR = info[I].As<String>().Utf8Value();

#define REQUIRE_STRING_ARG(ARGS, I, VAR) \
REQUIRE_ARGS(ARGS); \
if (ARGS.Length() <= (I)) \
RETURN_ARGS_EXCEPTION("argument " #I " must be a String"); \
Nan::MaybeLocal<v8::String> _ ## VAR(Nan::To<v8::String>(ARGS[I])); \
if (_ ## VAR.IsEmpty()) \
RETURN_ARGS_EXCEPTION("argument " #I " must be a String"); \
Nan::Utf8String VAR(_ ## VAR.ToLocalChecked());

// -------------------------
// N-API bindings

///--- API
Value Open(const CallbackInfo& info) {
Env env = info.Env();
THROW_IF_ARGS_EMPTY(info);

NAN_METHOD(Open) {
Nan::HandleScope scope;
REQUIRE_STRING_ARG(info, 0, ident);
REQUIRE_INT_ARG(info, 1, logopt);
REQUIRE_INT_ARG(info, 2, facility);

REQUIRE_STRING_ARG(info, 0, ident);
REQUIRE_INT_ARG(info, 1, logopt);
REQUIRE_INT_ARG(info, 2, facility);

openlog(strdup(*ident), logopt, facility);

return;
openlog(strdup(ident.c_str()), logopt, facility);
return env.Undefined();
}

NAN_METHOD(Log) {
Nan::HandleScope scope;
Value Log(const CallbackInfo& info) {
Env env = info.Env();
THROW_IF_ARGS_EMPTY(info);

REQUIRE_INT_ARG(info, 0, priority);
REQUIRE_STRING_ARG(info, 1, message);
REQUIRE_INT_ARG(info, 0, priority);
REQUIRE_STRING_ARG(info, 1, message);

syslog(priority, "%s", *message);

return;
syslog(priority, "%s", message.c_str());
return env.Undefined();
}

NAN_METHOD(Close) {
Nan::HandleScope scope;

closelog();

return;
Value Close(const CallbackInfo& info) {
Env env = info.Env();
closelog();
return env.Undefined();
}

NAN_METHOD(Mask) {
Nan::EscapableHandleScope scope;

REQUIRE_INT_ARG(info, 0, maskpri);

int mask = setlogmask(LOG_UPTO(maskpri));
Value Mask(const CallbackInfo& info) {
Env env = info.Env();
REQUIRE_INT_ARG(info, 0, maskpri);

info.GetReturnValue().Set(scope.Escape(Nan::New<Integer>(mask)));
int mask = setlogmask(LOG_UPTO(maskpri));
return Number::New(env, mask);
}

NAN_MODULE_INIT(init) {
Nan::SetMethod(target, "openlog", Open);
Nan::SetMethod(target, "syslog", Log);
Nan::SetMethod(target, "closelog", Close);
Nan::SetMethod(target, "setlogmask", Mask);

NODE_DEFINE_CONSTANT(target, LOG_EMERG);
NODE_DEFINE_CONSTANT(target, LOG_ALERT);
NODE_DEFINE_CONSTANT(target, LOG_ERR);
NODE_DEFINE_CONSTANT(target, LOG_WARNING);
NODE_DEFINE_CONSTANT(target, LOG_NOTICE);
NODE_DEFINE_CONSTANT(target, LOG_INFO);
NODE_DEFINE_CONSTANT(target, LOG_DEBUG);

NODE_DEFINE_CONSTANT(target, LOG_KERN);
NODE_DEFINE_CONSTANT(target, LOG_USER);
NODE_DEFINE_CONSTANT(target, LOG_MAIL);
NODE_DEFINE_CONSTANT(target, LOG_DAEMON);
NODE_DEFINE_CONSTANT(target, LOG_AUTH);
NODE_DEFINE_CONSTANT(target, LOG_LPR);
NODE_DEFINE_CONSTANT(target, LOG_NEWS);
NODE_DEFINE_CONSTANT(target, LOG_UUCP);
NODE_DEFINE_CONSTANT(target, LOG_CRON);
NODE_DEFINE_CONSTANT(target, LOG_LOCAL0);
NODE_DEFINE_CONSTANT(target, LOG_LOCAL1);
NODE_DEFINE_CONSTANT(target, LOG_LOCAL2);
NODE_DEFINE_CONSTANT(target, LOG_LOCAL3);
NODE_DEFINE_CONSTANT(target, LOG_LOCAL4);
NODE_DEFINE_CONSTANT(target, LOG_LOCAL5);
NODE_DEFINE_CONSTANT(target, LOG_LOCAL6);
NODE_DEFINE_CONSTANT(target, LOG_LOCAL7);

NODE_DEFINE_CONSTANT(target, LOG_PID);
NODE_DEFINE_CONSTANT(target, LOG_CONS);
NODE_DEFINE_CONSTANT(target, LOG_NDELAY);
// -------------------------
// Module initialization

Object Init(Env env, Object exports) {
exports.Set("openlog", Function::New(env, Open));
exports.Set("syslog", Function::New(env, Log));
exports.Set("closelog", Function::New(env, Close));
exports.Set("setlogmask", Function::New(env, Mask));

// Priorities
exports.Set("LOG_EMERG", Number::New(env, LOG_EMERG));
exports.Set("LOG_ALERT", Number::New(env, LOG_ALERT));
exports.Set("LOG_ERR", Number::New(env, LOG_ERR));
exports.Set("LOG_WARNING", Number::New(env, LOG_WARNING));
exports.Set("LOG_NOTICE", Number::New(env, LOG_NOTICE));
exports.Set("LOG_INFO", Number::New(env, LOG_INFO));
exports.Set("LOG_DEBUG", Number::New(env, LOG_DEBUG));

// Facilities
exports.Set("LOG_KERN", Number::New(env, LOG_KERN));
exports.Set("LOG_USER", Number::New(env, LOG_USER));
exports.Set("LOG_MAIL", Number::New(env, LOG_MAIL));
exports.Set("LOG_DAEMON", Number::New(env, LOG_DAEMON));
exports.Set("LOG_AUTH", Number::New(env, LOG_AUTH));
exports.Set("LOG_LPR", Number::New(env, LOG_LPR));
exports.Set("LOG_NEWS", Number::New(env, LOG_NEWS));
exports.Set("LOG_UUCP", Number::New(env, LOG_UUCP));
exports.Set("LOG_CRON", Number::New(env, LOG_CRON));
exports.Set("LOG_LOCAL0", Number::New(env, LOG_LOCAL0));
exports.Set("LOG_LOCAL1", Number::New(env, LOG_LOCAL1));
exports.Set("LOG_LOCAL2", Number::New(env, LOG_LOCAL2));
exports.Set("LOG_LOCAL3", Number::New(env, LOG_LOCAL3));
exports.Set("LOG_LOCAL4", Number::New(env, LOG_LOCAL4));
exports.Set("LOG_LOCAL5", Number::New(env, LOG_LOCAL5));
exports.Set("LOG_LOCAL6", Number::New(env, LOG_LOCAL6));
exports.Set("LOG_LOCAL7", Number::New(env, LOG_LOCAL7));

// Options
exports.Set("LOG_PID", Number::New(env, LOG_PID));
exports.Set("LOG_CONS", Number::New(env, LOG_CONS));
exports.Set("LOG_NDELAY", Number::New(env, LOG_NDELAY));

return exports;
}

NODE_MODULE(syslog, init);
NODE_API_MODULE(syslog, Init)