Category : Files from Magazines
Archive   : CUJ9411.ZIP
Filename : CHANDLE.CPP

 
Output of file : CHANDLE.CPP contained in archive : CUJ9411.ZIP
/* ----------------------------------------------------
* Listing 6
*
* chandle.cpp
* Adds character-device specific capability to
* class IoctlHandle
* ------------------------------------------------- */

#include
#include "chandle.h"

struct { char *dname;
int dtype;
} static dcat[] = { { "COM", 1 },{ "AUX", 1 },
{ "CON", 3 },{ "LPT", 5 },
{ "PRN", 5 },{ 0, 0 } };
static int getcat( const char *dname ) {
for( int i = 0; dcat[i].dname; i++ )
if( strnicmp( dcat[i].dname, dname, 3 ) == 0 )
break;
return dcat[i].dtype;
}
charHandle::charHandle( const char *device )
: IoctlHandle( device ) {
_cat = getcat( device );
}
charHandle *charHandle::Init(const char *device) {
charHandle *obj = new charHandle( device );

if( obj->_handle == -1 || //bad handle
obj->isFile() || //can't be a file
obj->_cat == 0 ) { //unknown device
delete obj;
return (charHandle *) 0;
}
return obj;
}
void charHandle::handle_info( int handle,
unsigned info ) {
/* Set device information word */
_iregs.x.dx = info & 0x00ff; //dh must be 0
_iregs.x.bx = handle;
int21_44h(set_handle_info);
}
unsigned charHandle::ioctl_data( ioctl_cmd fn,
unsigned count,
void *buffer ) {
/* Send/receive I/O Control data to char device */
_iregs.x.bx = _handle;
_iregs.x.cx = count; //#bytes to read/write
_iregs.x.dx = FP_OFF( (void far *) buffer );
_sregs.ds = FP_SEG( (void far *) buffer );
int21_44h(fn); //function number (2/3)
return _oregs.x.ax; //#bytes xfered
}
int charHandle::char_ioctl( char_cmd minor_code,
void *param_block ) {
/* Access DOS int21h/44h/0Ch for the current
* handle and device category, generic ioctl for
* character devices.
*/
_iregs.x.bx = _handle;
_iregs.h.ch = (char) _cat;
_iregs.h.cl = (char) minor_code;
_iregs.x.dx = FP_OFF( (void far *) param_block );
_sregs.ds = FP_SEG( (void far *) param_block );
int21_44h( gen_ioctl_char );
return _dos_error ? _oregs.x.ax : 0;
}
int charHandle::sendIoctl( unsigned *count,
void *data ) {
/* Send ioctl data to current device. */
*count = ioctl_data( send_ioctl_char,
*count, data );
return _dos_error ? _oregs.x.ax : 0;
}
int charHandle::readIoctl( unsigned *count,
void *data ) {
*count = ioctl_data( read_ioctl_char,
*count, data );
return _dos_error ? _oregs.x.ax : 0;
}
unsigned charHandle::busyCount( void ) {
/* Return LPTx device busy count, 0 on error. */
unsigned count_buf;
if( _cat != 5 ) return 0; //error
char_ioctl( get_iter_count, (void *) &count_buf );
return _dos_error ? 0 : count_buf;
}
unsigned charHandle::busyCount( unsigned count ) {
/* Set LPTx device busy count. Return new count,
* or 0 on error........ */
if( _cat != 5 ) return 0; //error
char_ioctl( set_iter_count, (void *) &count);
return busyCount();
}
int charHandle::getANSIdata( struct ANSIdata *dis) {
/* Get config data for an ANSI display driver. */
if( _cat != 3 ) return -1; //error
dis->info = 0;
dis->block_length = 14;
char_ioctl( get_display_mode, (void *) dis);
return _dos_error ? -1 : 0;
}
int charHandle::setANSIdata( struct ANSIdata *dis) {
/* Set config data for an ANSI display driver. */
if( _cat != 3 ) return -1; //error
dis->info = 0;
dis->block_length = 14;
char_ioctl( set_display_mode, (void *) dis);
return _dos_error ? -1 : 0;
}
/* ----- End of File ------------------------------- */


  3 Responses to “Category : Files from Magazines
Archive   : CUJ9411.ZIP
Filename : CHANDLE.CPP

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/