[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.6

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
                      5:  * Created: Wed Jul 12 01:07:36 1995 ylo
                      6:  */
1.1       deraadt     7:
                      8: #include "includes.h"
1.6     ! deraadt     9: RCSID("$Id: tildexpand.c,v 1.5 1999/11/24 19:53:54 markus Exp $");
1.1       deraadt    10:
                     11: #include "xmalloc.h"
                     12: #include "ssh.h"
                     13:
1.4       deraadt    14: /*
                     15:  * Expands tildes in the file name.  Returns data allocated by xmalloc.
                     16:  * Warning: this calls getpw*.
                     17:  */
1.3       markus     18: char *
                     19: tilde_expand_filename(const char *filename, uid_t my_uid)
1.1       deraadt    20: {
1.3       markus     21:        const char *cp;
                     22:        unsigned int userlen;
                     23:        char *expanded;
                     24:        struct passwd *pw;
                     25:        char user[100];
1.6     ! deraadt    26:        int len;
1.3       markus     27:
                     28:        /* Return immediately if no tilde. */
                     29:        if (filename[0] != '~')
                     30:                return xstrdup(filename);
                     31:
                     32:        /* Skip the tilde. */
                     33:        filename++;
                     34:
                     35:        /* Find where the username ends. */
                     36:        cp = strchr(filename, '/');
                     37:        if (cp)
1.4       deraadt    38:                userlen = cp - filename;        /* Something after username. */
1.3       markus     39:        else
1.4       deraadt    40:                userlen = strlen(filename);     /* Nothing after username. */
1.3       markus     41:        if (userlen == 0)
1.5       markus     42:                pw = getpwuid(my_uid);          /* Own home directory. */
1.3       markus     43:        else {
                     44:                /* Tilde refers to someone elses home directory. */
                     45:                if (userlen > sizeof(user) - 1)
                     46:                        fatal("User name after tilde too long.");
                     47:                memcpy(user, filename, userlen);
                     48:                user[userlen] = 0;
                     49:                pw = getpwnam(user);
                     50:        }
                     51:        if (!pw)
                     52:                fatal("Unknown user %100s.", user);
                     53:
                     54:        /* If referring to someones home directory, return it now. */
1.5       markus     55:        if (!cp) {
                     56:                /* Only home directory specified */
1.3       markus     57:                return xstrdup(pw->pw_dir);
                     58:        }
                     59:        /* Build a path combining the specified directory and path. */
1.6     ! deraadt    60:        len = strlen(pw->pw_dir) + strlen(cp + 1) + 2;
        !            61:        if (len > MAXPATHLEN)
        !            62:                fatal("Home directory too long (%d > %d", len-1, MAXPATHLEN-1);
        !            63:        expanded = xmalloc(len);
        !            64:        snprintf(expanded, len, "%s/%s", pw->pw_dir, cp + 1);
1.3       markus     65:        return expanded;
1.1       deraadt    66: }