Use string-no-nuls?' and
bytes-no-nuls?' in more docs & error messages.
Also use `byte?' instead of (integer-in 0 255). (This commit will most likely require some proof-reading.)
This commit is contained in:
parent
d95ec4d454
commit
a6b20f01da
|
@ -7,7 +7,7 @@
|
||||||
[stdin (or/c (and/c input-port? file-stream-port?) #f)]
|
[stdin (or/c (and/c input-port? file-stream-port?) #f)]
|
||||||
[stderr (or/c (and/c output-port? file-stream-port?) #f 'stdout)]
|
[stderr (or/c (and/c output-port? file-stream-port?) #f 'stdout)]
|
||||||
[command path-string?]
|
[command path-string?]
|
||||||
[arg (or/c path? string? bytes?)] ...)
|
[arg (or/c path? string-no-nuls? bytes-no-nuls?)] ...)
|
||||||
(values subprocess?
|
(values subprocess?
|
||||||
(or/c (and/c input-port? file-stream-port?) #f)
|
(or/c (and/c input-port? file-stream-port?) #f)
|
||||||
(or/c (and/c output-port? file-stream-port?) #f)
|
(or/c (and/c output-port? file-stream-port?) #f)
|
||||||
|
@ -217,7 +217,7 @@ interactive shell, since job control is based on process groups.}
|
||||||
[target string?]
|
[target string?]
|
||||||
[parameters string?]
|
[parameters string?]
|
||||||
[dir path-string?]
|
[dir path-string?]
|
||||||
[show-mode symbol?])
|
[show-mode symbol?])
|
||||||
#f]{
|
#f]{
|
||||||
|
|
||||||
@index['("ShellExecute")]{Performs} the action specified by @racket[verb]
|
@index['("ShellExecute")]{Performs} the action specified by @racket[verb]
|
||||||
|
@ -318,7 +318,7 @@ real process ID).}
|
||||||
|
|
||||||
@note-lib[racket/system]
|
@note-lib[racket/system]
|
||||||
|
|
||||||
@defproc[(system [command (or/c string? bytes?)]) boolean?]{
|
@defproc[(system [command (or/c string-no-nuls? bytes-no-nuls?)]) boolean?]{
|
||||||
|
|
||||||
Executes a Unix, Mac OS X, or Windows shell command synchronously
|
Executes a Unix, Mac OS X, or Windows shell command synchronously
|
||||||
(i.e., the call to @racket[system] does not return until the
|
(i.e., the call to @racket[system] does not return until the
|
||||||
|
@ -342,8 +342,11 @@ function:
|
||||||
]}
|
]}
|
||||||
|
|
||||||
|
|
||||||
@defproc*[([(system* [command path-string?] [arg (or/c path? string? bytes?)] ...) boolean?]
|
@defproc*[([(system* [command path-string?]
|
||||||
[(system* [command path-string?] [exact 'exact] [arg string?]) boolean?])]{
|
[arg (or/c path? string-no-nuls? bytes-no-nuls?)] ...)
|
||||||
|
boolean?]
|
||||||
|
[(system* [command path-string?] [exact 'exact] [arg string?])
|
||||||
|
boolean?])]{
|
||||||
|
|
||||||
Like @racket[system], except that @racket[command] is a filename that
|
Like @racket[system], except that @racket[command] is a filename that
|
||||||
is executed directly (instead of through a shell command; see
|
is executed directly (instead of through a shell command; see
|
||||||
|
@ -358,20 +361,25 @@ On Windows, the first argument after @racket[command] can be
|
||||||
line. See @racket[subprocess] for details.}
|
line. See @racket[subprocess] for details.}
|
||||||
|
|
||||||
|
|
||||||
@defproc[(system/exit-code [command (or/c string? bytes?)]) (integer-in 0 255)]{
|
@defproc[(system/exit-code [command (or/c string-no-nuls? bytes-no-nuls?)])
|
||||||
|
byte?]{
|
||||||
|
|
||||||
Like @racket[system], except that the result is the exit code returned
|
Like @racket[system], except that the result is the exit code returned
|
||||||
by the subprocess. A @racket[0] result normally indicates success.}
|
by the subprocess. A @racket[0] result normally indicates success.}
|
||||||
|
|
||||||
|
|
||||||
@defproc*[([(system*/exit-code [command path-string?] [arg (or/c path? string? bytes?)] ...) (integer-in 0 255)]
|
@defproc*[([(system*/exit-code [command path-string?]
|
||||||
[(system*/exit-code [command path-string?] [exact 'exact] [arg string?]) (integer-in 0 255)])]{
|
[arg (or/c path? string-no-nuls? bytes-no-nuls?)] ...)
|
||||||
|
byte?]
|
||||||
|
[(system*/exit-code [command path-string?]
|
||||||
|
[exact 'exact] [arg string?])
|
||||||
|
byte?])]{
|
||||||
|
|
||||||
Like @racket[system*], but returns the exit code like
|
Like @racket[system*], but returns the exit code like
|
||||||
@racket[system/exit-code].}
|
@racket[system/exit-code].}
|
||||||
|
|
||||||
|
|
||||||
@defproc[(process [command string?])
|
|
||||||
|
@defproc[(process [command (or/c string-no-nuls? bytes-no-nuls?)])
|
||||||
(list input-port?
|
(list input-port?
|
||||||
output-port?
|
output-port?
|
||||||
exact-nonnegative-integer?
|
exact-nonnegative-integer?
|
||||||
|
@ -438,10 +446,13 @@ implement @racket[process]. In particular, the @racket['interrupt] and
|
||||||
@racket['kill] process-control messages are implemented via
|
@racket['kill] process-control messages are implemented via
|
||||||
@racket[subprocess-kill], so they can affect a process group instead
|
@racket[subprocess-kill], so they can affect a process group instead
|
||||||
of a single process.}
|
of a single process.}
|
||||||
|
|
||||||
|
|
||||||
@defproc*[([(process* [command path-string?] [arg (or/c path? string? bytes?)] ...) list?]
|
|
||||||
[(process* [command path-string?] [exact 'exact] [arg string?]) list?])]{
|
@defproc*[([(process* [command path-string?]
|
||||||
|
[arg (or/c path? string-no-nuls? bytes-no-nuls?)] ...)
|
||||||
|
list?]
|
||||||
|
[(process* [command path-string?] [exact 'exact] [arg string?])
|
||||||
|
list?])]{
|
||||||
|
|
||||||
Like @racket[process], except that @racket[command] is a filename that
|
Like @racket[process], except that @racket[command] is a filename that
|
||||||
is executed directly like @racket[system*], and the @racket[arg]s are the arguments. On
|
is executed directly like @racket[system*], and the @racket[arg]s are the arguments. On
|
||||||
|
@ -452,7 +463,7 @@ replaced with @racket['exact].}
|
||||||
@defproc[(process/ports [out (or/c #f output-port?)]
|
@defproc[(process/ports [out (or/c #f output-port?)]
|
||||||
[in (or/c #f input-port?)]
|
[in (or/c #f input-port?)]
|
||||||
[error-out (or/c #f output-port? 'stdout)]
|
[error-out (or/c #f output-port? 'stdout)]
|
||||||
[command string?])
|
[command (or/c path? string-no-nuls? bytes-no-nuls?)])
|
||||||
list?]{
|
list?]{
|
||||||
|
|
||||||
Like @racket[process], except that @racket[out] is used for the
|
Like @racket[process], except that @racket[out] is used for the
|
||||||
|
@ -469,7 +480,8 @@ returned list is @racket[#f].}
|
||||||
[in (or/c #f input-port?)]
|
[in (or/c #f input-port?)]
|
||||||
[error-out (or/c #f output-port? 'stdout)]
|
[error-out (or/c #f output-port? 'stdout)]
|
||||||
[command path-string?]
|
[command path-string?]
|
||||||
[arg (or/c path? string? bytes?)] ...)
|
[arg (or/c path? string-no-nuls? bytes-no-nuls?)]
|
||||||
|
...)
|
||||||
list?]
|
list?]
|
||||||
[(process*/ports [out (or/c #f output-port?)]
|
[(process*/ports [out (or/c #f output-port?)]
|
||||||
[in (or/c #f input-port?)]
|
[in (or/c #f input-port?)]
|
||||||
|
@ -489,10 +501,10 @@ Like @racket[process*], but with the port handling of
|
||||||
@;note-lib[racket/system]
|
@;note-lib[racket/system]
|
||||||
|
|
||||||
The contracts of @racket[system] and related functions may signal a
|
The contracts of @racket[system] and related functions may signal a
|
||||||
contract error with references to the following functions.
|
contract error with references to the following functions.
|
||||||
|
|
||||||
@defproc[(string-no-nuls? [x any/c]) boolean?]{
|
@defproc[(string-no-nuls? [x any/c]) boolean?]{
|
||||||
Ensures that @racket[x] is a string and does not contain @racket["\0"].}
|
Ensures that @racket[x] is a string and does not contain @racket["\0"].}
|
||||||
|
|
||||||
@defproc[(bytes-no-nuls? [x any/c]) boolean?]{
|
@defproc[(bytes-no-nuls? [x any/c]) boolean?]{
|
||||||
Ensures that @racket[x] is a byte-string and does not contain @racket["\0"].}
|
Ensures that @racket[x] is a byte-string and does not contain @racket[#"\0"].}
|
||||||
|
|
|
@ -8937,12 +8937,9 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
||||||
if (((!SCHEME_CHAR_STRINGP(args[i]) && !SCHEME_BYTE_STRINGP(args[i]))
|
if (((!SCHEME_CHAR_STRINGP(args[i]) && !SCHEME_BYTE_STRINGP(args[i]))
|
||||||
|| scheme_any_string_has_null(args[i]))
|
|| scheme_any_string_has_null(args[i]))
|
||||||
&& !SCHEME_PATHP(args[i]))
|
&& !SCHEME_PATHP(args[i]))
|
||||||
scheme_wrong_contract(name,
|
scheme_wrong_contract(name,
|
||||||
("(or/c path?\n"
|
"(or/c path? string-no-nuls? bytes-no-nuls?)",
|
||||||
" (and/c string? (lambda (s) (not (memv #\\nul (string->list s)))))\n"
|
|
||||||
" (and/c bytes? (lambda (bs) (not (memv 0 (bytes->list bs))))))"),
|
|
||||||
i, c, args);
|
i, c, args);
|
||||||
|
|
||||||
{
|
{
|
||||||
Scheme_Object *bs;
|
Scheme_Object *bs;
|
||||||
bs = args[i];
|
bs = args[i];
|
||||||
|
|
|
@ -3378,7 +3378,7 @@ const char *scheme_hostname_error(int err);
|
||||||
|
|
||||||
int scheme_byte_string_has_null(Scheme_Object *o);
|
int scheme_byte_string_has_null(Scheme_Object *o);
|
||||||
int scheme_any_string_has_null(Scheme_Object *o);
|
int scheme_any_string_has_null(Scheme_Object *o);
|
||||||
#define CHAR_STRING_W_NO_NULLS "(and/c string? (lambda (s) (not (memv #\\nul (string->list s)))))"
|
#define CHAR_STRING_W_NO_NULLS "string-no-nuls?"
|
||||||
|
|
||||||
Scheme_Object *scheme_do_exit(int argc, Scheme_Object *argv[]);
|
Scheme_Object *scheme_do_exit(int argc, Scheme_Object *argv[]);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user