mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
The bug was really that I/O errors in output builtins were undetectable by any means. Having a >0 exit status is sufficient. Adding an error message risks making existing ksh scripts noisier, or even breaking them if they redirect stderr to stdout. Note to self: in future, implement the minimum change necessary to fix bugs, nothing more. The fact that I needed to add four extra 2>/dev/null to the regression tests should have been a hint. src/cmd/ksh93/bltins/print.c, src/cmd/ksh93/data/msg.c, src/cmd/ksh93/include/io.h: - Remove "I/O error" message. src/cmd/ksh93/tests/builtins.sh: - Update to check for exit status only. src/cmd/ksh93/tests/basic.sh, src/cmd/ksh93/tests/coprocess.sh: - Revert four new '2>/dev/null' to suppress the error message. (cherry picked from commit 5e17be24d18455b575b6e98bc631c6935ffc795a)
129 lines
4.1 KiB
C
129 lines
4.1 KiB
C
/***********************************************************************
|
|
* *
|
|
* This software is part of the ast package *
|
|
* Copyright (c) 1982-2012 AT&T Intellectual Property *
|
|
* and is licensed under the *
|
|
* Eclipse Public License, Version 1.0 *
|
|
* by AT&T Intellectual Property *
|
|
* *
|
|
* A copy of the License is available at *
|
|
* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
* *
|
|
* Information and Software Systems Research *
|
|
* AT&T Research *
|
|
* Florham Park NJ *
|
|
* *
|
|
* David Korn <dgk@research.att.com> *
|
|
* *
|
|
***********************************************************************/
|
|
#pragma prototyped
|
|
/*
|
|
* UNIX shell
|
|
* David Korn
|
|
*
|
|
*/
|
|
|
|
#include <ast.h>
|
|
#include <sfio.h>
|
|
|
|
#ifndef IOBSIZE
|
|
# define IOBSIZE (SF_BUFSIZE*sizeof(char*))
|
|
#endif /* IOBSIZE */
|
|
#define IOMAXTRY 20
|
|
|
|
#ifndef SF_CLOSING
|
|
#define SF_CLOSING SF_CLOSE
|
|
#endif
|
|
#ifndef SF_APPENDWR
|
|
#define SF_APPENDWR SF_APPEND
|
|
#endif
|
|
|
|
/* used for output of shell errors */
|
|
#define ERRIO 2
|
|
|
|
#define IOREAD 001
|
|
#define IOWRITE 002
|
|
#define IODUP 004
|
|
#define IOSEEK 010
|
|
#define IONOSEEK 020
|
|
#define IOTTY 040
|
|
#define IOCLEX 0100
|
|
#define IOCLOSE (IOSEEK|IONOSEEK)
|
|
|
|
#define IOSUBSHELL 0x8000 /* must be larger than any file descriptor */
|
|
#define IOPICKFD 0x10000 /* file descriptor number was selected automatically */
|
|
#define IOHERESTRING 0x20000 /* allow here documents to be string streams */
|
|
|
|
/*
|
|
* The remainder of this file is only used when compiled with shell
|
|
*/
|
|
|
|
#if KSHELL
|
|
|
|
#ifndef ARG_RAW
|
|
struct ionod;
|
|
#endif /* !ARG_RAW */
|
|
|
|
extern int sh_iocheckfd(Shell_t*,int);
|
|
extern void sh_ioinit(Shell_t*);
|
|
extern int sh_iomovefd(int);
|
|
extern int sh_iorenumber(Shell_t*,int,int);
|
|
extern void sh_pclose(int[]);
|
|
extern int sh_rpipe(int[]);
|
|
extern void sh_iorestore(Shell_t*,int,int);
|
|
#if defined(__EXPORT__) && defined(_BLD_DLL) && defined(_BLD_shell)
|
|
__EXPORT__
|
|
#endif
|
|
extern Sfio_t *sh_iostream(Shell_t*,int);
|
|
extern int sh_redirect(Shell_t*,struct ionod*,int);
|
|
extern void sh_iosave(Shell_t *, int,int,char*);
|
|
extern int sh_iovalidfd(Shell_t*, int);
|
|
extern int sh_inuse(Shell_t*, int);
|
|
extern void sh_iounsave(Shell_t*);
|
|
extern int sh_chkopen(const char*);
|
|
extern int sh_ioaccess(int,int);
|
|
extern int sh_devtofd(const char*);
|
|
extern int sh_isdevfd(const char*);
|
|
extern int sh_source(Shell_t*, Sfio_t*, const char*);
|
|
|
|
/* the following are readonly */
|
|
extern const char e_pexists[];
|
|
extern const char e_query[];
|
|
extern const char e_history[];
|
|
extern const char e_argtype[];
|
|
extern const char e_create[];
|
|
extern const char e_tmpcreate[];
|
|
extern const char e_exists[];
|
|
extern const char e_file[];
|
|
extern const char e_redirect[];
|
|
extern const char e_formspec[];
|
|
extern const char e_badregexp[];
|
|
extern const char e_open[];
|
|
extern const char e_notseek[];
|
|
extern const char e_noread[];
|
|
extern const char e_badseek[];
|
|
extern const char e_badwrite[];
|
|
extern const char e_badpattern[];
|
|
extern const char e_toomany[];
|
|
extern const char e_pipe[];
|
|
extern const char e_unknown[];
|
|
extern const char e_devnull[];
|
|
extern const char e_profile[];
|
|
extern const char e_sysprofile[];
|
|
#if SHOPT_SYSRC
|
|
extern const char e_sysrc[];
|
|
#endif
|
|
#if SHOPT_BASH
|
|
#if SHOPT_SYSRC
|
|
extern const char e_bash_sysrc[];
|
|
#endif
|
|
extern const char e_bash_rc[];
|
|
extern const char e_bash_login[];
|
|
extern const char e_bash_logout[];
|
|
extern const char e_bash_profile[];
|
|
#endif
|
|
extern const char e_stdprompt[];
|
|
extern const char e_supprompt[];
|
|
extern const char e_ambiguous[];
|
|
#endif /* KSHELL */
|