Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!usc!sdd.hp.com!swrinde!elroy.jpl.nasa.gov!decwrl!waikato.ac.nz!comp.vuw.ac.nz!canterbury!phys169 From: phys169@csc.canterbury.ac.nz Newsgroups: comp.lang.pascal Subject: Re: How to determine if I/O redirection is used Message-ID: <1991May21.122517.785@csc.canterbury.ac.nz> Date: 21 May 91 00:25:17 GMT References: <14165@ur-cc.UUCP> Organization: University of Canterbury, Christchurch, New Zealand Lines: 41 In article <14165@ur-cc.UUCP>, elmo@troi.cc.rochester.edu (Eric Cabot) writes: > > I want to be able to detect if the user is redirecting standard > input and/or standard output on the command line. Look at Dos function $44 (subcall 0), which returns the device characteristics for a given handle (handle 0 is stdin, 1 is std out, 2 is stderr, etc). If the input is redirected to a disk file you will get something like $0043 instead of $80D3 (or $80C0 for a COM line or printer). It is possible to determine if the input (or output) is redirected to a file but not a device (useful when using the CTTY COM1 command). Remember that some device characteristic bits will vary according to version of operating system, etc (e.g. you might get $0040 when redirecting input to a diskette file, and goodness-knows-what with networks). What you can be sure of is: $0080 will be set if it is a device, and the two bottom bits will be off if that device isn't the console. I check for $8083 being set (otherwise it is a disk file or another device). (simple demo included below) Hope this helps, Mark Aitchison, Physics, University of Canterbury, New Zealand. --snip here-- program Redirection; const StdIn = 0; StdOut= 1; StdErr= 2; function DeviceCharacteristics(handle : word) : word; {returns $FFFF if error} inline($5B/$B8/$4400/$Cd/$21/$8B/$D0/$73/$03/$B8/$FFFF); {pop BX; mov ax,$4400; int $21; mov AX,BX; jnc exit; mov AX,-1} function IsRedirected(handle : word) : boolean; {true if redirected or error} begin IsRedirected:=(DeviceCharacteristics(handle) and $9083)<>$8083; end; begin if IsRedirected(StdIn) then writeln('Input is redirected'); end.