1
/* addext.c -- add an extension to a file name
3
Copyright (C) 1990, 1997, 1998, 1999, 2001, 2003 Free Software
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2, or (at your option)
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; see the file COPYING.
18
If not, write to the Free Software Foundation,
19
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
/* Written by David MacKenzie <djm@gnu.ai.mit.edu> and Paul Eggert */
27
#ifndef HAVE_DOS_FILE_NAMES
28
# define HAVE_DOS_FILE_NAMES 0
30
#ifndef HAVE_LONG_FILE_NAMES
31
# define HAVE_LONG_FILE_NAMES 0
37
#ifndef _POSIX_NAME_MAX
38
# define _POSIX_NAME_MAX 14
41
#include <sys/types.h>
57
#include "backupfile.h"
60
/* Append to FILENAME the extension EXT, unless the result would be too long,
61
in which case just append the character E. */
64
addext (char *filename, char const *ext, int e)
66
char *s = base_name (filename);
67
size_t slen = base_len (s);
68
size_t extlen = strlen (ext);
69
size_t slen_max = HAVE_LONG_FILE_NAMES ? 255 : _POSIX_NAME_MAX;
71
#if HAVE_PATHCONF && defined _PC_NAME_MAX
72
if (_POSIX_NAME_MAX < slen + extlen || HAVE_DOS_FILE_NAMES)
74
/* The new base name is long enough to require a pathconf check. */
78
name_max = pathconf (".", _PC_NAME_MAX);
84
name_max = pathconf (filename, _PC_NAME_MAX);
87
if (0 <= name_max || errno == 0)
89
long size = slen_max = name_max;
96
if (HAVE_DOS_FILE_NAMES && slen_max <= 12)
98
/* Live within DOS's 8.3 limit. */
99
char *dot = strchr (s, '.');
108
extlen = 9; /* Don't use EXT. */
111
if (slen + extlen <= slen_max)
112
strcpy (s + slen, ext);
115
if (slen_max <= slen)