Codebase list unrtf / bd13ae3a-94e6-40bf-b472-38179327dae8/main src / path.c
bd13ae3a-94e6-40bf-b472-38179327dae8/main

Tree @bd13ae3a-94e6-40bf-b472-38179327dae8/main (Download .tar.gz)

path.c @bd13ae3a-94e6-40bf-b472-38179327dae8/main

dff09ba
 
 
 
d5eaff9
 
dff09ba
d5eaff9
dff09ba
 
 
 
d5eaff9
 
 
4329b02
d5eaff9
4329b02
 
d5eaff9
4329b02
 
 
641be09
d5eaff9
dff09ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4329b02
dff09ba
 
 
4329b02
dff09ba
4329b02
dff09ba
 
 
 
 
 
 
 
 
 
 
 
 
f6171fa
dff09ba
 
d5eaff9
 
4329b02
d5eaff9
dff09ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d5eaff9
 
4329b02
 
dff09ba
 
 
 
 
 
 
 
 
 
 
 
4329b02
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <stdio.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#else
#include "safeunistd.h"
#endif

#include <stdlib.h>

#include "path.h"
#include "malloc.h"

char *search_path;
int   path_checked;

static int n_path_dirs;
static struct path_dir topdir;

char *search_in_path(const char *name, char *suffix)
{
	int maxplen = 0;
	int l;
	char *fullname = 0;
	char *path = 0;
	struct path_dir *path_dir_p;

	if (n_path_dirs == 0)
	{
		fprintf(stderr, "no directories to search for %s\n", name);
		return NULL;
	}
	l = strlen(name) + (suffix ? strlen(suffix) : 0) + 2;
	if ((fullname = my_malloc(l)) == NULL)
	{
		fprintf(stderr, "Out of memory\n");
		return NULL;
	}
	strcpy(fullname, name);
	if (suffix && *suffix && suffix[0] != '.')
	{
		strcat(fullname, ".");
	}
	if (suffix && *suffix)
	{
		strcat(fullname, suffix);
	}
	maxplen = 0;

	for (path_dir_p = &topdir; path_dir_p->dir_name;
	        path_dir_p = path_dir_p->next)
	{
		l = strlen(path_dir_p->dir_name);
		if (maxplen < l)
		{
			maxplen = l;
		}
	}
	maxplen += strlen(fullname) + 2; /* final 0 + possible '/' */
	if ((path = my_malloc(maxplen)) == NULL)
	{
		fprintf(stderr, "Out of memory\n");
		return NULL;
	}

	for (path_dir_p = &topdir; path_dir_p->dir_name;
	        path_dir_p = path_dir_p->next)
	{

		strcpy(path, path_dir_p->dir_name);

		if (path[strlen(path) - 1] != '/')
		{
			strcat(path, "/");
		}
		strcat(path, fullname);
		/* fprintf(stderr, "Testing for [%s]\n", path); */
		if (access(path, F_OK | R_OK))
		{
			continue;
		}
		my_free(fullname);
		return path;
	}
	my_free(fullname);
	my_free(path);
	return NULL;
}

int check_dirs()
{
	char *p;
	char *colon;
	char *dir_name;
	struct path_dir *path_dir_p = &topdir;

	/*fprintf(stderr, "check_dirs: search_path: [%s]\n", search_path);*/

	for (p = search_path; *p != '\0';)
	{
		dir_name = p;
		if ((colon = strchr(p, ':')) != NULL)
		{
			p = colon;
			*p++ = '\0';
		}
		else
		{
			p += strlen(p);
		}

		if (access(dir_name, R_OK | X_OK))
		{
			continue;
		}
		path_dir_p->dir_name = dir_name;
		if ((path_dir_p->next = (struct path_dir *)malloc(sizeof(struct path_dir))) == NULL)
		{
			fprintf(stderr, "Out of memory\n");
			exit(1);
		}
		path_dir_p = path_dir_p->next;
		path_dir_p->dir_name = 0;
		n_path_dirs++;
	}
	path_checked = 1;
	return (n_path_dirs);
}

void show_dirs()
{
	struct path_dir *path_dir_p;
	if (n_path_dirs == 0)
	{
		fprintf(stderr, "no directories to show\n");
		exit(1);
	}
	fprintf(stderr, "show_dirs: %d directories\n", n_path_dirs);
	for (path_dir_p = &topdir; path_dir_p->dir_name;
	        path_dir_p = path_dir_p->next)
	{
		fprintf(stderr, "directory = %s\n", path_dir_p->dir_name);
	}
}