tags:

views:

58

answers:

1

Short version: I want a way to run somefunction("username") and have it return the user ID associated with username. For example somefunction("root") would return 0.

I'm writing a server program that could potentially use low-numbered ports, so it has to start as root. Obviously, I don't want it to run as root, so the plan is to let users specify what user the program should run as. The problem is that setuid() requires a user ID and I don't know how to look up a user ID from a login name. I looked in unistd.h and it seems to only have functions for finding info about the current user.

I know I could just open /etc/passwd, but I'd rather not when there's bound to be a function for this.

+8  A: 

You want getpwnam.

Here's a complete example I just wrote:

#define _POSIX_SOURCE
#include <sys/types.h>
#include <stdio.h>
#include <pwd.h>
#include <unistd.h>

uid_t name_to_uid(char const *name)
{
  if (!name)
    return -1;
  long const buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
  if (buflen == -1)
    return -1;
  // requires c99
  char buf[buflen];
  struct passwd pwbuf, *pwbufp;
  if (0 != getpwnam_r(name, &pwbuf, buf, buflen, &pwbufp)
      || !pwbufp)
    return -1;
  return pwbufp->pw_uid;
}

void main(int argc, char **argv)
{
  printf("%i\n", name_to_uid(argv[1]));
}
Matt Joiner
Looks like exactly what I needed. Thanks a lot!
Brendan Long