|
|
1.1 ! root 1: /* sysdos.c -- DOS version of system.c */ ! 2: ! 3: /* Author: ! 4: * Guntram Blohm ! 5: * Buchenstrasse 19 ! 6: * 7904 Erbach, West Germany ! 7: * Tel. ++49-7305-6997 ! 8: * sorry - no regular network connection ! 9: */ ! 10: ! 11: ! 12: /* This file is derived from Steve Kirkendall's system.c. ! 13: * ! 14: * Entry points are: ! 15: * system(cmd) - run a single shell command ! 16: * wildcard(names) - expand wildcard characters in filanames ! 17: * ! 18: * This file is for use with DOS and TOS. For OS/2, slight modifications ! 19: * might be sufficient. For UNIX, use system.c. For Amiga, completely ! 20: * rewrite this stuff. ! 21: * ! 22: * Another system function, filter, is the same on DOS and UNIX and thus ! 23: * can be found in the original system.c. ! 24: */ ! 25: ! 26: #include "config.h" ! 27: #include "vi.h" ! 28: extern char **environ; ! 29: ! 30: ! 31: #if MSDOS ! 32: #include <process.h> ! 33: extern unsigned char _osmajor; ! 34: #endif ! 35: #if TOS ! 36: #include <osbind.h> ! 37: #endif ! 38: ! 39: #if MSDOS || TOS ! 40: #include <string.h> ! 41: ! 42: /* ! 43: * Calling command is a bit nasty because of the undocumented yet sometimes ! 44: * used feature to change the option char to something else than /. ! 45: * Versions 2.x and 3.x support this, 4.x doesn't. ! 46: * ! 47: * For Atari, some shells define a shortcut entry which is faster than ! 48: * shell -c. Also, Mark Williams uses a special ARGV environment variable ! 49: * to pass more than 128 chars to a called command. ! 50: * We try to support all of these features here. ! 51: */ ! 52: ! 53: int system(cmd) ! 54: const char *cmd; ! 55: { ! 56: #if MSDOS ! 57: char *cmdswitch="/c"; ! 58: if (_osmajor<4) ! 59: cmdswitch[0]=switchar(); ! 60: return spawnle(P_WAIT, o_shell, o_shell, cmdswitch, cmd, (char *)0, environ); ! 61: #else ! 62: long ssp; ! 63: int (*shell)(); ! 64: char line[130]; ! 65: char env[4096], *ep=env; ! 66: int i; ! 67: ! 68: /* does our shell have a shortcut, that we can use? */ ! 69: ! 70: ssp = Super(0L); ! 71: shell = *((int (**)())0x4F6); ! 72: Super(ssp); ! 73: if (shell) ! 74: return (*shell)(cmd); ! 75: ! 76: /* else we'll have to call a shell ... */ ! 77: ! 78: for (i=0; environ[i] && strncmp(environ[i], "ARGV=", 5); i++) ! 79: { strcpy(ep, environ[i]); ! 80: ep+=strlen(ep)+1; ! 81: } ! 82: if (environ[i]) ! 83: { ! 84: strcpy(ep, environ[i]); ep+=strlen(ep)+1; ! 85: strcpy(ep, o_shell); ep+=strlen(ep)+1; ! 86: strcpy(ep, "-c"); ep+=3; ! 87: strcpy(ep, cmd); ep+=strlen(ep)+1; ! 88: } ! 89: *ep='\0'; ! 90: strcpy(line+1, "-c "); ! 91: strncat(line+1, cmd, 126); ! 92: line[0]=strlen(line+1); ! 93: return Pexec(0, o_shell, line, env); ! 94: #endif ! 95: } ! 96: ! 97: /* This private function opens a pipe from a filter. It is similar to the ! 98: * system() function above, and to popen(cmd, "r"). ! 99: * sorry - i cant use cmdstate until rpclose, but get it from spawnle. ! 100: */ ! 101: ! 102: static int cmdstate; ! 103: static char output[80]; ! 104: ! 105: int rpipe(cmd, in) ! 106: char *cmd; /* the filter command to use */ ! 107: int in; /* the fd to use for stdin */ ! 108: { ! 109: int fd, old0, old1, old2; ! 110: ! 111: /* create the file that will collect the filter's output */ ! 112: strcpy(output, o_directory); ! 113: if ((fd=strlen(output)) && !strchr("/\\:", output[fd-1])) ! 114: output[fd++]=SLASH; ! 115: strcpy(output+fd, SCRATCHIN+3); ! 116: mktemp(output); ! 117: close(creat(output, 0666)); ! 118: if ((fd=open(output, O_RDWR))==-1) ! 119: { ! 120: unlink(output); ! 121: return -1; ! 122: } ! 123: ! 124: /* save and redirect stdin, stdout, and stderr */ ! 125: old0=dup(0); ! 126: old1=dup(1); ! 127: if (in) ! 128: { ! 129: dup2(in, 0); ! 130: close(in); ! 131: } ! 132: dup2(fd, 1); ! 133: ! 134: /* call command */ ! 135: cmdstate=system(cmd); ! 136: ! 137: /* restore old std... */ ! 138: dup2(old0, 0); close(old0); ! 139: dup2(old1, 1); close(old1); ! 140: ! 141: /* rewind command output */ ! 142: lseek(fd, 0L, 0); ! 143: return fd; ! 144: } ! 145: ! 146: /* This function closes the pipe opened by rpipe(), and returns 0 for success */ ! 147: int rpclose(fd) ! 148: int fd; ! 149: { ! 150: int status; ! 151: ! 152: close(fd); ! 153: unlink(output); ! 154: return cmdstate; ! 155: } ! 156: ! 157: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.