1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-16 08:40:19 +02:00

Allow compilation with `--disable-posix'.

Reported by Dmitry Dzhus <dima@dzhus.org>.

* configure.ac: Remove `AC_LIBOBJ([filesys])'.  Document
  `--disable-posix' as omitting non-essential POSIX interfaces.

* libguile/Makefile.am (libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES):
  Add `filesys.c'.
  (DOT_DOC_FILES): Add `filesys.doc'.
  (EXTRA_libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES): Remove
  `filesys.c'.

* libguile/posix.c (scm_mkstemp, scm_access): Move to `filesys.c'.
  (scm_init_posix): Move `R_OK' etc. to `filesys.c'.

* libguile/filesys.c (scm_chown, scm_chmod, scm_umask, scm_open_fdes,
  scm_open, scm_close, scm_close_fdes, scm_link, scm_tc16_dir,
  scm_directory_stream_p, scm_opendir, scm_readdir, scm_rewinddir,
  scm_closedir, scm_dir_print, scm_dir_free, scm_chdir, scm_getcwd,
  set_element, fill_select_type, get_element, retrieve_select_type,
  scm_select, scm_fcntl, scm_fsync, scm_symlink, scm_readlink,
  scm_lstat, scm_copy_file): Conditionalize on HAVE_POSIX.
  (scm_mkstemp, scm_access): New functions.
  (scm_init_filesys): Conditionalize `scm_tc16_dir', `O_RDONLY', etc. on
  HAVE_POSIX.  Define `R_OK', `W_OK', etc.

* libguile/fports.c (fport_print): Use `scm_ttyname' only when
  HAVE_POSIX.

* libguile/i18n.c (lock_locale_mutex, unlock_locale_mutex): New
  functions.  Update users of `scm_i_locale_mutex' to use them.

* libguile/init.c (scm_i_init_guile): Always call `scm_init_filesys'.

* meta/guile-tools.in (main): Use `setlocale' only when it is defined.

* module/ice-9/boot-9.scm: Always load `ice-9/posix'.
This commit is contained in:
Ludovic Courtès 2011-04-14 23:42:28 +02:00
parent 22072f2155
commit 073167ef7b
9 changed files with 358 additions and 315 deletions

View file

@ -1329,54 +1329,6 @@ SCM_DEFINE (scm_tmpnam, "tmpnam", 0, 0, 0,
#endif
#ifndef HAVE_MKSTEMP
extern int mkstemp (char *);
#endif
SCM_DEFINE (scm_mkstemp, "mkstemp!", 1, 0, 0,
(SCM tmpl),
"Create a new unique file in the file system and return a new\n"
"buffered port open for reading and writing to the file.\n"
"\n"
"@var{tmpl} is a string specifying where the file should be\n"
"created: it must end with @samp{XXXXXX} and those @samp{X}s\n"
"will be changed in the string to return the name of the file.\n"
"(@code{port-filename} on the port also gives the name.)\n"
"\n"
"POSIX doesn't specify the permissions mode of the file, on GNU\n"
"and most systems it's @code{#o600}. An application can use\n"
"@code{chmod} to relax that if desired. For example\n"
"@code{#o666} less @code{umask}, which is usual for ordinary\n"
"file creation,\n"
"\n"
"@example\n"
"(let ((port (mkstemp! (string-copy \"/tmp/myfile-XXXXXX\"))))\n"
" (chmod port (logand #o666 (lognot (umask))))\n"
" ...)\n"
"@end example")
#define FUNC_NAME s_scm_mkstemp
{
char *c_tmpl;
int rv;
scm_dynwind_begin (0);
c_tmpl = scm_to_locale_string (tmpl);
scm_dynwind_free (c_tmpl);
SCM_SYSCALL (rv = mkstemp (c_tmpl));
if (rv == -1)
SCM_SYSERROR;
scm_substring_move_x (scm_from_locale_string (c_tmpl),
SCM_INUM0, scm_string_length (tmpl),
tmpl, SCM_INUM0);
scm_dynwind_end ();
return scm_fdes_to_port (rv, "w+", tmpl);
}
#undef FUNC_NAME
SCM_DEFINE (scm_tmpfile, "tmpfile", 0, 0, 0,
(void),
"Return an input/output port to a unique temporary file\n"
@ -1489,58 +1441,6 @@ SCM_DEFINE (scm_utime, "utime", 1, 5, 0,
}
#undef FUNC_NAME
SCM_DEFINE (scm_access, "access?", 2, 0, 0,
(SCM path, SCM how),
"Test accessibility of a file under the real UID and GID of the\n"
"calling process. The return is @code{#t} if @var{path} exists\n"
"and the permissions requested by @var{how} are all allowed, or\n"
"@code{#f} if not.\n"
"\n"
"@var{how} is an integer which is one of the following values,\n"
"or a bitwise-OR (@code{logior}) of multiple values.\n"
"\n"
"@defvar R_OK\n"
"Test for read permission.\n"
"@end defvar\n"
"@defvar W_OK\n"
"Test for write permission.\n"
"@end defvar\n"
"@defvar X_OK\n"
"Test for execute permission.\n"
"@end defvar\n"
"@defvar F_OK\n"
"Test for existence of the file. This is implied by each of the\n"
"other tests, so there's no need to combine it with them.\n"
"@end defvar\n"
"\n"
"It's important to note that @code{access?} does not simply\n"
"indicate what will happen on attempting to read or write a\n"
"file. In normal circumstances it does, but in a set-UID or\n"
"set-GID program it doesn't because @code{access?} tests the\n"
"real ID, whereas an open or execute attempt uses the effective\n"
"ID.\n"
"\n"
"A program which will never run set-UID/GID can ignore the\n"
"difference between real and effective IDs, but for maximum\n"
"generality, especially in library functions, it's best not to\n"
"use @code{access?} to predict the result of an open or execute,\n"
"instead simply attempt that and catch any exception.\n"
"\n"
"The main use for @code{access?} is to let a set-UID/GID program\n"
"determine what the invoking user would have been allowed to do,\n"
"without the greater (or perhaps lesser) privileges afforded by\n"
"the effective ID. For more on this, see ``Testing File\n"
"Access'' in The GNU C Library Reference Manual.")
#define FUNC_NAME s_scm_access
{
int rv;
WITH_STRING (path, c_path,
rv = access (c_path, scm_to_int (how)));
return scm_from_bool (!rv);
}
#undef FUNC_NAME
SCM_DEFINE (scm_getpid, "getpid", 0, 0, 0,
(),
"Return an integer representing the current process ID.")
@ -2222,12 +2122,6 @@ scm_init_posix ()
scm_c_define ("WUNTRACED", scm_from_int (WUNTRACED));
#endif
/* access() symbols. */
scm_c_define ("R_OK", scm_from_int (R_OK));
scm_c_define ("W_OK", scm_from_int (W_OK));
scm_c_define ("X_OK", scm_from_int (X_OK));
scm_c_define ("F_OK", scm_from_int (F_OK));
#ifdef LC_COLLATE
scm_c_define ("LC_COLLATE", scm_from_int (LC_COLLATE));
#endif