|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 2987 (0xbab)
Types: TextFile
Notes: UNIX file
Names: »dshell.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦2d53db1df⟧ UNIX Filesystem
└─⟦this⟧ »hr/src/desk/dshell.c«
#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;
}