// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.




var common = require('../common');
var assert = require('assert');
var spawn = require('child_process').spawn;
var fs = require('fs');

var myUid = process.getuid();
var myGid = process.getgid();

if (myUid != 0) {
  console.error('must be run as root, otherwise the gid/uid setting will' +
                ' fail.');
  process.exit(1);
}

// get a different user.
// don't care who it is, as long as it's not root
var passwd = fs.readFileSync('/etc/passwd', 'utf8');
passwd = passwd.trim().split(/\n/);

for (var i = 0, l = passwd.length; i < l; i++) {
  if (passwd[i].charAt(0) === '#') continue;
  passwd[i] = passwd[i].split(':');
  var otherName = passwd[i][0];
  var otherUid = +passwd[i][2];
  var otherGid = +passwd[i][3];
  if (otherUid && otherUid !== myUid &&
      otherGid && otherGid !== myGid &&
      otherUid > 0) {
    break;
  }
}
if (!otherUid && !otherGid) throw new Error('failed getting passwd info.');

console.error('name, id, gid = %j', [otherName, otherUid, otherGid]);

var whoNumber = spawn('id', [], { uid: otherUid, gid: otherGid });
var whoName = spawn('id', [], { uid: otherName, gid: otherGid });

whoNumber.stdout.buf = 'byNumber:';
whoName.stdout.buf = 'byName:';
whoNumber.stdout.on('data', onData);
whoName.stdout.on('data', onData);
function onData(c) { this.buf += c; }

whoNumber.on('exit', onExit);
whoName.on('exit', onExit);

function onExit(code) {
  var buf = this.stdout.buf;
  console.log(buf);
  var expr = new RegExp('^(byName|byNumber):uid=' +
                        otherUid +
                        '\\(' +
                        otherName +
                        '\\) gid=' +
                        otherGid +
                        '\\(');
  assert.ok(buf.match(expr), 'uid and gid should match ' + otherName);
}
