Subversion Repositories SvarDOS

Rev

Rev 366 | Rev 369 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 366 Rev 367
Line 204... Line 204...
204
   * the other program failed to be executed. */
204
   * the other program failed to be executed. */
205
  execvp(argvlist[0], argvlist);
205
  execvp(argvlist[0], argvlist);
206
}
206
}
207
 
207
 
208
 
208
 
-
 
209
static void set_comspec_to_self(unsigned short envseg) {
-
 
210
  unsigned short *psp_envseg = (void *)(0x2c); /* pointer to my env segment field in the PSP */
-
 
211
  char far *myenv = MK_FP(*psp_envseg, 0);
-
 
212
  unsigned short varcount;
-
 
213
  char buff[256] = "COMSPEC=";
-
 
214
  char *buffptr = buff + 8;
-
 
215
  /* who am i? look into my own environment, at the end of it should be my EXEPATH string */
-
 
216
  while (*myenv != 0) {
-
 
217
    /* consume a NULL-terminated string */
-
 
218
    while (*myenv != 0) myenv++;
-
 
219
    /* move to next string */
-
 
220
    myenv++;
-
 
221
  }
-
 
222
  /* get next word, if 1 then EXEPATH follows */
-
 
223
  myenv++;
-
 
224
  varcount = *myenv;
-
 
225
  myenv++;
-
 
226
  varcount |= (*myenv << 8);
-
 
227
  myenv++;
-
 
228
  if (varcount != 1) return; /* NO EXEPATH FOUND */
-
 
229
  while (*myenv != 0) {
-
 
230
    *buffptr = *myenv;
-
 
231
    buffptr++;
-
 
232
    myenv++;
-
 
233
  }
-
 
234
  *buffptr = 0;
-
 
235
  /* printf("EXEPATH: '%s'\r\n", buff); */
-
 
236
  env_setvar(envseg, buff);
-
 
237
}
-
 
238
 
-
 
239
 
209
int main(int argc, char **argv) {
240
int main(int argc, char **argv) {
210
  struct config cfg;
241
  struct config cfg;
211
  unsigned short rmod_seg;
242
  unsigned short rmod_seg;
212
  unsigned short far *rmod_envseg;
243
  unsigned short far *rmod_envseg;
213
  unsigned short far *lastexitcode;
244
  unsigned short far *lastexitcode;
Line 218... Line 249...
218
  if (rmod_seg == 0xffff) {
249
  if (rmod_seg == 0xffff) {
219
    rmod_seg = rmod_install(cfg.envsiz);
250
    rmod_seg = rmod_install(cfg.envsiz);
220
    if (rmod_seg == 0xffff) {
251
    if (rmod_seg == 0xffff) {
221
      puts("ERROR: rmod_install() failed");
252
      puts("ERROR: rmod_install() failed");
222
      return(1);
253
      return(1);
223
    } else {
-
 
224
      printf("rmod installed at seg 0x%04X\r\n", rmod_seg);
-
 
225
    }
254
    }
-
 
255
    printf("rmod installed at seg 0x%04X\r\n", rmod_seg);
226
  } else {
256
  } else {
227
    printf("rmod found at seg 0x%04x\r\n", rmod_seg);
257
    printf("rmod found at seg 0x%04x\r\n", rmod_seg);
228
  }
258
  }
229
 
259
 
230
  rmod_envseg = MK_FP(rmod_seg, RMOD_OFFSET_ENVSEG);
260
  rmod_envseg = MK_FP(rmod_seg, RMOD_OFFSET_ENVSEG);
231
  lastexitcode = MK_FP(rmod_seg, RMOD_OFFSET_LEXITCODE);
261
  lastexitcode = MK_FP(rmod_seg, RMOD_OFFSET_LEXITCODE);
232
 
262
 
-
 
263
  /* make COMPSEC point to myself */
-
 
264
  set_comspec_to_self(*rmod_envseg);
-
 
265
 
233
  {
266
  {
234
    unsigned short envsiz;
267
    unsigned short envsiz;
235
    unsigned short far *sizptr = MK_FP(*rmod_envseg - 1, 3);
268
    unsigned short far *sizptr = MK_FP(*rmod_envseg - 1, 3);
236
    envsiz = *sizptr;
269
    envsiz = *sizptr;
237
    envsiz *= 16;
270
    envsiz *= 16;
Line 309... Line 342...
309
    cmdline[(unsigned char)(cmdline[-1])] = 0;
342
    cmdline[(unsigned char)(cmdline[-1])] = 0;
310
 
343
 
311
    /* move pointer forward to skip over any leading spaces */
344
    /* move pointer forward to skip over any leading spaces */
312
    while (*cmdline == ' ') cmdline++;
345
    while (*cmdline == ' ') cmdline++;
313
 
346
 
-
 
347
    /* update rmod's ptr to COMPSPEC so it is always up to date */
-
 
348
    rmod_updatecomspecptr(rmod_seg, *rmod_envseg);
-
 
349
 
314
    /* try matching (and executing) an internal command */
350
    /* try matching (and executing) an internal command */
315
    {
351
    {
316
      int ecode = cmd_process(*rmod_envseg, cmdline);
352
      int ecode = cmd_process(*rmod_envseg, cmdline);
317
      if (ecode >= 0) *lastexitcode = ecode;
353
      if (ecode >= 0) *lastexitcode = ecode;
318
      /* update rmod's ptr to COMPSPEC, in case it changed */
-
 
319
      {
-
 
320
        unsigned short far *comspecptr = MK_FP(rmod_seg, RMOD_OFFSET_COMSPECPTR);
-
 
321
        char far *comspecfp = env_lookup(*rmod_envseg, "COMSPEC");
-
 
322
        if (comspecfp != NULL) {
-
 
323
          *comspecptr = FP_OFF(comspecfp) + 8; /* +8 to skip the "COMSPEC=" prefix */
-
 
324
        } else {
-
 
325
          *comspecptr = 0;
-
 
326
        }
-
 
327
      }
-
 
328
      if (ecode >= -1) continue; /* internal command executed */
354
      if (ecode >= -1) continue; /* internal command executed */
329
    }
355
    }
330
 
356
 
331
    /* if here, then this was not an internal command */
357
    /* if here, then this was not an internal command */
332
    run_as_external(cmdline);
358
    run_as_external(cmdline);