index.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. 'use strict';
  2. var util = require("util");
  3. function toString(val) {
  4. val = val.toString(8);
  5. while (val.length < 4) {
  6. val = "0" + val;
  7. }
  8. return val;
  9. }
  10. var defaultUmask = 18; // 0022;
  11. var defaultUmaskString = toString(defaultUmask);
  12. function validate(data, k, val) {
  13. // must be either an integer or an octal string.
  14. if (typeof val === "number" && !isNaN(val)) {
  15. data[k] = val;
  16. return true;
  17. }
  18. if (typeof val === "string") {
  19. if (val.charAt(0) !== "0") {
  20. return false;
  21. }
  22. data[k] = parseInt(val, 8);
  23. return true;
  24. }
  25. return false;
  26. }
  27. function convert_fromString(val, cb) {
  28. if (typeof val === "string") {
  29. // check for octal string first
  30. if (val.charAt(0) === '0' && /^[0-7]+$/.test(val)) {
  31. val = parseInt(val, 8);
  32. } else if (val.charAt(0) !== '0' && /^[0-9]+$/.test(val)) {
  33. // legacy support for decimal strings
  34. val = parseInt(val, 10);
  35. } else {
  36. return cb(new Error(util.format("Expected octal string, got %j, defaulting to %j",
  37. val, defaultUmaskString)),
  38. defaultUmask);
  39. }
  40. } else if (typeof val !== "number") {
  41. return cb(new Error(util.format("Expected number or octal string, got %j, defaulting to %j",
  42. val, defaultUmaskString)),
  43. defaultUmask);
  44. }
  45. val = Math.floor(val);
  46. if ((val < 0) || (val > 511)) {
  47. return cb(new Error(util.format("Must be in range 0..511 (0000..0777), got %j", val)),
  48. defaultUmask);
  49. }
  50. cb(null, val);
  51. }
  52. function fromString(val, cb) {
  53. // synchronous callback, no zalgo
  54. convert_fromString(val, cb || function (err, result) {
  55. /*jslint unparam:true*/
  56. val = result;
  57. });
  58. return val;
  59. }
  60. exports.toString = toString;
  61. exports.fromString = fromString;
  62. exports.validate = validate;