This is ushell.c in view mode; [Download] [Up]
/* Shell-window functions
Copyright (C) 1992 Joseph H. Allen
This file is part of JOE (Joe's Own Editor)
JOE is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 1, or (at your option) any later version.
JOE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along with
JOE; see the file COPYING. If not, write to the Free Software Foundation,
675 Mass Ave, Cambridge, MA 02139, USA. */
#include "config.h"
#include "b.h"
#include "bw.h"
#include "w.h"
#include "pw.h"
#include "qw.h"
#include "vs.h"
#include "va.h"
#include "ufile.h"
#include "main.h"
#include "ushell.h"
extern int orphan;
/* Executed when shell process terminates */
static void cdone(bw)
BW *bw;
{
bw->pid=0;
close(bw->out); bw->out= -1;
if(piseof(bw->cursor))
{
binss(bw->cursor,"** Program finished **\n");
peof(bw->cursor);
bw->cursor->xcol=piscol(bw->cursor);
}
else
{
P *q=pdup(bw->b->eof);
binss(q,"** Program finished **\n");
prm(q);
}
}
/* Executed for each chunk of data we get from the shell */
static void cdata(bw,dat,siz)
BW *bw;
char *dat;
{
P *q=pdup(bw->cursor);
P *r=pdup(bw->b->eof);
char bf[1024];
int x, y;
for(x=y=0;x!=siz;++x)
if(dat[x]==13 || dat[x]==0);
else if(dat[x]==8 || dat[x]==127)
if(y) --y;
else
if(piseof(bw->cursor))
{
pset(q,bw->cursor), prgetc(q), bdel(q,bw->cursor);
bw->cursor->xcol=piscol(bw->cursor);
}
else pset(q,r), prgetc(q), bdel(q,r);
else bf[y++]=dat[x];
if(y)
if(piseof(bw->cursor))
{
binsm(bw->cursor,bf,y);
peof(bw->cursor);
bw->cursor->xcol=piscol(bw->cursor);
}
else binsm(r,bf,y);
prm(r);
prm(q);
}
static int cstart(bw,name,s,obj,notify)
BW *bw;
char *name;
char **s;
void *obj;
int *notify;
{
#ifdef __MSDOS__
if(notify) *notify=1;
varm(s);
msgnw(bw,"Sorry, no sub-processes in DOS (yet)");
return -1;
#else
MPX *m;
if(notify) *notify=1;
if(bw->pid && orphan)
{
msgnw(bw,"Program already running in this window");
varm(s);
return -1;
}
if(doedit(bw,vsncpy(NULL,0,sc("")),NULL,NULL))
{
varm(s);
return -1;
}
bw=(BW *)maint->curwin->object;
if(!(m=mpxmk(&bw->out,name,s,cdata,bw,cdone,bw)))
{
varm(s);
msgnw(bw,"No ptys available");
return -1;
}
else bw->pid= m->pid;
return 0;
#endif
}
int ubknd(bw)
BW *bw;
{
char **a;
char *s;
a=vamk(3);
s=vsncpy(NULL,0,sc("-")); a=vaadd(a,s);
s=vsncpy(NULL,0,sc("-i")); a=vaadd(a,s);
return cstart(bw,getenv("SHELL"),a,NULL,NULL);
}
/* Run a program in a window */
static int dorun(bw,s,object,notify)
BW *bw;
char *s;
void *object;
int *notify;
{
char **a=vamk(10);
char *cmd=vsncpy(NULL,0,sc("/bin/sh"));
a=vaadd(a,cmd);
cmd=vsncpy(NULL,0,sc("-c"));
a=vaadd(a,cmd);
a=vaadd(a,s);
return cstart(bw,"/bin/sh",a,NULL,notify);
}
B *runhist=0;
int urun(bw)
BW *bw;
{
if(wmkpw(bw,"Program to run: ",&runhist,dorun,"Run",NULL,NULL,NULL,NULL))
return 0;
else return -1;
}
/* Kill program */
int pidabort(bw,c,object,notify)
BW *bw;
void *object;
int *notify;
{
if(notify) *notify=1;
if(c!='y' && c!='Y') return -1;
if(bw->pid) { kill(bw->pid,1); return -1; }
else return -1;
}
int ukillpid(bw)
BW *bw;
{
if(bw->pid)
{
if(mkqw(bw,sc("Kill program (y,n,^C)?"),pidabort,NULL,NULL,NULL)) return 0;
else return -1;
}
else return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.