File: tildepath.c

package info (click to toggle)
sunclock 3.57-15
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,620 kB
  • sloc: ansic: 14,419; makefile: 815; perl: 111; sh: 33
file content (139 lines) | stat: -rw-r--r-- 2,437 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
T* NAME
 *
 *    tildepath.c - Convert ~name to a path.
 *
T* SYNOPSIS
 *
 *    char *tildepath(path);
 *    char *path;		- ~path specification
 *
T* DESCRIPTION
 *
 *    This routine takes a path of the for ~[name]/... and returns the true
 * path for the users home directory.  Any additional path information is
 * tacked onto the end of the new path. 
 *
T* RETURNS
 *
 *    A path if one is valid, NULL otherwise.  Note that the memory allocated
 * for the new path should be freed by the calling program.
 *
T* AUTHOR
 *
 *    Stephen Martin, March 12, 1991.
 */

/*
 * Version
 */

/* static char SccsId[] = { "@(#) tildepath.c 1.1@(#)" }; */

/*
 * Include Files
 */

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <malloc.h>
#include <string.h>

/*
 * Define Statements
 */

#ifndef NULL
#define NULL (char *) 0
#endif

/*
 * tildepath()
 */

char *
tildepath(char *path)		/* Path starting with ~ */
{
    /*
     * Local Variables
     */

    char *username;	/* Points to the username */
    char *rest;		/* Rest of input path */
    char *result;	/* Used to construct the result */
    struct passwd *pwent; /* Password entry for user */
    int size;		/* Length of new path */

    /*
     * Functions
     */

    /*    char *strdup();	*/	/* Make a copy of a path */

    /*
     * If the path doesn't start with ~ quit right now
     */

    if (path[0] != '~')
	return(NULL);

    /*
     * Find the name delimited by / or the end of the string
     */

    if ((username = strdup(++path)) == NULL)
	return(NULL);
    if ((rest = strchr(username, '/'))) {
	*rest = '\0';
	rest++;
    }

    /*
     * Get the user's password entry
     */

    if (username[0])
	pwent = getpwnam(username);
    else
	pwent = getpwuid(getuid());

    /*
     * Check to see if a password entry was found
     */

    if (pwent == NULL) {
	free(username);	
	return(NULL);
    }

    /*
     * Determine the size of the new path and allocate space for it
     */

    size = strlen(pwent->pw_dir) + 1;
    if (rest && (rest[0] != '\0'))
	size += strlen(rest) + 1;
    if ((result = calloc(size, sizeof(char))) == NULL) {
	free(username);
	return(NULL);
    }

    /*
     * Copy over the new path
     */

    strcpy(result, pwent->pw_dir);
    if (rest && (rest[0] != '\0')) {
	strcat(result, "/");
	strcat(result, rest);
    }

    /*
     * Done
     */

    free(username);
    return(result);
}