1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- 'use strict';
- var platform = require('os').platform();
- var spawnSync = require('child_process').spawnSync;
- var readdirSync = require('fs').readdirSync;
- var GLIBC = 'glibc';
- var MUSL = 'musl';
- var spawnOptions = {
- encoding: 'utf8',
- env: process.env
- };
- if (!spawnSync) {
- spawnSync = function () {
- return { status: 126, stdout: '', stderr: '' };
- };
- }
- function contains (needle) {
- return function (haystack) {
- return haystack.indexOf(needle) !== -1;
- };
- }
- function versionFromMuslLdd (out) {
- return out.split(/[\r\n]+/)[1].trim().split(/\s/)[1];
- }
- function safeReaddirSync (path) {
- try {
- return readdirSync(path);
- } catch (e) {}
- return [];
- }
- var family = '';
- var version = '';
- var method = '';
- if (platform === 'linux') {
- // Try getconf
- var glibc = spawnSync('getconf', ['GNU_LIBC_VERSION'], spawnOptions);
- if (glibc.status === 0) {
- family = GLIBC;
- version = glibc.stdout.trim().split(' ')[1];
- method = 'getconf';
- } else {
- // Try ldd
- var ldd = spawnSync('ldd', ['--version'], spawnOptions);
- if (ldd.status === 0 && ldd.stdout.indexOf(MUSL) !== -1) {
- family = MUSL;
- version = versionFromMuslLdd(ldd.stdout);
- method = 'ldd';
- } else if (ldd.status === 1 && ldd.stderr.indexOf(MUSL) !== -1) {
- family = MUSL;
- version = versionFromMuslLdd(ldd.stderr);
- method = 'ldd';
- } else {
- // Try filesystem (family only)
- var lib = safeReaddirSync('/lib');
- if (lib.some(contains('-linux-gnu'))) {
- family = GLIBC;
- method = 'filesystem';
- } else if (lib.some(contains('libc.musl-'))) {
- family = MUSL;
- method = 'filesystem';
- } else if (lib.some(contains('ld-musl-'))) {
- family = MUSL;
- method = 'filesystem';
- } else {
- var usrSbin = safeReaddirSync('/usr/sbin');
- if (usrSbin.some(contains('glibc'))) {
- family = GLIBC;
- method = 'filesystem';
- }
- }
- }
- }
- }
- var isNonGlibcLinux = (family !== '' && family !== GLIBC);
- module.exports = {
- GLIBC: GLIBC,
- MUSL: MUSL,
- family: family,
- version: version,
- method: method,
- isNonGlibcLinux: isNonGlibcLinux
- };
|