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

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