Blame lib/cat_path.c

Packit 8480eb
/* ----------------------------------------------------------------------- *
Packit 8480eb
 *
Packit 8480eb
 *  cat_path.c - boundary aware buffer management routines
Packit 8480eb
 *
Packit 8480eb
 *   Copyright 2002-2003 Ian Kent <raven@themaw.net> - All Rights Reserved
Packit 8480eb
 *
Packit 8480eb
 *   This program is free software; you can redistribute it and/or modify
Packit 8480eb
 *   it under the terms of the GNU General Public License as published by
Packit 8480eb
 *   the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
Packit 8480eb
 *   USA; either version 2 of the License, or (at your option) any later
Packit 8480eb
 *   version; incorporated herein by reference.
Packit 8480eb
 *
Packit 8480eb
 * ----------------------------------------------------------------------- */
Packit 8480eb
Packit 8480eb
#include <string.h>
Packit 8480eb
#include <limits.h>
Packit 8480eb
#include <ctype.h>
Packit 8480eb
#include "automount.h"
Packit 8480eb
/*
Packit 8480eb
 * sum = "dir/base" with attention to buffer overflows, and multiple
Packit 8480eb
 * slashes at the joint are avoided.
Packit 8480eb
 */
Packit 8480eb
int cat_path(char *buf, size_t len, const char *dir, const char *base)
Packit 8480eb
{
Packit 8480eb
	char *d = (char *) dir;
Packit 8480eb
	char *b = (char *) base;
Packit 8480eb
	char *s = buf;
Packit 8480eb
	size_t left = len;
Packit 8480eb
Packit 8480eb
	if ((*s = *d))
Packit 8480eb
		while ((*++s = *++d) && --left) ;
Packit 8480eb
	
Packit 8480eb
	if (!left) {
Packit 8480eb
		*s = '\0';
Packit 8480eb
		return 0;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	/* Now we have at least 1 left in output buffer */
Packit 8480eb
Packit 8480eb
	while (*--s == '/' && (left++ < len))
Packit 8480eb
		*s = '\0';
Packit 8480eb
Packit 8480eb
	*++s = '/';
Packit 8480eb
	left--;
Packit 8480eb
Packit 8480eb
	if (*b == '/') 
Packit 8480eb
		while (*++b == '/');
Packit 8480eb
Packit 8480eb
	while (--left && (*++s = *b++)) ;
Packit 8480eb
Packit 8480eb
	if (!left) {
Packit 8480eb
		*s = '\0';
Packit 8480eb
		return 0;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return 1;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
size_t _strlen(const char *str, size_t max)
Packit 8480eb
{
Packit 8480eb
	const char *s = str;
Packit 8480eb
	size_t len = 0;
Packit 8480eb
Packit 8480eb
	while (*s++ && len < max)
Packit 8480eb
		len++;
Packit 8480eb
Packit 8480eb
	return len;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
/* 
Packit 8480eb
 * sum = "dir/base" with attention to buffer overflows, and multiple
Packit 8480eb
 * slashes at the joint are avoided.  The length of base is specified
Packit 8480eb
 * explicitly.
Packit 8480eb
 */
Packit 8480eb
int ncat_path(char *buf, size_t len,
Packit 8480eb
	      const char *dir, const char *base, size_t blen)
Packit 8480eb
{
Packit 8480eb
	char name[PATH_MAX+1];
Packit 8480eb
	size_t alen = _strlen(base, blen);
Packit 8480eb
Packit 8480eb
	if (blen > PATH_MAX || !alen)
Packit 8480eb
		return 0;
Packit 8480eb
	
Packit 8480eb
	strncpy(name, base, alen);
Packit 8480eb
	name[alen] = '\0';
Packit 8480eb
Packit 8480eb
	return cat_path(buf, len, dir, name);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
/* Compare first n bytes of s1 and s2 and that n == strlen(s1) */
Packit 8480eb
int _strncmp(const char *s1, const char *s2, size_t n)
Packit 8480eb
{
Packit 8480eb
	size_t len = strlen(s1);
Packit 8480eb
Packit 8480eb
	if (n && n != len)
Packit 8480eb
		return n - len;
Packit 8480eb
	return strncmp(s1, s2, n);
Packit 8480eb
}