DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦0587ae9dc⟧ TextFile

    Length: 2987 (0xbab)
    Types: TextFile
    Notes: UNIX file
    Names: »dshell.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦2d53db1df⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »hr/src/desk/dshell.c« 

TextFile

#include <sgtty.h>
#include <signal.h>
#include <stdio.h>
#include "desk.h"

struct tchars tchars =
{
	'\177',		/* intrc is DEL	*/
	'\034',		/* quitc is FS	*/
	'\021',		/* start is ^Q	*/
	'\023',		/* stop  is ^S	*/
	-1,		/* eof   is OFF	*/
	-1		/* break is OFF	*/
};

char *
dwname(wid)
register int wid;
{
	static char *fn = "/dev/windowXX";

	if ( wid == WINDOW+DNW )
	{
		return;
	}
	if ( wid-WINDOW < 10 )
	{
		fn[11] = '0'-WINDOW+wid;
		fn[12] = '\0';
	}
	else
	{
		fn[11] = '1';
		fn[12] = '0'-10-WINDOW+wid;
	}
	return fn;
}


fquit()
{
	register struct dproc	*p;
	extern int alexit;

	AL_Open(alexit);
	if ( dnLwait() )
	{
		AL_Close();
		unTrack();
		p = &dproc[dskWin];
		killit(p->pid);
		p->pid = -1;
		dp_remove(p);
	}
	else
	{
		upAwait();
		AL_Close();
	}
}
	
fshell()
{
	register struct dproc *p;

	for ( p = dproc + SWBASE ; p < dproc + SWBASE + 4 ; p++ )
		if ( p->pid == -1 )
			break;
	if ( p == dproc+SWBASE+4 )
		return;
	dshell(p - dproc);
}


fclock()
{
	register struct dproc *p;

	p = dproc + CWBASE;
	if ( p->pid != -1 )
		return;
	dshell(p - dproc);
}


fgshell()
{
	register struct dproc *p;

	for ( p = dproc + GWBASE ; p < dproc + GWBASE + NGW ; p++ )
		if ( p->pid == -1 )
			break;
	if ( p == dproc+GWBASE+NGW )
		return;
	dshell(p - dproc);
}


dshell(wid)
register int wid;
{
	extern	RECT getRect();
	register int fd;
	register struct dproc *p;
	int	i;
	int	pid;
	int	pfd[2];
	RECT	rect = { 0, 0, 0, 0};

	pipe(pfd);
	pid = fork();
	if ( pid == -1 )
	{
		printf("dmgr: couldn' fork\n");
		return;
	}
	else if ( pid == 0 )
	{
		ioctl(myfd, CIOUHOLD);
		ioctl(myfd, CIOMSEOFF);
		fd = open(dwname(wid), 2);
		ioctl(myfd, CIOMSEON);
		if ( fd < 0 )
		{
			printf("dmgr: bad window open %d\n", wid);
			write(pfd[1], &rect, sizeof(rect));
			close(pfd[1]);
			exit(0);
		}
		close(0);
		close(1);
		close(2);
		dup(fd);
		dup(fd);
		dup(fd);
		close(fd);
		dskWin = wid;
		rect = getRect();
		write(pfd[1], &rect, sizeof(rect));
		close(pfd[1]);
		close(pfd[0]);
		signal(SIGSEGV, SIG_DFL);
		signal(SIGINT, SIG_DFL);
		ioctl(0, TIOCSETC, &tchars);
		execl(shell[wid-WINDOW][0], shell[wid-WINDOW][1], NULL);
		exit(0);
	}
	else
	{
		p = dproc+wid;
		read(pfd[0], &p->prect, sizeof(p->prect));
		if ( !R_null(p->prect) )
		{
			p->pid = pid;
			dp_insert(p);
		}
		close(pfd[0]);
		close(pfd[1]);
	}
}


/*
 *  remove a dproc structure from the list.
 */
dp_remove(p)
register struct dproc *p;
{
	if ( p->pprev )
	{
		if ( p->pprev->pnext = p->pnext )
			p->pnext->pprev = p->pprev;
	}
	else
	{
		if ( dskTop = p->pnext )
			p->pnext->pprev = 0;
	}
	if ( dskTop == p )
		dskTop = p->pnext;
	if ( dskBot == p )
		dskBot = p->pprev;
}


dp_insert(p)
register struct dproc *p;
{
	p->pnext = dskTop;
	p->pprev = 0;
	if ( dskTop )
		dskTop->pprev = p;
	dskTop = p;
	if ( not dskBot )
		dskBot = p;
}


dp_append(p)
register struct dproc *p;
{
	p->pnext = 0;
	p->pprev = dskBot;
	if ( dskBot )
		dskBot->pnext = p;
	dskBot = p;
	if ( not dskTop )
		dskTop = p;
}