- char *absolute_path;
- if (strlen(path) == 0) {
- return NULL;
- }
-
- /* absolute path, we don't do anything */
- if (path[0] == '/') {
- if (is_directory(path) == -1) {
- return NULL;
- }
- absolute_path = strdup(path);
- return absolute_path;
- }
-
- char *pwd = get_current_dir_name();
- size_t len = strlen(pwd) + 1 + strlen(path) + 1;
- int has_trailing_backslash = (path[strlen(path)-1] == '/');
- if (!has_trailing_backslash)
- len++;
-
- absolute_path = (char*) malloc(sizeof(char) * len);
- memset(absolute_path, '\0', len);
- sprintf(absolute_path, "%s/%s", pwd, path);
-
- if(!has_trailing_backslash)
- absolute_path[len-2] = '/';
-
- if (is_directory(absolute_path) == -1) {
- free(absolute_path);
- return NULL;
+ char *absolute_path = stralloc( PATH_MAX );
+ if ( ( strlen( path ) == 0 ) ||
+ ( realpath( path, absolute_path ) == 0 ) ||
+ ( is_directory( absolute_path ) == -1 ) ) {
+ return NULL; // Path badness