version 1.2, 1999/09/30 16:48:48 |
version 1.3, 1999/11/23 22:25:56 |
|
|
/* Expands tildes in the file name. Returns data allocated by xmalloc. |
/* Expands tildes in the file name. Returns data allocated by xmalloc. |
Warning: this calls getpw*. */ |
Warning: this calls getpw*. */ |
|
|
char *tilde_expand_filename(const char *filename, uid_t my_uid) |
char * |
|
tilde_expand_filename(const char *filename, uid_t my_uid) |
{ |
{ |
const char *cp; |
const char *cp; |
unsigned int userlen; |
unsigned int userlen; |
char *expanded; |
char *expanded; |
struct passwd *pw; |
struct passwd *pw; |
char user[100]; |
char user[100]; |
|
|
/* Return immediately if no tilde. */ |
/* Return immediately if no tilde. */ |
if (filename[0] != '~') |
if (filename[0] != '~') |
return xstrdup(filename); |
return xstrdup(filename); |
|
|
/* Skip the tilde. */ |
/* Skip the tilde. */ |
filename++; |
filename++; |
|
|
/* Find where the username ends. */ |
/* Find where the username ends. */ |
cp = strchr(filename, '/'); |
cp = strchr(filename, '/'); |
if (cp) |
if (cp) |
userlen = cp - filename; /* Have something after username. */ |
userlen = cp - filename; /* Have something after username. */ |
else |
else |
userlen = strlen(filename); /* Nothign after username. */ |
userlen = strlen(filename); /* Nothign after username. */ |
if (userlen == 0) |
if (userlen == 0) |
pw = getpwuid(my_uid); /* Own home directory. */ |
pw = getpwuid(my_uid); /* Own home directory. */ |
else |
else { |
{ |
/* Tilde refers to someone elses home directory. */ |
/* Tilde refers to someone elses home directory. */ |
if (userlen > sizeof(user) - 1) |
if (userlen > sizeof(user) - 1) |
fatal("User name after tilde too long."); |
fatal("User name after tilde too long."); |
memcpy(user, filename, userlen); |
memcpy(user, filename, userlen); |
user[userlen] = 0; |
user[userlen] = 0; |
pw = getpwnam(user); |
pw = getpwnam(user); |
} |
} |
/* Check that we found the user. */ |
|
if (!pw) |
|
fatal("Unknown user %100s.", user); |
|
|
/* Check that we found the user. */ |
/* If referring to someones home directory, return it now. */ |
if (!pw) |
if (!cp) { /* Only home directory specified */ |
fatal("Unknown user %100s.", user); |
return xstrdup(pw->pw_dir); |
|
} |
/* If referring to someones home directory, return it now. */ |
/* Build a path combining the specified directory and path. */ |
if (!cp) |
expanded = xmalloc(strlen(pw->pw_dir) + strlen(cp + 1) + 2); |
{ /* Only home directory specified */ |
sprintf(expanded, "%s/%s", pw->pw_dir, cp + 1); |
return xstrdup(pw->pw_dir); |
return expanded; |
} |
|
|
|
/* Build a path combining the specified directory and path. */ |
|
expanded = xmalloc(strlen(pw->pw_dir) + strlen(cp + 1) + 2); |
|
sprintf(expanded, "%s/%s", pw->pw_dir, cp + 1); |
|
return expanded; |
|
} |
} |