'use strict'; var util = require("util"); function toString(val) { val = val.toString(8); while (val.length < 4) { val = "0" + val; } return val; } var defaultUmask = 18; // 0022; var defaultUmaskString = toString(defaultUmask); function validate(data, k, val) { // must be either an integer or an octal string. if (typeof val === "number" && !isNaN(val)) { data[k] = val; return true; } if (typeof val === "string") { if (val.charAt(0) !== "0") { return false; } data[k] = parseInt(val, 8); return true; } return false; } function convert_fromString(val, cb) { if (typeof val === "string") { // check for octal string first if (val.charAt(0) === '0' && /^[0-7]+$/.test(val)) { val = parseInt(val, 8); } else if (val.charAt(0) !== '0' && /^[0-9]+$/.test(val)) { // legacy support for decimal strings val = parseInt(val, 10); } else { return cb(new Error(util.format("Expected octal string, got %j, defaulting to %j", val, defaultUmaskString)), defaultUmask); } } else if (typeof val !== "number") { return cb(new Error(util.format("Expected number or octal string, got %j, defaulting to %j", val, defaultUmaskString)), defaultUmask); } val = Math.floor(val); if ((val < 0) || (val > 511)) { return cb(new Error(util.format("Must be in range 0..511 (0000..0777), got %j", val)), defaultUmask); } cb(null, val); } function fromString(val, cb) { // synchronous callback, no zalgo convert_fromString(val, cb || function (err, result) { /*jslint unparam:true*/ val = result; }); return val; } exports.toString = toString; exports.fromString = fromString; exports.validate = validate;