ricks@iscuva.ISCS.COM (Rick Schaeffer) (08/21/88)
Here is a shar file containing my path mods to CSH as well as a unix-like
system() function for Manx C. I'm not sure if my .signature file will
be appended, so be sure to check for it before unsharing. I hope I don't
get flamed for posting this here rather than in comp.sources.amiga! It's
pretty small.
Rick Schaeffer
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# README
# pathdiffs
# getpath.c
# system.c
# This archive created: Sat Aug 20 12:31:34 1988
cat << \SHAR_EOF > README
This posting includes patches to csh version 2.07m and a new module
(getpath.c) for inclusion in the link of csh. These changes cause
csh to default to AmigaDos's PATH for it's internal "_path" variable.
A new internal command, "path" has also been added which, after
setting AmigaDos's path, changes the "_path" variable to agree. I
didn't change the version number of csh although I perhaps should have.
Also included is a module, "system.c", for inclusion in other programs
or perhaps the Manx library. It implements a unix-like "system()"
function which, combined with the above changes to csh, supports
redirection and returns the correct exit status.
Rick Schaeffer
E. 13611 26th Ave.
Spokane, Wa. 99216
Usenet address: uunet!iscuva!ricks (ricks@iscuva.ISCS.COM)
SHAR_EOF
cat << \SHAR_EOF > pathdiffs
*** df2:csh207/Makefile Mon Oct 12 21:17:32 1987
--- Makefile Sat Aug 13 16:03:42 1988
***************
*** 6,12 ****
######################################################################
OBJS = run.o main.o comm1.o comm2.o execom.o set.o sub.o \
! globals.o rawconsole.o sort.o
INCL = shell.h
--- 6,12 ----
######################################################################
OBJS = run.o main.o comm1.o comm2.o execom.o set.o sub.o \
! globals.o rawconsole.o sort.o getpath.o
INCL = shell.h
***************
*** 39,41 ****
--- 39,44 ----
execom.o : execom.c $(INCL)
cc +IShell.syms execom.c
+
+ getpath.o : getpath.c
+ cc getpath.c
*** df2:csh207/main.c Mon Oct 12 21:17:31 1987
--- main.c Sat Aug 13 16:06:15 1988
***************
*** 78,83 ****
--- 78,85 ----
init_vars()
{
+ char *getPath();
+
if (IsInteractive(Input()))
set_var (LEVEL_SET, V_PROMPT, "$ ");
else
***************
*** 84,90 ****
set_var (LEVEL_SET, V_PROMPT, "");
set_var (LEVEL_SET, V_HIST, "20");
set_var (LEVEL_SET, V_LASTERR, "0");
! set_var (LEVEL_SET, V_PATH, "ram:,ram:c/,c:,df1:c/,df0:c/");
set_var (LEVEL_SET, "_insert", "1");
}
--- 86,93 ----
set_var (LEVEL_SET, V_PROMPT, "");
set_var (LEVEL_SET, V_HIST, "20");
set_var (LEVEL_SET, V_LASTERR, "0");
! /* set_var (LEVEL_SET, V_PATH, "ram:,ram:c/,c:,df1:c/,df0:c/"); */
! set_var (LEVEL_SET, V_PATH, getPath());
set_var (LEVEL_SET, "_insert", "1");
}
*** df2:csh207/execom.c Mon Oct 12 21:17:23 1987
--- execom.c Sat Aug 13 16:39:37 1988
***************
*** 42,48 ****
extern int do_input(), do_ver(), do_sleep(), do_help();
extern int do_strhead(), do_strtail();
extern int do_copy(), date(), do_ps();
! extern int do_forever(), do_abortline();
char *push_cpy();
static struct COMMAND Command[] = {
--- 42,48 ----
extern int do_input(), do_ver(), do_sleep(), do_help();
extern int do_strhead(), do_strtail();
extern int do_copy(), date(), do_ps();
! extern int do_forever(), do_abortline(), do_path();
char *push_cpy();
static struct COMMAND Command[] = {
***************
*** 72,77 ****
--- 72,78 ----
do_mem , 0, 0, 0 , "mem",
do_mkdir , 0, 0, 0 , "mkdir",
do_mv , 2, 0, 0 , "mv",
+ do_path , 0, 0, 0 , "path",
do_ps , 0, 0, 0, "ps",
do_pwd , 0, 0, 0 , "pwd",
do_quit , 0, ST_NORED, 0 , "quit",
*** df2:csh207/set.c Mon Oct 12 21:17:40 1987
--- set.c Sat Aug 13 16:45:36 1988
***************
*** 171,173 ****
--- 171,184 ----
if (S_histlen < 2) S_histlen = 2;
}
}
+
+ do_path(command)
+ char *command;
+ {
+ char *getPath();
+
+ command[0] = 'P';
+ exec_command(command);
+ set_var (LEVEL_SET, V_PATH, getPath());
+ return(0);
+ }
SHAR_EOF
cat << \SHAR_EOF > getpath.c
/* GETPATH.C
** Get amigados's path for use in CSH.
**
** Rick Schaeffer
** uunet!iscuva!ricks (ricks@iscuva.ISCS.COM)
*/
#include <stdio.h>
#include <libraries/dosextens.h>
#include <exec/memory.h>
extern struct Process *FindTask();
extern struct FileLock *ParentDir();
extern char *AllocMem();
struct Path {
BPTR path_Next;
LONG path_Lock;
};
/*
** This function returns a string containing AmigaDos's path. Each
** element of the path is separated by a comma (,) from it's neighbor.
** Since "C:" is assumed to be the end of the path, it is appended
** to the string returned.
*/
char *getPath()
{
static char pathstr[258],*newpath;
char *followpath();
struct Process *proc;
struct CommandLineInterface *cli;
struct Path *path;
proc = (struct Process *)FindTask(NULL);
cli = (struct CommandLineInterface *)(proc->pr_CLI << 2);
if (!cli) {
printf("getPath: Not a cli process\n");
exit(1);
}
pathstr[0] = 0;
for(path = (struct Path *) BADDR(cli->cli_CommandDir);
(path); path = (struct Path *) BADDR(path->path_Next)) {
newpath = followpath(path->path_Lock,0);
if ((strlen(newpath) + strlen(pathstr) + 2) > 256)
break; /* Not enough room for another path var */
strcat(pathstr,newpath);
strcat(pathstr,",");
}
strcat(pathstr,"C:");
return(pathstr);
}
static char *followpath(lock,level)
struct FileLock *lock;
int level;
{
struct FileInfoBlock *fib;
struct FileLock *newlock;
static char pathbuf[256];
if (! lock)
return(pathbuf);
if (level == 0)
pathbuf[0] = 0;
fib = (struct FileInfoBlock *) AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CLEAR);
if (fib == NULL) {
printf("followpath: Out of Memory\n");
return(pathbuf);
}
newlock = ParentDir(lock);
followpath(newlock,1); /* recurse till we hit the root directory */
if (Examine(lock,fib)) {
if (fib->fib_FileName[0] > ' ')
strcat(pathbuf,fib->fib_FileName);
else
strcat(pathbuf,"RAM");
if (newlock == NULL)
strcat(pathbuf,":");
else
strcat(pathbuf,"/");
}
if (level)
UnLock(lock);
if (fib)
FreeMem(fib,(long) sizeof(struct FileInfoBlock));
return(pathbuf);
}
SHAR_EOF
cat << \SHAR_EOF > system.c
/*
** SYSTEM.C
** This module implements a unix-like "system()" function for Manx C.
** It does so by utilizing the Dillon/Drew shell program (usually
** called "csh") in order to support i/o redirection and piping in the
** program being called. For this function to work, you MUST have
** the Shell somewhere in your path and it MUST be named "csh". You
** should also have a version of the shell which inherits the AmigaDos
** path since the current version of csh (2.07M) uses a default path
** which may be unsuitable.
**
** Given the above caveats, you invoke this function like this:
** exitval = system("command parm1 parm2 >outfile");
** "command" will be executed by prepending "csh -c" to it. exitval
** will be the exit status of "command". "outfile" will contain the
** stdout output of "command".
**
** Rick Schaeffer
** uunet!iscuva!ricks (ricks@iscuva.ISCS.COM)
*/
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
extern int errno;
extern char *malloc();
int system(cmd)
char *cmd;
{
char **xrgs,*myrealloc(),*optr;
register char *ptr;
register int i,j;
optr = ptr = malloc(strlen(cmd) + 1);
if (ptr == NULL) {
errno = ENOMEM;
return(-1);
}
strcpy(ptr,cmd); /* make a copy of cmd so we don't mung it in parsing */
/* The next 4 non-comment lines can be replaced by:
** xrgs = (char **) malloc(sizeof(xrgs));
** if you don't have/want to use CSH. The function will work but
** you won't be able to do i/o redirection in the command being executed.
*/
xrgs = (char **) malloc(sizeof(xrgs) * 3);
xrgs[0] = "csh";
xrgs[1] = "-c";
xrgs[2] = NULL;
i = 2;
while (*ptr) {
while (isspace(*ptr)) {
if (*ptr == 0)
break;
ptr++;
}
if (*ptr) {
xrgs = (char **) myrealloc(xrgs,sizeof(xrgs) * (i+2));
if (xrgs == NULL) {
errno = ENOMEM;
return(-1);
}
xrgs[i++] = ptr;
}
while (*ptr)
if (! isspace(*ptr))
ptr++;
else
break;
if (*ptr)
*ptr++ = 0;
}
xrgs[i] = NULL;
if ((fexecv(xrgs[0],xrgs)) != 0) {
free(xrgs);
free(optr);
return(-1);
}
else {
free(xrgs);
free(optr);
return(wait());
}
}
static char *myrealloc(ptr,nb)
char *ptr;
unsigned nb;
{
char *tptr,*malloc();
tptr = malloc(nb);
if (tptr != NULL) {
movmem(ptr,tptr,nb);
free(ptr);
}
return(tptr);
}
SHAR_EOF
# End of shell archive
exit 0
--
Rick Schaeffer UUCP: uunet!iscuva!ricks
ISC Systems Corp. ricks@iscuva.ISCS.COM
Box TAF-C8 Phone: (509)927-5114
Spokane, WA 99220