Annotation of src/usr.bin/ssh/tildexpand.c, Revision 1.8
1.1 deraadt 1: /*
1.4 deraadt 2: * Author: Tatu Ylonen <ylo@cs.hut.fi>
3: * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4: * All rights reserved
1.8 ! deraadt 5: *
! 6: * As far as I am concerned, the code I have written for this software
! 7: * can be used freely for any purpose. Any derived versions of this
! 8: * software must be clearly marked as such, and if the derived work is
! 9: * incompatible with the protocol description in the RFC file, it must be
! 10: * called by a name other than "ssh" or "Secure Shell".
1.4 deraadt 11: */
1.1 deraadt 12:
13: #include "includes.h"
1.8 ! deraadt 14: RCSID("$OpenBSD: tildexpand.c,v 1.7 2000/06/20 01:39:45 markus Exp $");
1.1 deraadt 15:
16: #include "xmalloc.h"
17: #include "ssh.h"
18:
1.4 deraadt 19: /*
20: * Expands tildes in the file name. Returns data allocated by xmalloc.
21: * Warning: this calls getpw*.
22: */
1.3 markus 23: char *
24: tilde_expand_filename(const char *filename, uid_t my_uid)
1.1 deraadt 25: {
1.3 markus 26: const char *cp;
27: unsigned int userlen;
28: char *expanded;
29: struct passwd *pw;
30: char user[100];
1.6 deraadt 31: int len;
1.3 markus 32:
33: /* Return immediately if no tilde. */
34: if (filename[0] != '~')
35: return xstrdup(filename);
36:
37: /* Skip the tilde. */
38: filename++;
39:
40: /* Find where the username ends. */
41: cp = strchr(filename, '/');
42: if (cp)
1.4 deraadt 43: userlen = cp - filename; /* Something after username. */
1.3 markus 44: else
1.4 deraadt 45: userlen = strlen(filename); /* Nothing after username. */
1.3 markus 46: if (userlen == 0)
1.5 markus 47: pw = getpwuid(my_uid); /* Own home directory. */
1.3 markus 48: else {
49: /* Tilde refers to someone elses home directory. */
50: if (userlen > sizeof(user) - 1)
51: fatal("User name after tilde too long.");
52: memcpy(user, filename, userlen);
53: user[userlen] = 0;
54: pw = getpwnam(user);
55: }
56: if (!pw)
57: fatal("Unknown user %100s.", user);
58:
59: /* If referring to someones home directory, return it now. */
1.5 markus 60: if (!cp) {
61: /* Only home directory specified */
1.3 markus 62: return xstrdup(pw->pw_dir);
63: }
64: /* Build a path combining the specified directory and path. */
1.6 deraadt 65: len = strlen(pw->pw_dir) + strlen(cp + 1) + 2;
66: if (len > MAXPATHLEN)
67: fatal("Home directory too long (%d > %d", len-1, MAXPATHLEN-1);
68: expanded = xmalloc(len);
69: snprintf(expanded, len, "%s/%s", pw->pw_dir, cp + 1);
1.3 markus 70: return expanded;
1.1 deraadt 71: }