[BACK]Return to tildexpand.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Annotation of src/usr.bin/ssh/tildexpand.c, Revision 1.9

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.9     ! markus     14: RCSID("$OpenBSD: tildexpand.c,v 1.8 2000/09/07 20:27:55 deraadt 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;
1.9     ! markus     27:        u_int userlen;
1.3       markus     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: }