mirror of
https://github.com/Interlisp/maiko.git
synced 2026-01-18 00:52:33 +00:00
The code is being re-licensed under the MIT license. modified: bin/fixid modified: bin/launch.asm modified: bin/makefile-hpux.hp9000-x modified: bin/makefile-init.sgi modified: bin/makefile-init.sparc modified: bin/makefile-init.sparc-multi modified: bin/makefile-irix.sgi-x modified: bin/makefile-sunos4.sparc modified: bin/makefile-sunos4.sparc% modified: bin/makefile-sunos4.sparc-multi modified: bin/makefile-sunos5.386-x modified: bin/makefile-sunos5.i386-x modified: bin/makefile-sunos5.sparc-x modified: bin/makefile-tail modified: bin/makeisc modified: bin/makeright modified: inc/Check.h modified: inc/MyWindow.h modified: inc/Stipple.h modified: inc/XCursors.h modified: inc/XKeymap.h modified: inc/XVersion.h modified: inc/Xdeflt.h modified: inc/Xicon.h modified: inc/address.h modified: inc/arith.h modified: inc/arith2.h modified: inc/array.h modified: inc/bb.h modified: inc/cell.h modified: inc/cell.h% modified: inc/copyright modified: inc/dbprint.h modified: inc/debug.h modified: inc/devif.h modified: inc/display.h modified: inc/dspdata.h modified: inc/ether.h modified: inc/fast_dsp.h modified: inc/fp.h modified: inc/gc.h modified: inc/gc.h.save modified: inc/gcscan.h modified: inc/hdw_conf.h modified: inc/ifpage.h modified: inc/inlineC.h modified: inc/inlnMIPS.h modified: inc/inlnPS2.h modified: inc/inlndos.h modified: inc/iopage.h modified: inc/kbdif.h modified: inc/keyboard.h modified: inc/keyboard.h% modified: inc/keysym.h modified: inc/ldeXdefs.h modified: inc/lispemul.h modified: inc/lispemul.h.save modified: inc/lispmap.h modified: inc/lldsp.h modified: inc/lnk-Xdeflt.h modified: inc/lnk-debug.h modified: inc/lnk-fast_dsp.h modified: inc/lnk-inlineC.h modified: inc/lnk-lispmap.h modified: inc/lnk-tosfns.h modified: inc/lnk-tosret.h modified: inc/locfile.h modified: inc/lpdefs.h modified: inc/lpglobl.h modified: inc/lspglob.h modified: inc/lsptypes.h modified: inc/medleyfp.h modified: inc/mnxdefs.h modified: inc/my.h modified: inc/native.h modified: inc/ocr.h modified: inc/osmsg.h modified: inc/picture.h modified: inc/pilotbbt.h modified: inc/print.h modified: inc/profile.h modified: inc/rawrs232c.h modified: inc/return.h modified: inc/rs232c.h modified: inc/stack.h modified: inc/stream.h modified: inc/stream.h% modified: inc/stream.h2 modified: inc/sysatms.h modified: inc/timeout.h modified: inc/tos1defs.h modified: inc/tosfns.h modified: inc/tosret.h modified: inc/tty.h modified: inc/version.h modified: inc/vmemsave.h modified: inc/xbitmaps.h modified: inc/xdefs.h modified: src/Cldeetr.c modified: src/allocmds.c modified: src/arith2.c modified: src/arith3.c modified: src/arith4.c modified: src/array.c modified: src/array2.c modified: src/array3.c modified: src/array4.c modified: src/array5.c modified: src/array6.c modified: src/asmbbt.c modified: src/asmbitblt.c modified: src/atom.c modified: src/bbtSPARC.s modified: src/bbtsub.c modified: src/bin.c modified: src/binds.c modified: src/bitblt.c modified: src/blt.c modified: src/byteswap.c modified: src/call-c.c modified: src/car-cdr.c modified: src/cdaudio.c modified: src/cdrom.c modified: src/chardev.c modified: src/chatter.c modified: src/codeconv.c modified: src/codetbl.c modified: src/colorbltfns.c modified: src/common.c modified: src/conspage.c modified: src/cr modified: src/dbgtool.c modified: src/dir.c modified: src/doscomm.c modified: src/doskbd.c modified: src/dosmouse.c modified: src/draw.c modified: src/dsk.c modified: src/dspif.c modified: src/dspsubrs.c modified: src/ejlisp.c modified: src/eqf.c modified: src/ether.c modified: src/findkey.c modified: src/foreign.c modified: src/fp.c modified: src/fvar.c modified: src/gc.c modified: src/gc2.c modified: src/gcarray.c modified: src/gccode.c modified: src/gcfinal.c modified: src/gchtfind.c modified: src/gcmain3.c modified: src/gcoflow.c modified: src/gcr.c modified: src/gcrcell.c modified: src/gcscan.c modified: src/gvar2.c modified: src/hacks.c modified: src/hardrtn.c modified: src/imagefile.c modified: src/imagefile2.c modified: src/inet.c modified: src/initdsp.c modified: src/initkbd.c modified: src/initsout.c modified: src/intcall.c modified: src/kbdif.c modified: src/kbdsubrs.c modified: src/keyevent.c modified: src/keylib.c modified: src/keymaker.c modified: src/keytst.c modified: src/keytstno.c modified: src/kprint.c modified: src/launch.asm modified: src/ldeboot.c modified: src/ldeether.c modified: src/ldsout.c modified: src/lineblt8.c modified: src/lisp2c.c modified: src/llcolor.c modified: src/llstk.c modified: src/loader.c modified: src/loopsops.c modified: src/lowlev1.c modified: src/lowlev2.c modified: src/lpdual.c modified: src/lpkit.c modified: src/lplexyy.c modified: src/lpmain.c modified: src/lpread.c modified: src/lpsolve.c modified: src/lptran.c modified: src/lpwrite.c modified: src/lpytab.c modified: src/lsthandl.c modified: src/main.c modified: src/misc7.c modified: src/miscn.c modified: src/mkatom.c modified: src/mkcell.c modified: src/mkkey.c modified: src/mkvdate.c modified: src/mnwevent.c modified: src/mnxmeth.c modified: src/mouseif.c modified: src/mvs.c modified: src/ocr.c modified: src/ocrproc.c modified: src/oether.c modified: src/oldeether.c modified: src/optck.c modified: src/osmsg.c modified: src/perrno.c modified: src/picture.c modified: src/rawcolor.c modified: src/rawrs232c.c modified: src/return.c modified: src/rpc.c modified: src/rplcons.c modified: src/rs232c.c modified: src/setsout.c modified: src/shift.c modified: src/socdvr.c modified: src/storage.c modified: src/subr.c modified: src/subr0374.c modified: src/sxhash.c modified: src/testdsp.c modified: src/testtool.c modified: src/timeoday.c modified: src/timeofday.c modified: src/timer.c modified: src/truecolor.c modified: src/tstsout.c modified: src/tty.c modified: src/typeof.c modified: src/ubf1.c modified: src/ubf2.c modified: src/ubf3.c modified: src/ufn.c modified: src/ufs.c modified: src/unixcomm.c modified: src/unixfork.c modified: src/unwind.c modified: src/uraid.c modified: src/usrsubr.c modified: src/uutils.c modified: src/vars3.c modified: src/vesafns.asm modified: src/vesainit.c modified: src/vgainit.c modified: src/vmemsave.c modified: src/xbbt.c modified: src/xc.c modified: src/xc.c.orig modified: src/xcursor.c modified: src/xinit.c modified: src/xlspwin.c modified: src/xmkicon.c modified: src/xrdopt.c modified: src/xscroll.c modified: src/xwinman.c modified: src/z2.c
391 lines
14 KiB
C
391 lines
14 KiB
C
/* $Id: chardev.c,v 1.2 1999/01/03 02:06:50 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
|
|
*/
|
|
static char *id = "$Id: chardev.c,v 1.2 1999/01/03 02:06:50 sybalsky Exp $ Copyright (C) Venue";
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* (C) Copyright 1989-95 Venue. All Rights Reserved. */
|
|
/* Manufactured in the United States of America. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
#include "version.h"
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* C H A R A C T E R - D E V I C E S U P P O R T */
|
|
/* */
|
|
/* */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
#ifndef DOS
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/file.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/param.h>
|
|
#include <sys/time.h>
|
|
#ifndef OS5
|
|
#ifndef FREEBSD
|
|
#include <sys/dir.h>
|
|
#endif /* FREEBSD */
|
|
#endif /* OS5 */
|
|
#ifndef HPUX
|
|
#ifndef OS5
|
|
#include <strings.h>
|
|
#endif /* OS5 */
|
|
#endif /* HPUX */
|
|
#include <sys/ioctl.h>
|
|
#else /* DOS */
|
|
#include <string.h>
|
|
#endif /* DOS */
|
|
|
|
#include <unistd.h>
|
|
#include <setjmp.h>
|
|
#include <signal.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
|
|
#include "lispemul.h"
|
|
#include "lispmap.h"
|
|
#include "adr68k.h"
|
|
#include "lsptypes.h"
|
|
#include "arith.h"
|
|
#include "timeout.h"
|
|
#include "locfile.h"
|
|
#include "osmsg.h"
|
|
#include "dbprint.h"
|
|
#include "chardev.h"
|
|
|
|
#if defined(ISC) || defined(FREEBSD)
|
|
#include <dirent.h>
|
|
#endif
|
|
|
|
extern int *Lisp_errno;
|
|
extern int Dummy_errno;
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* C H A R _ o p e n f i l e */
|
|
/* */
|
|
/* Given the arg vector */
|
|
/* args[0] Lisp string full Unix file-name to open */
|
|
/* args[1] Access to open it for (INPUT, OUTPUT, BOTH) */
|
|
/* args[2] a FIXP cell to hold any Unix error number */
|
|
/* */
|
|
/* Open the file named, and return the SMALLP descriptor. If */
|
|
/* the open fails, return NIL, and put the Unix error number */
|
|
/* into the FIXP cell provided, for Lisp to look at. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
LispPTR CHAR_openfile(LispPTR *args)
|
|
/* args[0] fullname */
|
|
/* args[1] access */
|
|
/* args[2] errno */
|
|
{
|
|
#ifndef DOS
|
|
register int id; /* return value of open system call. */
|
|
register int flags; /* open system call's argument */
|
|
register int rval;
|
|
struct stat statbuf;
|
|
char pathname[MAXPATHLEN];
|
|
|
|
#if (defined(RS6000) || defined(HPUX))
|
|
static int one = 1; /* Used in charopenfile, etc. */
|
|
#endif
|
|
|
|
Lisp_errno = (int *)(Addr68k_from_LADDR(args[2]));
|
|
|
|
LispStringToCString(args[0], pathname, MAXPATHLEN);
|
|
flags = O_NDELAY;
|
|
ERRSETJMP(NIL);
|
|
/* TIMEOUT( rval=stat(pathname, &statbuf) );
|
|
if(rval == 0){ } */
|
|
switch (args[1]) {
|
|
case ACCESS_INPUT: flags |= O_RDONLY; break;
|
|
case ACCESS_OUTPUT: flags |= (O_WRONLY | O_CREAT); break;
|
|
case ACCESS_APPEND: flags |= (O_APPEND | O_RDWR | O_CREAT); break;
|
|
case ACCESS_BOTH: flags |= (O_RDWR | O_CREAT); break;
|
|
default: return (NIL);
|
|
}
|
|
TIMEOUT(id = open(pathname, flags));
|
|
if (id == -1) {
|
|
err_mess("open", errno);
|
|
*Lisp_errno = errno;
|
|
return (NIL);
|
|
}
|
|
/* Prevent I/O requests from blocking -- make them error */
|
|
/* if no char is available, or there's no room in pipe. */
|
|
#ifdef RS6000
|
|
ioctl(id, FIONBIO, &one);
|
|
fcntl(id, F_SETOWN, getpid());
|
|
#else
|
|
#ifdef HPUX
|
|
ioctl(id, FIOSNBIO, &one);
|
|
#else
|
|
rval = fcntl(id, F_GETFL, 0);
|
|
rval |= FNDELAY;
|
|
rval = fcntl(id, F_SETFL, rval);
|
|
#endif /* HPUX */
|
|
|
|
#endif /* RS6000 */
|
|
|
|
return (GetSmallp(id));
|
|
#endif /* DOS */
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* C H A R _ c l o s e f i l e */
|
|
/* */
|
|
/* Given the arg vector: */
|
|
/* args[0] The SMALLP file descriptor as returned by OPEN */
|
|
/* args[1] a FIXP cell to hold any Unix error number */
|
|
/* */
|
|
/* Close the file identified by the descriptor. If the */
|
|
/* close succeeds, return T. Otherwise, return NIL, and put */
|
|
/* the Unix error number in the FIXP cell, for Lisp to see. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
LispPTR CHAR_closefile(LispPTR *args)
|
|
/* args[0] id */
|
|
/* args[1] errno */
|
|
{
|
|
#ifndef DOS
|
|
register int id; /* FileID */
|
|
register int rval;
|
|
Lisp_errno = (int *)(Addr68k_from_LADDR(args[1]));
|
|
id = LispNumToCInt(args[0]);
|
|
ERRSETJMP(NIL);
|
|
TIMEOUT(rval = close(id));
|
|
if (rval == -1) {
|
|
/** This if is a patch for an apparent problem **/
|
|
/** in SunOS 4 that causes a close on /dev/ttya **/
|
|
/** to error with 'not owner' **/
|
|
if (errno == 1) {
|
|
DBPRINT(("Got errno 1 on a CLOSE!"));
|
|
return (ATOM_T);
|
|
}
|
|
DBPRINT(("Closing char device descriptor #%d.\n", id));
|
|
err_mess("close", errno);
|
|
*Lisp_errno = errno;
|
|
return (NIL);
|
|
}
|
|
return (ATOM_T);
|
|
#endif /* DOS */
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* C H A R _ i o c t l */
|
|
/* */
|
|
/* Given the arg vector: */
|
|
/* args[0] the file descriptor to be acted on. */
|
|
/* args[1] the IOCTL request code. */
|
|
/* args[2] auxiliary data structure passed to IOCTL */
|
|
/* args[3] a FIXP cell to contain any Unix error number */
|
|
/* */
|
|
/* Perform the IOCTL system call on the given file descriptor, */
|
|
/* passing in the request code and auxiliary structure given. */
|
|
/* If the IOCTL succeeds, return T (and the aux structure may */
|
|
/* be side-effected). Otherwise, return NIL, and put the Unix */
|
|
/* error number in the FIXP cell for Lisp to look at. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
LispPTR CHAR_ioctl(LispPTR *args)
|
|
{
|
|
#ifndef DOS
|
|
int id, request, data;
|
|
register int rval;
|
|
Lisp_errno = (int *)(Addr68k_from_LADDR(args[3]));
|
|
id = LispNumToCInt(args[0]);
|
|
request = LispNumToCInt(args[1]);
|
|
data = (int)(Addr68k_from_LADDR(args[2]));
|
|
ERRSETJMP(NIL);
|
|
TIMEOUT(rval = ioctl(id, request, data));
|
|
if (rval != 0) {
|
|
err_mess("ioctl", errno);
|
|
*Lisp_errno = errno;
|
|
return (NIL);
|
|
}
|
|
return (ATOM_T);
|
|
#endif /* DOS */
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* C H A R _ b i n */
|
|
/* */
|
|
/* Reads one character from the character file descriptor */
|
|
/* id, and returns the value. If no character is available, */
|
|
/* or an error happens, returns NIL and sets the errno FIXP */
|
|
/* cell to the Unix error number. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
LispPTR CHAR_bin(int id, LispPTR errn)
|
|
{
|
|
#ifndef DOS
|
|
register int rval;
|
|
unsigned char ch[4];
|
|
Lisp_errno = (int *)(Addr68k_from_LADDR(errn));
|
|
ERRSETJMP(NIL);
|
|
id = LispNumToCInt(id);
|
|
/* Read PAGE_SIZE bytes file contents from filepointer. */
|
|
TIMEOUT(rval = read(id, ch, 1));
|
|
if (rval == 0) {
|
|
*Lisp_errno = EWOULDBLOCK;
|
|
return (NIL);
|
|
}
|
|
if (rval == -1) {
|
|
*Lisp_errno = errno;
|
|
return (NIL);
|
|
}
|
|
return (GetSmallp(ch[0]));
|
|
#endif /* DOS */
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* C H A R _ b o u t */
|
|
/* */
|
|
/* Write character ch to the character file descriptor id. If */
|
|
/* the write works, return T; else return NIL and sets the FIXP */
|
|
/* cell at errno to contain the Unix error number. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
LispPTR CHAR_bout(int id, LispPTR ch, LispPTR errn)
|
|
{
|
|
#ifndef DOS
|
|
register int rval;
|
|
char buf[4];
|
|
Lisp_errno = (int *)(Addr68k_from_LADDR(errn));
|
|
ERRSETJMP(NIL);
|
|
id = LispNumToCInt(id);
|
|
buf[0] = LispNumToCInt(ch);
|
|
/* Write PAGE_SIZE bytes file contents from filepointer. */
|
|
|
|
TIMEOUT(rval = write(id, buf, 1));
|
|
|
|
if (rval == -1) {
|
|
*Lisp_errno = errno;
|
|
return (NIL);
|
|
}
|
|
if (rval == 0) {
|
|
*Lisp_errno = EWOULDBLOCK;
|
|
return (NIL);
|
|
}
|
|
return (ATOM_T);
|
|
#endif /* DOS */
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* C H A R _ b i n s */
|
|
/* */
|
|
/* Given the argument vector: */
|
|
/* args[0] the file id to read bytes from */
|
|
/* args[1] the base address of the buffer to read into */
|
|
/* args[2] starting offset within the buffer to put bytes at */
|
|
/* args[3] the number of bytes desired to read, maximum */
|
|
/* args[4] a FIXP cell to hold the errno, if an error occurs */
|
|
/* */
|
|
/* Read up to the specified number of bytes into the buffer, */
|
|
/* starting at the offset given. Return the number of bytes */
|
|
/* actually read; will return if fewer bytes than desired are */
|
|
/* read. If an error occurs in reading, return NIL, and put */
|
|
/* the Unix errno into the FIXP cell given. EWOULDBLOCK is an */
|
|
/* error that can occur--and bins returns NIL, so Lisp code has */
|
|
/* to handle that case itself. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
LispPTR CHAR_bins(LispPTR *args)
|
|
{
|
|
#ifndef DOS
|
|
register int id, rval;
|
|
char *buffer;
|
|
int nbytes;
|
|
Lisp_errno = (int *)(Addr68k_from_LADDR(args[4]));
|
|
ERRSETJMP(NIL);
|
|
id = LispNumToCInt(args[0]);
|
|
buffer = ((char *)(Addr68k_from_LADDR(args[1]))) + LispNumToCInt(args[2]);
|
|
nbytes = LispNumToCInt(args[3]);
|
|
/* Read PAGE_SIZE bytes file contents from filepointer. */
|
|
TIMEOUT(rval = read(id, buffer, nbytes));
|
|
if (rval == 0) {
|
|
*Lisp_errno = EWOULDBLOCK;
|
|
return (NIL);
|
|
}
|
|
if (rval == -1) {
|
|
*Lisp_errno = errno;
|
|
return (NIL);
|
|
}
|
|
|
|
#ifdef BYTESWAP
|
|
word_swap_page(buffer, (nbytes + 3) >> 2);
|
|
#endif /* BYTESWAP */
|
|
|
|
return (GetSmallp(rval));
|
|
#endif /* DOS */
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* C H A R _ b o u t s */
|
|
/* */
|
|
/* Given the argument vector: */
|
|
/* args[0] the file id to write bytes to */
|
|
/* args[1] the base address of the buffer to write from */
|
|
/* args[2] starting offset within the buffer to gt bytes from */
|
|
/* args[3] the number of bytes desired to write, maximum */
|
|
/* args[4] a FIXP cell to hold the errno, if an error occurs */
|
|
/* */
|
|
/* write up to the specified number of bytes from the buffer, */
|
|
/* starting at the offset given. Return the number of bytes */
|
|
/* actually written; will return if fewer bytes than desired are */
|
|
/* written. If an error occurs in writing, return NIL, and put */
|
|
/* the Unix errno into the FIXP cell given. EWOULDBLOCK is an */
|
|
/* error that can occur--and bins returns NIL, so Lisp code has */
|
|
/* to handle that case itself. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
LispPTR CHAR_bouts(LispPTR *args)
|
|
{
|
|
#ifndef DOS
|
|
register int id, rval;
|
|
char *buffer;
|
|
int nbytes;
|
|
Lisp_errno = (int *)(Addr68k_from_LADDR(args[4]));
|
|
ERRSETJMP(NIL);
|
|
id = LispNumToCInt(args[0]);
|
|
buffer = ((char *)(Addr68k_from_LADDR(args[1]))) + LispNumToCInt(args[2]);
|
|
nbytes = LispNumToCInt(args[3]);
|
|
/* Write PAGE_SIZE bytes file contents from filepointer. */
|
|
#ifdef BYTESWAP
|
|
word_swap_page(buffer, (nbytes + 3) >> 2);
|
|
#endif /* BYTESWAP */
|
|
|
|
TIMEOUT(rval = write(id, buffer, nbytes));
|
|
#ifdef BYTESWAP
|
|
word_swap_page(buffer, (nbytes + 3) >> 2);
|
|
#endif /* BYTESWAP */
|
|
|
|
if (rval == -1) {
|
|
*Lisp_errno = errno;
|
|
return (NIL);
|
|
}
|
|
if (rval == 0) {
|
|
*Lisp_errno = EWOULDBLOCK;
|
|
return (NIL);
|
|
}
|
|
return (GetSmallp(rval));
|
|
#endif /* DOS */
|
|
}
|