#include "includes.h"
RCSID("$OpenBSD: tildexpand.c,v 1.12 2001/08/11 22:51:27 jakob Exp $");
#include "xmalloc.h"
#include "log.h"
#include "tildexpand.h"
char *
tilde_expand_filename(const char *filename, uid_t my_uid)
{
const char *cp;
u_int userlen;
char *expanded;
struct passwd *pw;
char user[100];
int len;
if (filename[0] != '~')
return xstrdup(filename);
filename++;
cp = strchr(filename, '/');
if (cp)
userlen = cp - filename;
else
userlen = strlen(filename);
if (userlen == 0)
pw = getpwuid(my_uid);
else {
if (userlen > sizeof(user) - 1)
fatal("User name after tilde too long.");
memcpy(user, filename, userlen);
user[userlen] = 0;
pw = getpwnam(user);
}
if (!pw)
fatal("Unknown user %100s.", user);
if (!cp) {
return xstrdup(pw->pw_dir);
}
len = strlen(pw->pw_dir) + strlen(cp + 1) + 2;
if (len > MAXPATHLEN)
fatal("Home directory too long (%d > %d", len-1, MAXPATHLEN-1);
expanded = xmalloc(len);
snprintf(expanded, len, "%s%s%s", pw->pw_dir, strcmp(pw->pw_dir, "/") ? "/" : "", cp + 1);
return expanded;
}