* libguile/posix.c (scm_system_star): Cast 'SIG_IGN' to
'scm_t_uintptr_t' and use 'scm_from_uintptr_t'. This fixes an
'int-conversion' warning with GCC 6.2.
Fixes <http://bugs.gnu.org/24659>.
* libguile/filesys.c (SCM_DEFINE): Remove calls to 'umask' when MODE is
unbound; instead, use 0777 as the mode. Update docstring to clarify
this.
* doc/ref/posix.texi (File System): Adjust accordingly.
* NEWS: Mention it.
* libguile/simpos.c: Trim includes.
(scm_system_star): Move to posix.c.
* libguile/simpos.h (scm_system_star): Remove.
* libguile/posix.h (scm_system_star): Add.
* libguile/posix.c (scm_system_star): Move here and implement in terms
of open-process. This lets system* work on Windows. Inspired by a
patch by Eli Zaretskii.
(start_child): Exit with 127 if the command isn't found.
Fixes <https://bugs.gentoo.org/show_bug.cgi?id=590528>.
* libguile/Makefile.am (BUILT_INCLUDES): New variable.
(BUILT_SOURCES): Put .i and other generated .h to BUILT_INCLUDES.
(DOT_X_FILES, EXTRA_DOT_X_FILES, DOT_DOC_FILES, EXTRA_DOT_DOC_FILES):
Depend on $(BUILT_INCLUDES), in place of scmconfig.h which is included
in $(BUILT_INCLUDES).
This reverts commit edd6d6e280.
As reported at <https://bugs.gentoo.org/show_bug.cgi?id=590528#c10>,
that commit failed to fix the bug.
That commit was based on the mistaken belief that the make rule syntax
".c.x: $(BUILT_INCLUDES)" means the same as ".c.x:" but with the added
prerequisites "$(BUILT_INCLUDES)". However, as explained in section
10.7 (Old-Fashioned Suffix Rules) of the GNU Make manual:
Suffix rules cannot have any prerequisites of their own. If they
have any, they are treated as normal files with funny names, not as
suffix rules. Thus, the rule:
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
tells how to make the file '.c.o' from the prerequisite file 'foo.h',
and is not at all like the pattern rule:
%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
which tells how to make '.o' files from '.c' files, and makes all
'.o' files using this pattern rule also depend on 'foo.h'.
* libguile/print.c (display_string_using_iconv): If the encoding the
full utf8 buffer would overflow the output buffer, just keep trucking
instead of erroring. Fixes#22667.
* test-suite/tests/iconv.test ("round-trip"): Add some tests.
* libguile/Makefile.am (BUILT_INCLUDES): New variable.
(BUILT_SOURCES): Put .i and other generated .h to BUILT_INCLUDES.
(.c.x, .c.doc): Depend on BUILT_INCLUDES. Fixes
https://bugs.gentoo.org/show_bug.cgi?id=590528.
* libguile/null-threads.h: Reimplement null-threads stubs for pthread
data types, initializers, and functions in terms of types and inline
functions instead of CPP macros. Fixes unused-value warnings, and
tightens things up in general.
(scm_i_pthread_cleanup_push, scm_i_pthread_cleanup_pop): Remove these,
as they were unused and incorrect -- they would never run the cleanup
handler even if 1 was passed to pop.
* libguile/posix-w32.c: Include gc.h and threads.h.
(proc_record): New structure tag.
<procs, proc_size>: New static variables.
(find_proc, proc_handle, record_proc, delete_proc): New utility
functions.
(start_child): Return value is now pid_t, as it is on Posix
platforms. Record the new process and returns its PID, instead of
returning a handle. Fix the recursive call.
(waitpid, kill, getpriority, setpriority, sched_getaffinity)
(sched_setaffinity): Look up the PID in the recorded subprocesses
before trying to open a process that is not our subprocess. Make
sure any open handle is closed before returning, unless it's our
subprocess.
* m4/mkstemp.m4: Remove.
* lib/mkstemp.c: Remove.
* lib/mkostemp.c: New file.
* m4/mkostemp.m4: New file.
* lib/Makefile.am:
* m4/gnulib-cache.m4:
* m4/gnulib-comp.m4: Remove mkstemp module, replace with mkostemp.
* libguile/fports.h:
* libguile/fports.c (scm_i_mode_to_open_flags): Factor out helper to
parse mode string to open flags.
(scm_open_file_with_encoding): Use the new helper.
* libguile/filesys.c:
(scm_i_mkstemp): Adapt to take optional second argument, being a mode
string. Use mkostemp.
(scm_mkstemp): Backwards compatible shim that calls scm_i_mkstemp.
* doc/ref/posix.texi:
* NEWS: Update.
* module/system/base/compile.scm (call-with-output-file/atomic): Pass
"wb" as mode, to cause O_BINARY to be added on MinGW.
* libguile/net_db.c (SCM_DEFINE_CONSTANT): New helper. Use it to
define constants and avoid the unneeded static variables that were
used before, named "sym_" but actually holding variables. Thanks to
Eli Zaretskii for the report.
* doc/ref/api-options.texi (Common Feature Symbols): Document the popen
feature.
* doc/ref/posix.texi (Pipes): Depend on the popen feature, not fork.
* libguile/posix.c (scm_init_posix): Add popen feature if we can.
* module/ice-9/boot-9.scm (current-warning-port):
* libguile/init.c (scm_init_standard_ports):
* libguile/ports.c (cur_warnport_fluid, scm_current_warning_port)
(scm_set_current_warning_port, scm_init_ports): Define the warning
port in the same way as the error/output/input ports, with a fluid
that doesn't require calling out to Scheme.
* libguile/posix-w32.h:
* libguile/posix-w32.c (kill, waitpid, getpriority, setpriority)
(sched_getaffinity, sched_setaffinity): Add MinGW implementations.
Also, provides macros that on Posix hosts are in sys/wait.h, like
WIFEXITED and WTERMSIG.
(start_child): Add implementation.
* libguile/hashtab.c (vacuum_weak_hash_table): Don't abort if we
apparently remove more items than are in the table; instead print a
warning. "Fixes" #19180.
* libguile/posix.c (scm_getaffinity, scm_setaffinity): Clean up
docstrings. Obviously if you have the function, you don't need to be
told that you have it in the docstring.
* libguile/posix.c (scm_kill): Only provide if the host has `kill'. An
incompatible change on MinGW, where this function would work only if
the PID was the current PID, but that will be fixed by the next
process.
* configure.ac: Check for getuid, getgid, setuid, and setgid.
* libguile/posix.c (scm_getuid, scm_getgid, scm_setuid, scm_setgid):
Only provide Scheme functions if the OS provides these facilities.
(scm_geteuid, scm_getegid, scm_seteuid, scm_setegid): Provide if the
host has getuid, getgid, etc, instead of being in a MinGW guard.
* libguile/ports.c (scm_init_ports): Use the locale as the default
charset. This allows GUILE_INSTALL_LOCALE=1 to work properly,
harmonizing the default port encoding with the installed locale.
* meta/build-env.in: New file which sets up an environment that does not
inherit GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH (unless
cross-compiling).
* doc/ref/Makefile.am (autoconf-macros.texi):
* libguile/Makefile.am (snarf2checkedtexi):
* module/Makefile.am (ice-9/psyntax-pp.go):
* test-suite/standalone/Makefile.am (GUILE_INSTALL_LOCALE):
* am/guilec (.scm.go): Use build-env.
* configure.ac: Create build-env.
* libguile/load.c (load_thunk_from_path, try_load_thunk_from_file):
New functions.
(search_path): Simplify.
(scm_primitive_load_path, scm_init_eval_in_scheme): Use the new
functions to load compiled files.
* module/ice-9/boot-9.scm (load-in-vicinity): Skip invalid .go files.
Inspired by a patch from Jan Nieuwenhuizen <janneke@gnu.org>.
Based on a patch by Andy Stormont <astormont@racktopsystems.com>.
* configure.ac: Check for strtod_l.
* libguile/i18n.c (scm_locale_string_to_integer): Fix style.
(scm_locale_string_to_inexact): Check for strtod_l.
* libguile/bytevectors.c (sym_big, sym_little): Rename from scm_sym_big
and scm_sym_little, and don't use the snarf mechanism as we need to
initialize this value eagerly in case the C API is used before the
Scheme module is loaded.
(scm_bootstrap_bytevectors): Initialize the endianness symbols here.
* libguile/r6rs-ports.c (scm_register_r6rs_ports): Register the R6RS
port kinds here, for the same reason.
* libguile/conv-integer.i.c (SCM_FROM_TYPE_PROTO):
* libguile/conv-uinteger.i.c (SCM_FROM_TYPE_PROTO): Fix a big in which
scm_from_int64 and scm_from_uint64 on a 32-bit platform leaked memory
if they needed to allocate a bignum. Fixes#20079.
* libguile/smob.c (clear_smobnum): New helper.
(finalize_smob): Re-set the smobnum to the "finalized smob" type
before finalizing. Fixes#19883.
(scm_smob_prehistory): Pre-register a "finalized smob" type, which has
no mark procedure.
* test-suite/standalone/test-smob-mark-race.c: New file.
* test-suite/standalone/Makefile.am: Arrange to build and run the new
test.
* libguile/i18n.c (str_upcase, str_downcase, str_upcase_l)
(str_downcase_l): Remove unused inline functions. Based on a patch by
Pedro Aguilar <paguilar@paguilar.org>. Fixes#19172.
* libguile/bytevectors.c (bytevector_large_set): Fix computation of
value size in words.
* test-suite/tests/bytevectors.test: Add test.
Thanks to Ben Rocer <fleabyte@mail.com> for the bug report and fix.
Implements wishlist item <https://debbugs.gnu.org/18592>.
Requested by Frank Terbeck <ft@bewatermyfriend.org>.
Based on a proposed patch by Nala Ginrut <nalaginrut@gmail.com>.
* libguile/foreign.c (cif_to_procedure): Add 'return_errno' argument.
Store its boolean value in the object table of the generated program.
(scm_i_foreign_call): If the stored 'return_errno' flag is true, then
clear 'errno' before the call, save it after the call, and return it
as a second return value.
(pointer_to_procedure): New static function.
(scm_pointer_to_procedure_with_errno): New C API function, implemented
in terms of 'pointer_to_procedure'.
(scm_pointer_to_procedure): Reimplement in terms of
'pointer_to_procedure', no longer bound to "pointer->procedure". See
below.
(scm_i_pointer_to_procedure): New C function bound to
"pointer->procedure" which now accepts the optional #:return-errno?
keyword argument, implemented in terms of 'pointer_to_procedure'.
(k_return_errno): New keyword #:return-errno?.
* libguile/foreign.h (scm_pointer_to_procedure_with_errno): Add prototype.
* doc/ref/api-foreign.texi (Dynamic FFI): Adjust documentation.
This assumption does not hold on systems that use the LLP64 data model.
Partially fixes <https://debbugs.gnu.org/22406>.
Reported by Peter TB Brett <peter@peter-b.co.uk>.
* libguile/numbers.h (scm_t_inum): Move here from numbers.c, and change
to be equivalent to 'long' (formerly 'scm_t_signed_bits').
(SCM_MOST_POSITIVE_FIXNUM, SCM_MOST_NEGATIVE_FIXNUM): Define based on
SCM_I_FIXNUM_BIT instead of SCM_T_SIGNED_BITS_MAX.
(SCM_I_INUM): Adjust definitions to return a 'scm_t_inum', and avoiding
the assumption that SCM_UNPACK returns a 'long'.
* libguile/numbers.c (scm_t_inum): Move definition to numbers.h.
Verify that 'scm_t_inum' fits within a SCM value.
(scm_i_inum2big): Remove preprocessor code that forced a compile error
unless sizeof (long) == sizeof (void *).
* libguile/vm-i-scheme.c (_CX): For fixnum assembly functions, choose
the register size based on SCM_I_FIXNUM_BIT instead of SIZEOF_VOID_P.
(ASM_MUL, "ash", "vector-ref", "vector-set", BV_FIXABLE_INT_REF)
(BV_INT_REF, BV_FLOAT_REF, BV_FIXABLE_INT_SET, BV_INT_SET)
(BV_FLOAT_SET): Use 'scm_t_inum' for fixnums instead of
'scm_t_signed_bits'.
Fixes <https://debbugs.gnu.org/22152>.
Reported by Iwan Aucamp <aucampia@gmail.com>.
* libguile/threads.c (fat_mutex_unlock): Avoid repeatedly decrementing
m->level and changing the owner of the mutex when 'block_self' returns
EINTR. Unblock asyncs before calling scm_syserror. Refactor the code
to clarify the EINTR loop, and to make it more apparent that the async
blocks and unblocks are balanced.