You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.1 KiB
57 lines
1.1 KiB
/* LINTLIBRARY */
|
|
|
|
#include <stdio.h>
|
|
#include "util.h"
|
|
|
|
#ifdef BSD
|
|
#include <pwd.h>
|
|
#endif
|
|
|
|
|
|
char *
|
|
util_tilde_expand(char const *fname)
|
|
{
|
|
#ifdef BSD
|
|
struct passwd *userRecord;
|
|
char username[256], *filename;
|
|
register int i, j;
|
|
|
|
filename = ALLOC(char, strlen(fname) + 256);
|
|
|
|
/* Clear the return string */
|
|
i = 0;
|
|
filename[0] = '\0';
|
|
|
|
/* Tilde? */
|
|
if (fname[0] == '~') {
|
|
j = 0;
|
|
i = 1;
|
|
while ((fname[i] != '\0') && (fname[i] != '/')) {
|
|
username[j++] = fname[i++];
|
|
}
|
|
username[j] = '\0';
|
|
|
|
if (username[0] == '\0') {
|
|
/* ~/ resolves to home directory of current user */
|
|
if ((userRecord = getpwuid(getuid())) != 0) {
|
|
(void) strcat(filename, userRecord->pw_dir);
|
|
} else {
|
|
i = 0;
|
|
}
|
|
} else {
|
|
/* ~user/ resolves to home directory of 'user' */
|
|
if ((userRecord = getpwnam(username)) != 0) {
|
|
(void) strcat(filename, userRecord->pw_dir);
|
|
} else {
|
|
i = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Concantenate remaining portion of file name */
|
|
(void) strcat(filename, fname + i);
|
|
return filename;
|
|
#else
|
|
return strsav(fname);
|
|
#endif
|
|
}
|