mirror of git://gcc.gnu.org/git/gcc.git
re PR libfortran/51899 (libgfortran's chmod.c fails to build on MinGW)
2012-01-20 Tobias Burnus <burnus@net-b.de> PR libgfortran/51899 * configure.ac: Check whether umask is available. * intrinsics/chmod.c (chmod_func): Make compile with MinGW. * configure: Regenerate. * config.h.in: Regenerate. From-SVN: r183335
This commit is contained in:
parent
f69ce7cf49
commit
8ecd1c0da4
|
@ -1,3 +1,11 @@
|
||||||
|
2012-01-20 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
|
PR libgfortran/51899
|
||||||
|
* configure.ac: Check whether umask is available.
|
||||||
|
* intrinsics/chmod.c (chmod_func): Make compile with MinGW.
|
||||||
|
* configure: Regenerate.
|
||||||
|
* config.h.in: Regenerate.
|
||||||
|
|
||||||
2012-01-12 Tobias Burnus <burnus@net-b.de>
|
2012-01-12 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
PR fortran/36755
|
PR fortran/36755
|
||||||
|
|
|
@ -783,6 +783,9 @@
|
||||||
/* Define to 1 if the system has the type `uintptr_t'. */
|
/* Define to 1 if the system has the type `uintptr_t'. */
|
||||||
#undef HAVE_UINTPTR_T
|
#undef HAVE_UINTPTR_T
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `umask' function. */
|
||||||
|
#undef HAVE_UMASK
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
#undef HAVE_UNISTD_H
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
|
|
@ -2591,6 +2591,7 @@ as_fn_append ac_func_list " getpid"
|
||||||
as_fn_append ac_func_list " getppid"
|
as_fn_append ac_func_list " getppid"
|
||||||
as_fn_append ac_func_list " getuid"
|
as_fn_append ac_func_list " getuid"
|
||||||
as_fn_append ac_func_list " geteuid"
|
as_fn_append ac_func_list " geteuid"
|
||||||
|
as_fn_append ac_func_list " umask"
|
||||||
# Check that the precious variables saved in the cache have kept the same
|
# Check that the precious variables saved in the cache have kept the same
|
||||||
# value.
|
# value.
|
||||||
ac_cache_corrupted=false
|
ac_cache_corrupted=false
|
||||||
|
@ -12317,7 +12318,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<_LT_EOF
|
cat > conftest.$ac_ext <<_LT_EOF
|
||||||
#line 12320 "configure"
|
#line 12321 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
@ -12423,7 +12424,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<_LT_EOF
|
cat > conftest.$ac_ext <<_LT_EOF
|
||||||
#line 12426 "configure"
|
#line 12427 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
@ -16529,6 +16530,8 @@ done
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -266,7 +266,7 @@ ftruncate chsize chdir getlogin gethostname kill link symlink sleep ttyname \
|
||||||
alarm access fork execl wait setmode execve pipe dup2 close \
|
alarm access fork execl wait setmode execve pipe dup2 close \
|
||||||
strcasestr getrlimit gettimeofday stat fstat lstat getpwuid vsnprintf dup \
|
strcasestr getrlimit gettimeofday stat fstat lstat getpwuid vsnprintf dup \
|
||||||
getcwd localtime_r gmtime_r strerror_r getpwuid_r ttyname_r clock_gettime \
|
getcwd localtime_r gmtime_r strerror_r getpwuid_r ttyname_r clock_gettime \
|
||||||
readlink getgid getpid getppid getuid geteuid)
|
readlink getgid getpid getppid getuid geteuid umask)
|
||||||
|
|
||||||
# Check for C99 (and other IEEE) math functions
|
# Check for C99 (and other IEEE) math functions
|
||||||
AC_CHECK_LIB([m],[acosf],[AC_DEFINE([HAVE_ACOSF],[1],[libm includes acosf])])
|
AC_CHECK_LIB([m],[acosf],[AC_DEFINE([HAVE_ACOSF],[1],[libm includes acosf])])
|
||||||
|
|
|
@ -37,6 +37,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
|
|
||||||
Sets the file permission "chmod" using a mode string.
|
Sets the file permission "chmod" using a mode string.
|
||||||
|
|
||||||
|
For MinGW, only _S_IWRITE and _S_IREAD are supported. To set those,
|
||||||
|
only the user attributes are used.
|
||||||
|
|
||||||
The mode string allows for the same arguments as POSIX's chmod utility.
|
The mode string allows for the same arguments as POSIX's chmod utility.
|
||||||
a) string containing an octal number.
|
a) string containing an octal number.
|
||||||
b) Comma separated list of clauses of the form:
|
b) Comma separated list of clauses of the form:
|
||||||
|
@ -89,8 +92,15 @@ chmod_func (char *name, char *mode, gfc_charlen_type name_len,
|
||||||
|
|
||||||
if (mode[0] >= '0' && mode[0] <= '9')
|
if (mode[0] >= '0' && mode[0] <= '9')
|
||||||
{
|
{
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
unsigned mode;
|
||||||
|
if (sscanf (mode, "%o", &mode) != 1)
|
||||||
|
return 1;
|
||||||
|
file_mode = (mode_t) mode;
|
||||||
|
#else
|
||||||
if (sscanf (mode, "%o", &file_mode) != 1)
|
if (sscanf (mode, "%o", &file_mode) != 1)
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
return chmod (file, file_mode);
|
return chmod (file, file_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,10 +111,14 @@ chmod_func (char *name, char *mode, gfc_charlen_type name_len,
|
||||||
file_mode = stat_buf.st_mode & ~S_IFMT;
|
file_mode = stat_buf.st_mode & ~S_IFMT;
|
||||||
is_dir = stat_buf.st_mode & S_IFDIR;
|
is_dir = stat_buf.st_mode & S_IFDIR;
|
||||||
|
|
||||||
|
#ifdef HAVE_UMASK
|
||||||
/* Obtain the umask without distroying the setting. */
|
/* Obtain the umask without distroying the setting. */
|
||||||
mode_mask = 0;
|
mode_mask = 0;
|
||||||
mode_mask = umask (mode_mask);
|
mode_mask = umask (mode_mask);
|
||||||
(void) umask (mode_mask);
|
(void) umask (mode_mask);
|
||||||
|
#else
|
||||||
|
honor_umask = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < mode_len; i++)
|
for (i = 0; i < mode_len; i++)
|
||||||
{
|
{
|
||||||
|
@ -113,7 +127,9 @@ chmod_func (char *name, char *mode, gfc_charlen_type name_len,
|
||||||
ugo[0] = false;
|
ugo[0] = false;
|
||||||
ugo[1] = false;
|
ugo[1] = false;
|
||||||
ugo[2] = false;
|
ugo[2] = false;
|
||||||
|
#ifdef HAVE_UMASK
|
||||||
honor_umask = true;
|
honor_umask = true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
continue_clause = false;
|
continue_clause = false;
|
||||||
rwxXstugo[0] = false;
|
rwxXstugo[0] = false;
|
||||||
|
@ -140,7 +156,9 @@ chmod_func (char *name, char *mode, gfc_charlen_type name_len,
|
||||||
ugo[1] = true;
|
ugo[1] = true;
|
||||||
ugo[2] = true;
|
ugo[2] = true;
|
||||||
part = 1;
|
part = 1;
|
||||||
|
#ifdef HAVE_UMASK
|
||||||
honor_umask = false;
|
honor_umask = false;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
if (part == 2)
|
if (part == 2)
|
||||||
|
@ -153,7 +171,9 @@ chmod_func (char *name, char *mode, gfc_charlen_type name_len,
|
||||||
return 1;
|
return 1;
|
||||||
ugo[0] = true;
|
ugo[0] = true;
|
||||||
part = 1;
|
part = 1;
|
||||||
|
#ifdef HAVE_UMASK
|
||||||
honor_umask = false;
|
honor_umask = false;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
if (part == 2)
|
if (part == 2)
|
||||||
|
@ -166,7 +186,9 @@ chmod_func (char *name, char *mode, gfc_charlen_type name_len,
|
||||||
return 1;
|
return 1;
|
||||||
ugo[1] = true;
|
ugo[1] = true;
|
||||||
part = 1;
|
part = 1;
|
||||||
|
#ifdef HAVE_UMASK
|
||||||
honor_umask = false;
|
honor_umask = false;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
if (part == 2)
|
if (part == 2)
|
||||||
|
@ -179,7 +201,9 @@ chmod_func (char *name, char *mode, gfc_charlen_type name_len,
|
||||||
return 1;
|
return 1;
|
||||||
ugo[2] = true;
|
ugo[2] = true;
|
||||||
part = 1;
|
part = 1;
|
||||||
|
#ifdef HAVE_UMASK
|
||||||
honor_umask = false;
|
honor_umask = false;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Mode setting: =+-. */
|
/* Mode setting: =+-. */
|
||||||
|
@ -285,6 +309,18 @@ clause_done:
|
||||||
|
|
||||||
new_mode = 0;
|
new_mode = 0;
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
|
||||||
|
/* Read. */
|
||||||
|
if (rwxXstugo[0] && (ugo[0] || honor_umask))
|
||||||
|
new_mode |= _S_IREAD;
|
||||||
|
|
||||||
|
/* Write. */
|
||||||
|
if (rwxXstugo[1] && (ugo[0] || honor_umask))
|
||||||
|
new_mode |= _S_IWRITE;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/* Read. */
|
/* Read. */
|
||||||
if (rwxXstugo[0])
|
if (rwxXstugo[0])
|
||||||
{
|
{
|
||||||
|
@ -400,12 +436,20 @@ clause_done:
|
||||||
new_mode |= S_IXGRP;
|
new_mode |= S_IXGRP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* __MINGW32__ */
|
||||||
|
|
||||||
|
#ifdef HAVE_UMASK
|
||||||
if (honor_umask)
|
if (honor_umask)
|
||||||
new_mode &= ~mode_mask;
|
new_mode &= ~mode_mask;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (set_mode == 1)
|
if (set_mode == 1)
|
||||||
{
|
{
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
if (ugo[0] || honor_umask)
|
||||||
|
file_mode = (file_mode & ~(_S_IWRITE | _S_IREAD))
|
||||||
|
| (new_mode & (_S_IWRITE | _S_IREAD));
|
||||||
|
#else
|
||||||
/* Set '='. */
|
/* Set '='. */
|
||||||
if ((ugo[0] || honor_umask) && !rwxXstugo[6])
|
if ((ugo[0] || honor_umask) && !rwxXstugo[6])
|
||||||
file_mode = (file_mode & ~(S_ISUID | S_IRUSR | S_IWUSR | S_IXUSR))
|
file_mode = (file_mode & ~(S_ISUID | S_IRUSR | S_IWUSR | S_IXUSR))
|
||||||
|
@ -420,21 +464,26 @@ clause_done:
|
||||||
file_mode |= S_ISVTX;
|
file_mode |= S_ISVTX;
|
||||||
else if (!is_dir)
|
else if (!is_dir)
|
||||||
file_mode &= ~S_ISVTX;
|
file_mode &= ~S_ISVTX;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (set_mode == 2)
|
else if (set_mode == 2)
|
||||||
{
|
{
|
||||||
/* Clear '-'. */
|
/* Clear '-'. */
|
||||||
file_mode &= ~new_mode;
|
file_mode &= ~new_mode;
|
||||||
|
#ifndef __MINGW32__
|
||||||
if (rwxXstugo[5] || !is_dir)
|
if (rwxXstugo[5] || !is_dir)
|
||||||
file_mode &= ~S_ISVTX;
|
file_mode &= ~S_ISVTX;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (set_mode == 3)
|
else if (set_mode == 3)
|
||||||
{
|
{
|
||||||
file_mode |= new_mode;
|
file_mode |= new_mode;
|
||||||
|
#ifndef __MINGW32__
|
||||||
if (rwxXstugo[5] && is_dir)
|
if (rwxXstugo[5] && is_dir)
|
||||||
file_mode |= S_ISVTX;
|
file_mode |= S_ISVTX;
|
||||||
else if (!is_dir)
|
else if (!is_dir)
|
||||||
file_mode &= ~S_ISVTX;
|
file_mode &= ~S_ISVTX;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,7 +491,6 @@ clause_done:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void chmod_i4_sub (char *, char *, GFC_INTEGER_4 *,
|
extern void chmod_i4_sub (char *, char *, GFC_INTEGER_4 *,
|
||||||
gfc_charlen_type, gfc_charlen_type);
|
gfc_charlen_type, gfc_charlen_type);
|
||||||
export_proto(chmod_i4_sub);
|
export_proto(chmod_i4_sub);
|
||||||
|
|
Loading…
Reference in New Issue