>From 0159950906bd30b1a0aa777fcc563e9a7f7d5de0 Mon Sep 17 00:00:00 2001
From: Evan Hanson
Date: Wed, 27 Dec 2017 19:48:56 +1300
Subject: [PATCH] Split process-context library into "standard" and "posix"
components
This moves the high-level procedures of the chicken.process-context
module out of posix.scm and into library.scm, to avoid programs having
to load the posix unit for things like `get-environment-variable'. The
procedures that are left in the "posix" component are those that deal
with file descriptors, user/group information, and chroot(2).
To allow the setter for `current-directory' to continue to be used with
file descriptor arguments, a hook for directory changes is introduced.
By default, this hook invokes the standard `change-directory' procedure,
and when the posix unit is loaded it's extended to support fchdir(2).
Also, evict the procedures in chicken.process-context from the bare
"chicken" module, in preparation for its removal.
---
README | 1 +
batch-driver.scm | 1 +
chicken-install.scm | 2 +-
chicken-profile.scm | 3 +-
chicken-status.scm | 5 +-
chicken-uninstall.scm | 10 +--
chicken.import.scm | 5 --
chicken.scm | 1 +
csc.scm | 8 +-
defaults.make | 4 +-
distribution/manifest | 2 +
file.scm | 3 +-
library.scm | 152 ++++++++++++++++++++++++++++++++++----
modules.scm | 4 +-
posix-common.scm | 88 ++--------------------
posix.scm | 29 ++++----
posixunix.scm | 11 ---
posixwin.scm | 6 --
rules.make | 20 ++++-
tests/callback-tests.scm | 1 +
tests/executable-tests.scm | 5 +-
tests/fft.scm | 5 +-
tests/file-access-tests.scm | 2 +
tests/locative-stress-test.scm | 3 +-
tests/numbers-test.scm | 1 -
tests/port-tests.scm | 6 +-
tests/posix-tests.scm | 1 +
tests/private-repository-test.scm | 3 +-
types.db | 30 ++++----
29 files changed, 233 insertions(+), 179 deletions(-)
diff --git a/README b/README
index 2569e5d8..ba976f83 100644
--- a/README
+++ b/README
@@ -311,6 +311,7 @@ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/_/
| | |-- chicken.process.import.so
| | |-- chicken.process.signal.import.so
| | |-- chicken.process-context.import.so
+ | | |-- chicken.process-context.posix.import.so
| | |-- chicken.random.import.so
| | |-- chicken.repl.import.so
| | |-- chicken.sort.import.so
diff --git a/batch-driver.scm b/batch-driver.scm
index ebd62ea6..e9a10cde 100644
--- a/batch-driver.scm
+++ b/batch-driver.scm
@@ -43,6 +43,7 @@
chicken.pathname
chicken.platform
chicken.pretty-print
+ chicken.process-context
chicken.string
chicken.time
chicken.compiler.support
diff --git a/chicken-install.scm b/chicken-install.scm
index 7e4e86cd..d1062b81 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -33,11 +33,11 @@
(import (chicken foreign))
(import (chicken keyword))
(import (chicken file))
+(import (chicken file posix))
(import (chicken fixnum))
(import (chicken format))
(import (chicken irregex))
(import (chicken tcp))
-(import (chicken posix))
(import (chicken port))
(import (chicken platform))
(import (chicken io))
diff --git a/chicken-profile.scm b/chicken-profile.scm
index f6968d17..42a48a6f 100644
--- a/chicken-profile.scm
+++ b/chicken-profile.scm
@@ -30,8 +30,9 @@
(import chicken scheme)
(import chicken.file
+ chicken.file.posix
chicken.internal
- chicken.posix
+ chicken.process-context
chicken.sort
chicken.string)
diff --git a/chicken-status.scm b/chicken-status.scm
index cc8be19f..4018f9a7 100644
--- a/chicken-status.scm
+++ b/chicken-status.scm
@@ -32,9 +32,10 @@
(chicken format)
(chicken irregex)
(chicken port)
- (chicken posix)
- (chicken pathname)
+ (chicken posix) ; FIXME once terminal-{size,port?} are rehomed
+ (chicken pathname)
(chicken pretty-print)
+ (chicken process-context)
(chicken sort)
(only (chicken string) ->string))
diff --git a/chicken-uninstall.scm b/chicken-uninstall.scm
index fe47d842..9db8c9c3 100644
--- a/chicken-uninstall.scm
+++ b/chicken-uninstall.scm
@@ -31,12 +31,12 @@
(import (chicken file)
(chicken foreign)
(chicken io)
- (chicken format)
- (chicken irregex)
- (chicken port)
+ (chicken format)
+ (chicken irregex)
+ (chicken port)
(chicken pathname)
- (chicken posix)
- (chicken string))
+ (chicken process-context)
+ (chicken string))
(include "mini-srfi-1.scm")
(include "egg-environment.scm")
diff --git a/chicken.import.scm b/chicken.import.scm
index 610cfe38..604792b5 100644
--- a/chicken.import.scm
+++ b/chicken.import.scm
@@ -28,7 +28,6 @@
'((abort . chicken.condition#abort)
(add1 . chicken.base#add1)
argc+argv
- argv
(bignum? . chicken.base#bignum?)
(build-platform . chicken.platform#build-platform)
(call/cc . chicken.base#call/cc)
@@ -36,7 +35,6 @@
(char-name . chicken.base#char-name)
(chicken-home . chicken.platform#chicken-home)
(chicken-version . chicken.platform#chicken-version)
- command-line-arguments
(condition-predicate . chicken.condition#condition-predicate)
(condition-property-accessor . chicken.condition#condition-property-accessor)
(condition? . chicken.condition#condition?)
@@ -55,7 +53,6 @@
(exact-integer? . chicken.base#exact-integer?)
(exact-integer-sqrt . chicken.base#exact-integer-sqrt)
(exact-integer-nth-root . chicken.base#exact-integer-nth-root)
- executable-pathname
(exit . chicken.base#exit)
(exit-handler . chicken.base#exit-handler)
(expand . chicken.syntax#expand)
@@ -99,7 +96,6 @@
(gensym . chicken.base#gensym)
(get-call-chain . chicken.base#get-call-chain)
(get-condition-property . chicken.condition#get-condition-property)
- get-environment-variable
(get-line-number . chicken.syntax#get-line-number)
get-output-string
(getter-with-setter . chicken.base#getter-with-setter)
@@ -138,7 +134,6 @@
(print-call-chain . chicken.base#print-call-chain)
(print* . chicken.base#print*)
(procedure-information . chicken.base#procedure-information)
- program-name
(promise? . chicken.base#promise?)
(quotient&modulo . chicken.base#quotient&modulo)
(quotient&remainder . chicken.base#quotient&remainder)
diff --git a/chicken.scm b/chicken.scm
index ed7a2ef6..935ecc5f 100644
--- a/chicken.scm
+++ b/chicken.scm
@@ -39,6 +39,7 @@
chicken.compiler.c-platform
chicken.compiler.support
chicken.compiler.user-pass
+ chicken.process-context
chicken.string)
(include "tweaks")
diff --git a/csc.scm b/csc.scm
index 9b8fd531..fb8cc54c 100644
--- a/csc.scm
+++ b/csc.scm
@@ -28,14 +28,14 @@
(module main ()
(import scheme
- chicken
+ chicken
chicken.file
chicken.foreign
chicken.format
- chicken.io
+ chicken.io
chicken.pathname
- chicken.posix
- chicken.process
+ chicken.process
+ chicken.process-context
chicken.string)
(include "egg-environment.scm")
diff --git a/defaults.make b/defaults.make
index 851fb1dc..65002cad 100644
--- a/defaults.make
+++ b/defaults.make
@@ -268,8 +268,8 @@ DYNAMIC_IMPORT_LIBRARIES = srfi-4
DYNAMIC_CHICKEN_IMPORT_LIBRARIES = bitwise blob errno file.posix \
fixnum flonum format gc io keyword load locative memory \
memory.representation platform plist posix pretty-print \
- process process.signal process-context random sort string \
- time time.posix
+ process process.signal process-context process-context.posix \
+ random sort string time time.posix
DYNAMIC_CHICKEN_COMPILER_IMPORT_LIBRARIES = user-pass
DYNAMIC_CHICKEN_UNIT_IMPORT_LIBRARIES = continuation eval file \
internal irregex pathname port read-syntax repl tcp
diff --git a/distribution/manifest b/distribution/manifest
index 1450e019..0fa78f93 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -331,6 +331,8 @@ chicken.process.signal.import.scm
chicken.process.signal.import.c
chicken.process-context.import.scm
chicken.process-context.import.c
+chicken.process-context.posix.import.scm
+chicken.process-context.posix.import.c
chicken.random.import.scm
chicken.random.import.c
chicken.read-syntax.import.scm
diff --git a/file.scm b/file.scm
index 0f8f2ea3..82fd866b 100644
--- a/file.scm
+++ b/file.scm
@@ -87,7 +87,8 @@ EOF
chicken.io
chicken.irregex
chicken.pathname
- chicken.posix)
+ chicken.process-context
+ chicken.posix) ; FIXME file should not depend on posix
(include "common-declarations.scm")
diff --git a/library.scm b/library.scm
index 16eba473..688801cb 100644
--- a/library.scm
+++ b/library.scm
@@ -39,11 +39,12 @@
make-complex flonum->ratnum ratnum
+maximum-allowed-exponent+ mantexp->dbl ldexp round-quotient
##sys#string->compnum ##sys#internal-gcd)
- (not inline ##sys#user-read-hook ##sys#error-hook ##sys#signal-hook
- ##sys#sleep-hook ##sys#schedule ##sys#default-read-info-hook
- ##sys#infix-list-hook ##sys#sharp-number-hook
- ##sys#user-print-hook ##sys#user-interrupt-hook
- ##sys#windows-platform ##sys#features)
+ (not inline ##sys#change-directory-hook ##sys#user-read-hook
+ ##sys#error-hook ##sys#signal-hook ##sys#sleep-hook
+ ##sys#default-read-info-hook ##sys#infix-list-hook
+ ##sys#sharp-number-hook ##sys#user-print-hook
+ ##sys#user-interrupt-hook ##sys#windows-platform
+ ##sys#schedule ##sys#features)
(foreign-declare #<
#include
@@ -1012,22 +1013,17 @@ EOF
(define ##sys#warn warning)
(define ##sys#notice notice)
-(define-foreign-variable main_argc int "C_main_argc")
-(define-foreign-variable main_argv c-pointer "C_main_argv")
(define-foreign-variable strerror c-string "strerror(errno)")
(define ##sys#gc (##core#primitive "C_gc"))
(define (##sys#setslot x i y) (##core#inline "C_i_setslot" x i y))
(define (##sys#setislot x i y) (##core#inline "C_i_set_i_slot" x i y))
(define ##sys#allocate-vector (##core#primitive "C_allocate_vector"))
-(define (argc+argv) (##sys#values main_argc main_argv))
(define ##sys#make-structure (##core#primitive "C_make_structure"))
(define ##sys#ensure-heap-reserve (##core#primitive "C_ensure_heap_reserve"))
(define ##sys#symbol-table-info (##core#primitive "C_get_symbol_table_info"))
(define ##sys#memory-info (##core#primitive "C_get_memory_info"))
(define ##sys#decode-seconds (##core#primitive "C_decode_seconds"))
-(define get-environment-variable (foreign-lambda c-string "C_getenv" c-string))
-(define executable-pathname (foreign-lambda c-string* "C_executable_pathname"))
(define (##sys#start-timer)
(##sys#gc #t)
@@ -5892,9 +5888,135 @@ EOF
[else (##sys#read-error port "unreadable object")] ) ] ) ) ) )
-;;; command-line handling
+;;; Accessing process information (cwd, environ, etc.)
+
+#>
+
+#define C_chdir(str) C_fix(chdir(C_c_string(str)))
+#define C_curdir(buf) (getcwd(C_c_string(buf), 1024) ? C_fix(strlen(C_c_string(buf))) : C_SCHEME_FALSE)
+#define C_getenventry(i) (environ[ i ])
+
+#ifdef HAVE_CRT_EXTERNS_H
+# include
+# define environ (*_NSGetEnviron())
+#else
+extern char **environ;
+#endif
+
+#ifdef HAVE_SETENV
+# define C_unsetenv(s) (unsetenv((char *)C_data_pointer(s)), C_SCHEME_TRUE)
+# define C_setenv(x, y) C_fix(setenv((char *)C_data_pointer(x), (char *)C_data_pointer(y), 1))
+#else
+# if defined(_WIN32) && !defined(__CYGWIN__)
+# define C_unsetenv(s) C_setenv(s, C_SCHEME_FALSE)
+# else
+# define C_unsetenv(s) C_fix(putenv((char *)C_data_pointer(s)))
+# endif
+static C_word C_fcall C_setenv(C_word x, C_word y) {
+ char *sx = C_c_string(x),
+ *sy = (y == C_SCHEME_FALSE ? "" : C_c_string(y));
+ int n1 = C_strlen(sx), n2 = C_strlen(sy);
+ int buf_len = n1 + n2 + 2;
+ char *buf = (char *)C_malloc(buf_len);
+ if(buf == NULL) return(C_fix(0));
+ else {
+ C_strlcpy(buf, sx, buf_len);
+ C_strlcat(buf, "=", buf_len);
+ C_strlcat(buf, sy, buf_len);
+ return(C_fix(putenv(buf)));
+ }
+}
+#endif
+
+<#
+
+(module chicken.process-context
+ (argv argc+argv command-line-arguments
+ program-name executable-pathname
+ change-directory current-directory
+ get-environment-variable get-environment-variables
+ set-environment-variable! unset-environment-variable!)
+
+(import scheme)
+(import chicken.base chicken.fixnum chicken.foreign)
+(import (only chicken unless)) ; FIXME
+;;; Current directory access:
+
+(define (change-directory name)
+ (##sys#check-string name 'change-directory)
+ (let ((sname (##sys#make-c-string name 'change-directory)))
+ (unless (fx= (##core#inline "C_chdir" sname) 0)
+ (##sys#update-errno)
+ (##sys#signal-hook #:file-error 'change-directory
+ (string-append "cannot change current directory - " strerror) name))
+ name))
+
+(define (##sys#change-directory-hook dir) ; set! by posix for fd support
+ (change-directory dir))
+
+(define current-directory
+ (getter-with-setter
+ (lambda ()
+ (let* ((buffer (make-string 1024))
+ (len (##core#inline "C_curdir" buffer)))
+ (unless ##sys#windows-platform ; FIXME need `cond-expand' here
+ (##sys#update-errno))
+ (if len
+ (##sys#substring buffer 0 len)
+ (##sys#signal-hook
+ #:file-error
+ 'current-directory "cannot retrieve current directory"))))
+ (lambda (dir)
+ (##sys#change-directory-hook dir))))
+
+
+;;; Environment access:
+
+(define get-environment-variable
+ (foreign-lambda c-string "C_getenv" c-string))
+
+(define (set-environment-variable! var val)
+ (##sys#check-string var 'set-environment-variable!)
+ (##sys#check-string val 'set-environment-variable!)
+ (##core#inline "C_setenv"
+ (##sys#make-c-string var 'set-environment-variable!)
+ (##sys#make-c-string val 'set-environment-variable!))
+ (##core#undefined))
+
+(define (unset-environment-variable! var)
+ (##sys#check-string var 'unset-environment-variable!)
+ (##core#inline "C_unsetenv"
+ (##sys#make-c-string var 'unset-environment-variable!))
+ (##core#undefined))
+
+(define get-environment-variables
+ (let ((get (foreign-lambda c-string "C_getenventry" int)))
+ (lambda ()
+ (let loop ((i 0))
+ (let ((entry (get i)))
+ (if entry
+ (let scan ((j 0))
+ (if (char=? #\= (##core#inline "C_subchar" entry j))
+ (cons (cons (##sys#substring entry 0 j)
+ (##sys#substring entry (fx+ j 1) (##sys#size entry)))
+ (loop (fx+ i 1)))
+ (scan (fx+ j 1))))
+ '()))))))
+
+
+;;; Command line handling
+
+(define-foreign-variable main_argc int "C_main_argc")
+(define-foreign-variable main_argv c-pointer "C_main_argv")
+
+(define executable-pathname
+ (foreign-lambda c-string* "C_executable_pathname"))
+
+(define (argc+argv)
+ (##sys#values main_argc main_argv))
+
(define argv ; includes program name
(let ((cache #f)
(fetch-arg (foreign-lambda* c-string ((scheme-object i))
@@ -5933,6 +6055,8 @@ EOF
(##sys#check-list x 'command-line-arguments)
x) ) )
+) ; chicken.process-context
+
(module chicken.gc
(current-gc-milliseconds gc memory-statistics set-finalizer!
@@ -6285,10 +6409,12 @@ EOF
)
(import scheme)
-(import chicken.fixnum chicken.foreign chicken.keyword)
-(import (only chicken get-environment-variable make-parameter))
+(import chicken.fixnum chicken.foreign chicken.keyword chicken.process-context)
(import chicken.internal.syntax)
+(import (only chicken make-parameter))
+(import (only chicken when unless define-constant))
+
(define software-type
(let ((sym (string->symbol ((##core#primitive "C_software_type")))))
(lambda () sym)))
diff --git a/modules.scm b/modules.scm
index 8e5179c6..92e13dfe 100644
--- a/modules.scm
+++ b/modules.scm
@@ -1118,8 +1118,8 @@
(##sys#register-core-module
'srfi-98 'posix
- '(get-environment-variable
- (get-environment-variables . chicken.posix#get-environment-variables)))
+ '((get-environment-variable . chicken.process-context#get-environment-variable)
+ (get-environment-variables . chicken.process-context#get-environment-variables)))
(register-feature! 'module-environments)
diff --git a/posix-common.scm b/posix-common.scm
index d8322ce3..589701d8 100644
--- a/posix-common.scm
+++ b/posix-common.scm
@@ -32,8 +32,6 @@
static int C_not_implemented(void);
int C_not_implemented() { return -1; }
-#define C_curdir(buf) (getcwd(C_c_string(buf), 1024) ? C_fix(strlen(C_c_string(buf))) : C_SCHEME_FALSE)
-
static C_TLS struct stat C_statbuf;
#define C_stat_type (C_statbuf.st_mode & S_IFMT)
@@ -110,31 +108,6 @@ static char C_time_string [TIME_STRING_MAXLENGTH + 1];
#define C_fseek(p, n, w) C_mk_nbool(fseek(C_port_file(p), C_num_to_int64(n), C_unfix(w)))
#define C_lseek(fd, o, w) C_fix(lseek(C_unfix(fd), C_num_to_int64(o), C_unfix(w)))
-#ifdef HAVE_SETENV
-# define C_unsetenv(s) (unsetenv((char *)C_data_pointer(s)), C_SCHEME_TRUE)
-# define C_setenv(x, y) C_fix(setenv((char *)C_data_pointer(x), (char *)C_data_pointer(y), 1))
-#else
-# if defined(_WIN32) && !defined(__CYGWIN__)
-# define C_unsetenv(s) C_setenv(s, C_SCHEME_FALSE)
-# else
-# define C_unsetenv(s) C_fix(putenv((char *)C_data_pointer(s)))
-# endif
-static C_word C_fcall C_setenv(C_word x, C_word y) {
- char *sx = C_c_string(x),
- *sy = (y == C_SCHEME_FALSE ? "" : C_c_string(y));
- int n1 = C_strlen(sx), n2 = C_strlen(sy);
- int buf_len = n1 + n2 + 2;
- char *buf = (char *)C_malloc(buf_len);
- if(buf == NULL) return(C_fix(0));
- else {
- C_strlcpy(buf, sx, buf_len);
- C_strlcat(buf, "=", buf_len);
- C_strlcat(buf, sy, buf_len);
- return(C_fix(putenv(buf)));
- }
-}
-#endif
-
EOF
))
@@ -482,15 +455,7 @@ EOF
fd) ) )
-;;; Set or get current directory:
-
-(define change-directory
- (lambda (name)
- (##sys#check-string name 'change-directory)
- (let ((sname (##sys#make-c-string name 'change-directory)))
- (unless (fx= 0 (##core#inline "C_chdir" sname))
- (posix-error #:file-error 'change-directory "cannot change current directory" name))
- name)))
+;;; Set or get current directory by file descriptor:
(define (change-directory* fd)
(##sys#check-fixnum fd 'change-directory*)
@@ -498,21 +463,10 @@ EOF
(posix-error #:file-error 'change-directory* "cannot change current directory" fd))
fd)
-(define current-directory
- (getter-with-setter
- (lambda ()
- (let* ((buffer (make-string 1024))
- (len (##core#inline "C_curdir" buffer)))
- #+(or unix cygwin)
- (##sys#update-errno)
- (if len
- (##sys#substring buffer 0 len)
- (##sys#signal-hook
- #:file-error
- 'current-directory "cannot retrieve current directory"))))
- (lambda (dir)
- ((if (fixnum? dir) change-directory* change-directory) dir))
- "(current-directory)"))
+(set! ##sys#change-directory-hook
+ (let ((cd ##sys#change-directory-hook))
+ (lambda (dir)
+ ((if (fixnum? dir) change-directory* cd) dir))))
(define directory
(lambda (#!optional (spec (current-directory)) show-dotfiles?)
@@ -607,38 +561,6 @@ EOF
(##sys#error 'time->string "cannot convert time vector to string" tm) ) ) ) ) ) )
-;;; Environment access:
-
-(define set-environment-variable!
- (lambda (var val)
- (##sys#check-string var 'set-environment-variable!)
- (##sys#check-string val 'set-environment-variable!)
- (##core#inline "C_setenv"
- (##sys#make-c-string var 'set-environment-variable!)
- (##sys#make-c-string val 'set-environment-variable!))
- (##core#undefined) ) )
-
-(define (unset-environment-variable! var)
- (##sys#check-string var 'unset-environment-variable!)
- (##core#inline "C_unsetenv"
- (##sys#make-c-string var 'unset-environment-variable!))
- (##core#undefined) )
-
-(define get-environment-variables
- (let ([get (foreign-lambda c-string "C_getenventry" int)])
- (lambda ()
- (let loop ([i 0])
- (let ([entry (get i)])
- (if entry
- (let scan ([j 0])
- (if (char=? #\= (##core#inline "C_subchar" entry j))
- (cons (cons (##sys#substring entry 0 j)
- (##sys#substring entry (fx+ j 1) (##sys#size entry)))
- (loop (fx+ i 1)))
- (scan (fx+ j 1)) ) )
- '() ) ) ) ) ) )
-
-
;;; Signals
(define (set-signal-handler! sig proc)
diff --git a/posix.scm b/posix.scm
index 88bd2b5d..00aa1bec 100644
--- a/posix.scm
+++ b/posix.scm
@@ -41,9 +41,9 @@
(module chicken.posix
(block-device? call-with-input-pipe call-with-output-pipe
- change-directory change-directory* character-device? close-input-pipe
+ change-directory* character-device? close-input-pipe
close-output-pipe create-fifo create-pipe
- create-session create-symbolic-link current-directory
+ create-session create-symbolic-link
current-effective-group-id current-effective-user-id
current-effective-user-name current-group-id current-process-id
current-user-id current-user-name directory
@@ -55,7 +55,7 @@
file-owner file-permissions file-position file-read file-read-access?
file-select file-size file-stat file-test-lock file-truncate
file-type file-unlock file-write file-write-access? fileno/stderr
- fileno/stdin fileno/stdout get-environment-variables
+ fileno/stdin fileno/stdout
local-time->seconds local-timezone-abbreviation
open-input-file* open-input-pipe open-output-file* open-output-pipe
open/append open/binary open/creat open/excl open/fsync open/noctty
@@ -69,7 +69,7 @@
process-spawn process-wait read-symbolic-link regular-file?
seconds->local-time seconds->string seconds->utc-time seek/cur
seek/end seek/set
- set-alarm! set-environment-variable! set-file-group! set-file-owner!
+ set-alarm! set-file-group! set-file-owner!
set-file-permissions! set-file-position! set-file-times!
set-root-directory! set-signal-handler! set-signal-mask!
signal-handler signal-mask signal-mask! signal-masked? signal-unmask!
@@ -81,7 +81,7 @@
signal/xfsz signals-list socket? spawn/detach spawn/nowait
spawn/nowaito spawn/overlay spawn/wait string->time symbolic-link?
terminal-name terminal-port? terminal-size
- time->string unset-environment-variable! user-information
+ time->string user-information
utc-time->seconds with-input-from-pipe with-output-to-pipe)
(import scheme chicken)
@@ -90,6 +90,7 @@
chicken.memory
chicken.pathname
chicken.port
+ chicken.process-context
chicken.time)
(cond-expand
@@ -160,13 +161,13 @@
perm/ixgrp perm/ixoth perm/ixusr
port->fileno seek/cur seek/end seek/set set-file-group! set-file-owner!
set-file-permissions! set-file-position! set-file-times!)
-(import chicken chicken.posix))
+(import chicken.posix))
(module chicken.time.posix
(seconds->utc-time utc-time->seconds seconds->local-time
seconds->string local-time->seconds string->time time->string
local-timezone-abbreviation)
-(import chicken chicken.posix))
+(import chicken.posix))
(module chicken.process
(qs system system* process-execute process-fork process-run
@@ -213,17 +214,13 @@
signal/quit signal/segv signal/stop signal/term signal/trap
signal/tstp signal/urg signal/usr1 signal/usr2 signal/vtalrm
signal/winch signal/xcpu signal/xfsz set-alarm!)
-(import chicken chicken.posix))
-
-(module chicken.process-context
- (change-directory change-directory* current-directory
- command-line-arguments argv get-environment-variable
- get-environment-variables set-environment-variable!
- unset-environment-variable!
- executable-pathname program-name set-root-directory!
+(import chicken.posix))
+
+(module chicken.process-context.posix
+ (change-directory* set-root-directory!
current-effective-group-id current-effective-user-id
current-group-id current-process-id current-user-id
parent-process-id current-user-name
current-effective-user-name create-session
process-group-id user-information)
-(import chicken chicken.posix))
+(import chicken.posix))
diff --git a/posixunix.scm b/posixunix.scm
index 0e22c28e..23ace285 100644
--- a/posixunix.scm
+++ b/posixunix.scm
@@ -79,16 +79,6 @@ static C_TLS int C_wait_status;
# define MAP_ANON 0
#endif
-#if defined(HAVE_CRT_EXTERNS_H)
-# include
-# define C_getenventry(i) ((*_NSGetEnviron())[ i ])
-#elif defined(C_MACOSX)
-# define C_getenventry(i) NULL
-#else
-extern char **environ;
-# define C_getenventry(i) (environ[ i ])
-#endif
-
#ifndef FILENAME_MAX
# define FILENAME_MAX 1024
#endif
@@ -110,7 +100,6 @@ static C_TLS struct timeval C_timeval;
static C_TLS struct stat C_statbuf;
#define C_fchdir(fd) C_fix(fchdir(C_unfix(fd)))
-#define C_chdir(str) C_fix(chdir(C_c_string(str)))
#define open_binary_input_pipe(a, n, name) C_mpointer(a, popen(C_c_string(name), "r"))
#define open_text_input_pipe(a, n, name) open_binary_input_pipe(a, n, name)
diff --git a/posixwin.scm b/posixwin.scm
index ac8ffd27..c5ba4619 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -105,10 +105,6 @@ static C_TLS char C_shlcmd[256] = "";
/* Current user name */
static C_TLS TCHAR C_username[255 + 1] = "";
-/* Directory Operations */
-
-#define C_chdir(str) C_fix(chdir(C_c_string(str)))
-
/* DIRENT stuff */
struct dirent
{
@@ -197,8 +193,6 @@ readdir(DIR * dir)
#define C_pipe(d, m) C_fix(_pipe(C_pipefds, PIPE_BUF, C_unfix(m)))
#define C_close(fd) C_fix(close(C_unfix(fd)))
-#define C_getenventry(i) environ[ i ]
-
#define C_u_i_lstat(fn) C_u_i_stat(fn)
#define C_u_i_execvp(f,a) C_fix(execvp(C_data_pointer(f), (const char *const *)C_c_pointer_vector_or_null(a)))
diff --git a/rules.make b/rules.make
index 202262c1..ef162cf8 100644
--- a/rules.make
+++ b/rules.make
@@ -477,6 +477,7 @@ $(eval $(call declare-emitted-import-lib-dependency,chicken.file.posix,$(POSIXFI
$(eval $(call declare-emitted-import-lib-dependency,chicken.time.posix,$(POSIXFILE)))
$(eval $(call declare-emitted-import-lib-dependency,chicken.process,$(POSIXFILE)))
$(eval $(call declare-emitted-import-lib-dependency,chicken.process.signal,$(POSIXFILE)))
+$(eval $(call declare-emitted-import-lib-dependency,chicken.process-context.posix,$(POSIXFILE)))
$(eval $(call declare-emitted-import-lib-dependency,chicken.bitwise,library))
$(eval $(call declare-emitted-import-lib-dependency,chicken.blob,library))
$(eval $(call declare-emitted-import-lib-dependency,chicken.fixnum,library))
@@ -485,6 +486,7 @@ $(eval $(call declare-emitted-import-lib-dependency,chicken.gc,library))
$(eval $(call declare-emitted-import-lib-dependency,chicken.keyword,library))
$(eval $(call declare-emitted-import-lib-dependency,chicken.platform,library))
$(eval $(call declare-emitted-import-lib-dependency,chicken.plist,library))
+$(eval $(call declare-emitted-import-lib-dependency,chicken.process-context,library))
$(eval $(call declare-emitted-import-lib-dependency,chicken.time,library))
$(eval $(call declare-emitted-import-lib-dependency,chicken.load,eval))
$(eval $(call declare-emitted-import-lib-dependency,chicken.format,extras))
@@ -502,6 +504,7 @@ chicken.c: chicken.scm mini-srfi-1.scm \
chicken.compiler.c-platform.import.scm \
chicken.compiler.support.import.scm \
chicken.compiler.user-pass.import.scm \
+ chicken.process-context.import.scm \
chicken.string.import.scm
batch-driver.c: batch-driver.scm mini-srfi-1.scm \
chicken.compiler.core.import.scm \
@@ -520,6 +523,7 @@ batch-driver.c: batch-driver.scm mini-srfi-1.scm \
chicken.pathname.import.scm \
chicken.platform.import.scm \
chicken.pretty-print.import.scm \
+ chicken.process-context.import.scm \
chicken.string.import.scm \
chicken.time.import.scm
c-platform.c: c-platform.scm mini-srfi-1.scm \
@@ -618,6 +622,7 @@ csc.c: csc.scm \
chicken.pathname.import.scm \
chicken.posix.import.scm \
chicken.process.import.scm \
+ chicken.process-context.import.scm \
chicken.string.import.scm
csi.c: csi.scm \
chicken.base.import.scm \
@@ -632,6 +637,7 @@ csi.c: csi.scm \
chicken.platform.import.scm \
chicken.port.import.scm \
chicken.pretty-print.import.scm \
+ chicken.process-context.import.scm \
chicken.repl.import.scm \
chicken.sort.import.scm \
chicken.string.import.scm \
@@ -639,6 +645,7 @@ csi.c: csi.scm \
chicken-profile.c: chicken-profile.scm \
chicken.internal.import.scm \
chicken.posix.import.scm \
+ chicken.process-context.import.scm \
chicken.sort.import.scm \
chicken.string.import.scm
chicken-status.c: chicken-status.scm \
@@ -650,6 +657,7 @@ chicken-status.c: chicken-status.scm \
chicken.port.import.scm \
chicken.posix.import.scm \
chicken.pretty-print.import.scm \
+ chicken.process-context.import.scm \
chicken.sort.import.scm \
chicken.string.import.scm
chicken-install.c: chicken-install.scm \
@@ -663,6 +671,7 @@ chicken-install.c: chicken-install.scm \
chicken.port.import.scm \
chicken.posix.import.scm \
chicken.pretty-print.import.scm \
+ chicken.process-context.import.scm \
chicken.sort.import.scm \
chicken.string.import.scm \
chicken.tcp.import.scm
@@ -674,6 +683,7 @@ chicken-uninstall.c: chicken-uninstall.scm \
chicken.pathname.import.scm \
chicken.port.import.scm \
chicken.posix.import.scm \
+ chicken.process-context.import.scm \
chicken.string.import.scm
chicken-syntax.c: chicken-syntax.scm \
chicken.platform.import.scm \
@@ -692,6 +702,7 @@ posixunix.c: posixunix.scm \
chicken.pathname.import.scm \
chicken.platform.import.scm \
chicken.port.import.scm \
+ chicken.process-context.import.scm \
chicken.time.import.scm
posixwin.c: posixwin.scm \
chicken.condition.import.scm \
@@ -701,6 +712,7 @@ posixwin.c: posixwin.scm \
chicken.pathname.import.scm \
chicken.platform.import.scm \
chicken.port.import.scm \
+ chicken.process-context.import.scm \
chicken.string.import.scm \
chicken.time.import.scm
data-structures.c: data-structures.scm \
@@ -732,7 +744,8 @@ file.c: file.scm \
chicken.irregex.import.scm \
chicken.foreign.import.scm \
chicken.pathname.import.scm \
- chicken.posix.import.scm
+ chicken.posix.import.scm \
+ chicken.process-context.import.scm
lolevel.c: lolevel.scm \
chicken.foreign.import.scm
pathname.c: pathname.scm \
@@ -766,6 +779,7 @@ library.c: $(SRCDIR)library.scm
-emit-import-library chicken.keyword \
-emit-import-library chicken.platform \
-emit-import-library chicken.plist \
+ -emit-import-library chicken.process-context \
-emit-import-library chicken.time
internal.c: $(SRCDIR)internal.scm $(SRCDIR)mini-srfi-1.scm
$(bootstrap-lib) -emit-import-library chicken.internal
@@ -795,7 +809,7 @@ posixunix.c: $(SRCDIR)posix.scm $(SRCDIR)posixunix.scm $(SRCDIR)posix-common.scm
-emit-import-library chicken.time.posix \
-emit-import-library chicken.process \
-emit-import-library chicken.process.signal \
- -emit-import-library chicken.process-context \
+ -emit-import-library chicken.process-context.posix \
-emit-import-library chicken.posix
posixwin.c: $(SRCDIR)posix.scm $(SRCDIR)posixwin.scm $(SRCDIR)posix-common.scm $(SRCDIR)common-declarations.scm
$(bootstrap-lib) -feature platform-windows \
@@ -804,7 +818,7 @@ posixwin.c: $(SRCDIR)posix.scm $(SRCDIR)posixwin.scm $(SRCDIR)posix-common.scm $
-emit-import-library chicken.time.posix \
-emit-import-library chicken.process \
-emit-import-library chicken.process.signal \
- -emit-import-library chicken.process-context \
+ -emit-import-library chicken.process-context.posix \
-emit-import-library chicken.posix
irregex.c: $(SRCDIR)irregex.scm $(SRCDIR)irregex-core.scm $(SRCDIR)irregex-utils.scm $(SRCDIR)common-declarations.scm
$(bootstrap-lib) -emit-import-library chicken.irregex
diff --git a/tests/callback-tests.scm b/tests/callback-tests.scm
index afac01ee..b7c6eee2 100644
--- a/tests/callback-tests.scm
+++ b/tests/callback-tests.scm
@@ -1,5 +1,6 @@
;;;; callback-tests.scm
+(import (only (chicken process-context) command-line-arguments))
(define k1)
diff --git a/tests/executable-tests.scm b/tests/executable-tests.scm
index d98f121f..9ad7761f 100644
--- a/tests/executable-tests.scm
+++ b/tests/executable-tests.scm
@@ -2,8 +2,9 @@
(include "test.scm")
-(import (chicken pathname)
- (chicken posix)
+(import (chicken file)
+ (chicken pathname)
+ (chicken process-context)
(chicken string))
(define program-path
diff --git a/tests/fft.scm b/tests/fft.scm
index 3f00e38f..5c187feb 100644
--- a/tests/fft.scm
+++ b/tests/fft.scm
@@ -9,7 +9,10 @@
(block)
(not safe)))
(else
- (import chicken.bitwise chicken.fixnum chicken.flonum)))
+ (import (chicken bitwise)
+ (chicken fixnum)
+ (chicken flonum)
+ (chicken process-context))))
;;; All the following redefinitions are *ignored* by the Gambit compiler
;;; because of the declarations above.
diff --git a/tests/file-access-tests.scm b/tests/file-access-tests.scm
index 79682f2d..41e98343 100644
--- a/tests/file-access-tests.scm
+++ b/tests/file-access-tests.scm
@@ -4,6 +4,8 @@
;; These may seem silly, but some of them actually fail on MinGW without help.
;;
+(import (chicken process-context))
+
(define / (car (command-line-arguments)))
(define // (string-append / /))
(define /// (string-append / / /))
diff --git a/tests/locative-stress-test.scm b/tests/locative-stress-test.scm
index e5d160e9..96096fd6 100644
--- a/tests/locative-stress-test.scm
+++ b/tests/locative-stress-test.scm
@@ -2,7 +2,8 @@
(declare (usual-integrations))
-(import (chicken fixnum))
+(import (chicken fixnum)
+ (only (chicken process-context) command-line-arguments))
;(set-gc-report! #t)
diff --git a/tests/numbers-test.scm b/tests/numbers-test.scm
index 81be61e2..3141d5d2 100644
--- a/tests/numbers-test.scm
+++ b/tests/numbers-test.scm
@@ -7,7 +7,6 @@
(chicken flonum)
(chicken format)
(chicken platform)
- (chicken posix)
(chicken time))
;; The default "comparator" doesn't know how to deal with extended number types
diff --git a/tests/port-tests.scm b/tests/port-tests.scm
index 4fde81c0..b4774972 100644
--- a/tests/port-tests.scm
+++ b/tests/port-tests.scm
@@ -1,5 +1,7 @@
-(import chicken.condition chicken.file chicken.flonum chicken.format
- chicken.io chicken.port chicken.posix chicken.tcp srfi-4)
+(import chicken.condition chicken.file chicken.file.posix
+ chicken.flonum chicken.format chicken.io chicken.port
+ chicken.process chicken.process.signal chicken.tcp srfi-4
+ chicken.posix) ; FIXME drop once terminal-port? is rehomed
(include "test.scm")
(test-begin "ports")
diff --git a/tests/posix-tests.scm b/tests/posix-tests.scm
index 706a8dff..103f14a5 100644
--- a/tests/posix-tests.scm
+++ b/tests/posix-tests.scm
@@ -2,6 +2,7 @@
(chicken file)
(chicken platform)
(chicken posix)
+ (chicken process-context)
(chicken memory representation))
(define-syntax assert-error
diff --git a/tests/private-repository-test.scm b/tests/private-repository-test.scm
index 5db6544d..02e730eb 100644
--- a/tests/private-repository-test.scm
+++ b/tests/private-repository-test.scm
@@ -3,7 +3,8 @@
(import (chicken pathname)
(chicken platform)
- (chicken posix))
+ (chicken process-context)
+ (chicken file))
(define read-symbolic-link*
(cond-expand
diff --git a/types.db b/types.db
index b0772da5..76c6fb6f 100644
--- a/types.db
+++ b/types.db
@@ -846,11 +846,6 @@
(chicken.eval#module-environment
(#(procedure #:clean #:enforce) chicken.eval#module-environment ((or symbol (list-of (or symbol fixnum)))) (struct environment)))
-;; chicken
-
-(argc+argv (#(procedure #:clean) argc+argv () fixnum pointer))
-(argv (#(procedure #:clean) argv () (list-of string)))
-
;; base
@@ -1105,7 +1100,6 @@
(chicken.blob#string->blob (#(procedure #:clean #:enforce) chicken.blob#string->blob (string) blob))
(case-sensitive (#(procedure #:clean) case-sensitive (#!optional *) *))
-(command-line-arguments (#(procedure #:clean) command-line-arguments (#!optional (list-of string)) (list-of string)))
;; condition
@@ -1169,7 +1163,6 @@
(##sys#signal-hook (procedure ##sys#signal-hook (* #!rest) noreturn))
(##sys#debug-mode? (procedure ##sys#debug-mode? () boolean)
(() (##core#inline "C_i_debug_modep")))
-(executable-pathname (#(procedure #:pure) executable-pathname () (or string false)))
(file-exists? (#(procedure #:clean #:enforce) file-exists? (string) (or false string)))
(directory-exists? (#(procedure #:clean #:enforce) directory-exists? (string) (or false string)))
@@ -1314,7 +1307,6 @@
(chicken.fixnum#fx*? (#(procedure #:pure) chicken.fixnum#fx*? ((or fixnum false) (or fixnum false)) (or fixnum false)))
(chicken.fixnum#fx/? (#(procedure #:clean) chicken.fixnum#fx/? ((or fixnum false) (or fixnum false)) (or fixnum false)))
-(get-environment-variable (#(procedure #:clean #:enforce) get-environment-variable (string) *))
(get-output-string (#(procedure #:clean #:enforce) get-output-string (output-port) string))
;; keyword
@@ -1386,8 +1378,6 @@
(port-closed? (#(procedure #:clean #:enforce) port-closed? (port) boolean)
((port) (scheme#eq? (##sys#slot #(1) '8) '0)))
-(program-name (#(procedure #:clean #:enforce) program-name (#!optional string) string))
-
;; gc
@@ -1912,11 +1902,24 @@
(chicken.errno#errno/wouldblock fixnum)
(chicken.errno#errno/xdev fixnum)
+;; process-context
+
+(chicken.process-context#argc+argv (#(procedure #:clean) chicken.process-context#argc+argv () fixnum pointer))
+(chicken.process-context#argv (#(procedure #:clean) chicken.process-context#argv () (list-of string)))
+(chicken.process-context#change-directory (#(procedure #:clean #:enforce) chicken.process-context#change-directory (string) string))
+(chicken.process-context#command-line-arguments (#(procedure #:clean) chicken.process-context#command-line-arguments (#!optional (list-of string)) (list-of string)))
+(chicken.process-context#current-directory (#(procedure #:clean #:enforce) chicken.process-context#current-directory () string))
+(chicken.process-context#executable-pathname (#(procedure #:pure) chicken.process-context#executable-pathname () (or string false)))
+(chicken.process-context#get-environment-variable (#(procedure #:clean #:enforce) chicken.process-context#get-environment-variable (string) *))
+(chicken.process-context#get-environment-variables (#(procedure #:clean) chicken.process-context#get-environment-variables () (list-of (pair string string))))
+(chicken.process-context#program-name (#(procedure #:clean #:enforce) chicken.process-context#program-name (#!optional string) string))
+(chicken.process-context#set-environment-variable! (#(procedure #:clean #:enforce) chicken.process-context#set-environment-variable! (string string) undefined))
+(chicken.process-context#unset-environment-variable! (#(procedure #:clean #:enforce) chicken.process-context#unset-environment-variable! (string) undefined))
+
;; posix
(chicken.posix#call-with-input-pipe (#(procedure #:enforce) chicken.posix#call-with-input-pipe (string (procedure (input-port) . *) #!optional symbol) . *))
(chicken.posix#call-with-output-pipe (#(procedure #:enforce) chicken.posix#call-with-output-pipe (string (procedure (input-port) . *) #!optional symbol) . *))
-(chicken.posix#change-directory (#(procedure #:clean #:enforce) chicken.posix#change-directory (string) string))
(chicken.posix#change-directory* (#(procedure #:clean #:enforce) chicken.posix#change-directory* (fixnum) fixnum))
(chicken.posix#close-input-pipe (#(procedure #:clean #:enforce) chicken.posix#close-input-pipe (input-port) fixnum))
(chicken.posix#close-output-pipe (#(procedure #:clean #:enforce) chicken.posix#close-output-pipe (output-port) fixnum))
@@ -1925,12 +1928,9 @@
(chicken.posix#create-session (#(procedure #:clean) chicken.posix#create-session () fixnum))
(chicken.posix#create-symbolic-link (#(procedure #:clean #:enforce) chicken.posix#create-symbolic-link (string string) undefined))
-(chicken.posix#current-directory (#(procedure #:clean #:enforce) chicken.posix#current-directory () string))
-
(chicken.posix#current-effective-group-id (#(procedure #:clean) chicken.posix#current-effective-group-id () fixnum))
(chicken.posix#current-effective-user-id (#(procedure #:clean) chicken.posix#current-effective-user-id () fixnum))
(chicken.posix#current-effective-user-name (#(procedure #:clean) chicken.posix#current-effective-user-name () string))
-(chicken.posix#get-environment-variables (#(procedure #:clean) chicken.posix#get-environment-variables () (list-of (pair string string))))
(chicken.posix#current-group-id (#(procedure #:clean) chicken.posix#current-group-id () fixnum))
(chicken.posix#current-process-id (#(procedure #:clean) chicken.posix#current-process-id () fixnum))
(chicken.posix#current-user-id (#(procedure #:clean) chicken.posix#current-user-id () fixnum))
@@ -2044,7 +2044,6 @@
(chicken.posix#set-root-directory! (#(procedure #:clean #:enforce) chicken.posix#set-root-directory! (string) undefined))
(chicken.posix#set-signal-handler! (#(procedure #:clean #:enforce) chicken.posix#set-signal-handler! (fixnum (or false (procedure (fixnum) . *))) undefined))
(chicken.posix#set-signal-mask! (#(procedure #:clean #:enforce) chicken.posix#set-signal-mask! ((list-of fixnum)) undefined))
-(chicken.posix#set-environment-variable! (#(procedure #:clean #:enforce) chicken.posix#set-environment-variable! (string string) undefined))
(chicken.posix#signal-handler (#(procedure #:clean #:enforce) chicken.posix#signal-handler (fixnum) (or false (procedure (fixnum) . *))))
(chicken.posix#signal-mask (#(procedure #:clean) chicken.posix#signal-mask () fixnum))
(chicken.posix#signal-mask! (#(procedure #:clean #:enforce) chicken.posix#signal-mask! (fixnum) undefined))
@@ -2093,7 +2092,6 @@
(chicken.posix#terminal-port? (#(procedure #:clean #:enforce) chicken.posix#terminal-port? (port) boolean))
(chicken.posix#terminal-size (#(procedure #:clean #:enforce) chicken.posix#terminal-size (port) fixnum fixnum))
(chicken.posix#time->string (#(procedure #:clean #:enforce) chicken.posix#time->string ((vector fixnum fixnum fixnum fixnum fixnum fixnum fixnum fixnum boolean fixnum) #!optional string) string))
-(chicken.posix#unset-environment-variable! (#(procedure #:clean #:enforce) chicken.posix#unset-environment-variable! (string) undefined))
(chicken.posix#user-information (#(procedure #:clean #:enforce) chicken.posix#user-information ((or string fixnum) #!optional *) *))
(chicken.posix#utc-time->seconds (#(procedure #:clean #:enforce) chicken.posix#utc-time->seconds ((vector fixnum fixnum fixnum fixnum fixnum fixnum fixnum fixnum boolean fixnum)) integer))
(chicken.posix#with-input-from-pipe (#(procedure #:enforce) chicken.posix#with-input-from-pipe (string (procedure () . *) #!optional symbol) . *))
--
2.11.0