|
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 |
}
|