mirror of
https://github.com/curl/curl.git
synced 2026-08-02 08:30:30 +03:00
curl tool: reviewed code moved to tool_*.[ch] files
This commit is contained in:
parent
00532341b5
commit
fdecb56cbf
19 changed files with 630 additions and 370 deletions
202
src/tool_doswin.c
Normal file
202
src/tool_doswin.c
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include "setup.h"
|
||||
|
||||
#if defined(MSDOS) || defined(WIN32)
|
||||
|
||||
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
|
||||
# include <libgen.h>
|
||||
#endif
|
||||
|
||||
#include "tool_bname.h"
|
||||
#include "tool_doswin.h"
|
||||
|
||||
#include "memdebug.h" /* keep this as LAST include */
|
||||
|
||||
#ifdef WIN32
|
||||
# undef PATH_MAX
|
||||
# define PATH_MAX MAX_PATH
|
||||
#endif
|
||||
|
||||
#ifndef S_ISCHR
|
||||
# ifdef S_IFCHR
|
||||
# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
|
||||
# else
|
||||
# define S_ISCHR(m) (0) /* cannot tell if file is a device */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
# define _use_lfn(f) (0, 1) /* long file names always available */
|
||||
#elif !defined(__DJGPP__) || (__DJGPP__ < 2) /* DJGPP 2.0 has _use_lfn() */
|
||||
# define _use_lfn(f) (1, 0) /* long file names never available */
|
||||
#endif
|
||||
|
||||
static const char *msdosify (const char *file_name);
|
||||
static char *rename_if_dos_device_name (char *file_name);
|
||||
|
||||
/*
|
||||
* sanitize_dos_name: returns a newly allocated string holding a
|
||||
* valid file name which will be a transformation of given argument
|
||||
* in case this wasn't already a valid file name.
|
||||
*
|
||||
* This function takes ownership of given argument, free'ing it before
|
||||
* returning. Caller is responsible of free'ing returned string. Upon
|
||||
* out of memory condition function returns NULL.
|
||||
*/
|
||||
|
||||
char *sanitize_dos_name(char *file_name)
|
||||
{
|
||||
char new_name[PATH_MAX];
|
||||
|
||||
if(!file_name)
|
||||
return NULL;
|
||||
|
||||
if(strlen(file_name) >= PATH_MAX)
|
||||
file_name[PATH_MAX-1] = '\0'; /* truncate it */
|
||||
|
||||
strcpy(new_name, msdosify(file_name));
|
||||
|
||||
free(file_name);
|
||||
|
||||
return strdup(rename_if_dos_device_name(new_name));
|
||||
}
|
||||
|
||||
/* The following functions are taken with modification from the DJGPP
|
||||
* port of tar 1.12. They use algorithms originally from DJTAR. */
|
||||
|
||||
static const char *msdosify (const char *file_name)
|
||||
{
|
||||
static char dos_name[PATH_MAX];
|
||||
static const char illegal_chars_dos[] = ".+, ;=[]" /* illegal in DOS */
|
||||
"|<>\\\":?*"; /* illegal in DOS & W95 */
|
||||
static const char *illegal_chars_w95 = &illegal_chars_dos[8];
|
||||
int idx, dot_idx;
|
||||
const char *s = file_name;
|
||||
char *d = dos_name;
|
||||
const char *const dlimit = dos_name + sizeof(dos_name) - 1;
|
||||
const char *illegal_aliens = illegal_chars_dos;
|
||||
size_t len = sizeof(illegal_chars_dos) - 1;
|
||||
|
||||
/* Support for Windows 9X VFAT systems, when available. */
|
||||
if(_use_lfn(file_name)) {
|
||||
illegal_aliens = illegal_chars_w95;
|
||||
len -= (illegal_chars_w95 - illegal_chars_dos);
|
||||
}
|
||||
|
||||
/* Get past the drive letter, if any. */
|
||||
if(s[0] >= 'A' && s[0] <= 'z' && s[1] == ':') {
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
}
|
||||
|
||||
for(idx = 0, dot_idx = -1; *s && d < dlimit; s++, d++) {
|
||||
if(memchr(illegal_aliens, *s, len)) {
|
||||
/* Dots are special: DOS doesn't allow them as the leading character,
|
||||
and a file name cannot have more than a single dot. We leave the
|
||||
first non-leading dot alone, unless it comes too close to the
|
||||
beginning of the name: we want sh.lex.c to become sh_lex.c, not
|
||||
sh.lex-c. */
|
||||
if(*s == '.') {
|
||||
if(idx == 0 && (s[1] == '/' || (s[1] == '.' && s[2] == '/'))) {
|
||||
/* Copy "./" and "../" verbatim. */
|
||||
*d++ = *s++;
|
||||
if(*s == '.')
|
||||
*d++ = *s++;
|
||||
*d = *s;
|
||||
}
|
||||
else if(idx == 0)
|
||||
*d = '_';
|
||||
else if(dot_idx >= 0) {
|
||||
if(dot_idx < 5) { /* 5 is a heuristic ad-hoc'ery */
|
||||
d[dot_idx - idx] = '_'; /* replace previous dot */
|
||||
*d = '.';
|
||||
}
|
||||
else
|
||||
*d = '-';
|
||||
}
|
||||
else
|
||||
*d = '.';
|
||||
|
||||
if(*s == '.')
|
||||
dot_idx = idx;
|
||||
}
|
||||
else if(*s == '+' && s[1] == '+') {
|
||||
if(idx - 2 == dot_idx) { /* .c++, .h++ etc. */
|
||||
*d++ = 'x';
|
||||
*d = 'x';
|
||||
}
|
||||
else {
|
||||
/* libg++ etc. */
|
||||
memcpy (d, "plus", 4);
|
||||
d += 3;
|
||||
}
|
||||
s++;
|
||||
idx++;
|
||||
}
|
||||
else
|
||||
*d = '_';
|
||||
}
|
||||
else
|
||||
*d = *s;
|
||||
if(*s == '/') {
|
||||
idx = 0;
|
||||
dot_idx = -1;
|
||||
}
|
||||
else
|
||||
idx++;
|
||||
}
|
||||
|
||||
*d = '\0';
|
||||
return dos_name;
|
||||
}
|
||||
|
||||
static char *rename_if_dos_device_name (char *file_name)
|
||||
{
|
||||
/* We could have a file whose name is a device on MS-DOS. Trying to
|
||||
* retrieve such a file would fail at best and wedge us at worst. We need
|
||||
* to rename such files. */
|
||||
char *base;
|
||||
struct_stat st_buf;
|
||||
char fname[PATH_MAX];
|
||||
|
||||
strncpy(fname, file_name, PATH_MAX-1);
|
||||
fname[PATH_MAX-1] = '\0';
|
||||
base = basename(fname);
|
||||
if(((stat(base, &st_buf)) == 0) && (S_ISCHR(st_buf.st_mode))) {
|
||||
size_t blen = strlen(base);
|
||||
|
||||
if(strlen(fname) >= PATH_MAX-1) {
|
||||
/* Make room for the '_' */
|
||||
blen--;
|
||||
base[blen] = '\0';
|
||||
}
|
||||
/* Prepend a '_'. */
|
||||
memmove(base + 1, base, blen + 1);
|
||||
base[0] = '_';
|
||||
strcpy(file_name, fname);
|
||||
}
|
||||
return file_name;
|
||||
}
|
||||
|
||||
#endif /* MSDOS || WIN32 */
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue