/*
 * Copy x bytes from an arbitrary DOS segment into an environment 
 * variable.  This is oh-so-useful, you know.
 *
 * Adam Fritzler (mid@auk.cx), 6jul1999 
 */

#define __DELL__                     
                    
#ifdef __DELL__
#define DEFAULT_SEG 0xf000
#define DEFAULT_OFF 0xb571
#define DEFAULT_LEN 5
#else
#define DEFAULT_SEG 0xc000
#define DEFAULT_OFF 0x001b
#define DEFAULT_LEN 30 
#endif

#define DEFAULT_VAR "delltag"

#include <stdio.h>                 
#include <stdlib.h>
#include <dos.h>

#ifndef _MK_FP
#define _MK_FP(seg, offset) (void __far *)(((unsigned long)seg << 16) + (unsigned long)(unsigned)offset)
#endif 
               
int main(int argc, char **argv)
{         
  char *comspec = NULL;
  void __far *tagptr=NULL;
  char *tag = NULL;
  int len = 0;
  unsigned long seg=0;
  unsigned long off=0;
  char var[50] = " ";
  char env[100] = " ";

  if (argc > 1) /* start address */
    {
      if (sscanf(argv[1], "%04x:%04x", &seg, &off)<2)
	{
	  fprintf(stderr, "error reading seg:off from arguments\n");
	  seg = DEFAULT_SEG;
	  off = DEFAULT_OFF;
	}
    }
  else
    {
      printf("address not specified\n");
      seg = DEFAULT_SEG;
      off = DEFAULT_OFF;
    }

  if (argc > 2) /* copy len */
    {
      if (sscanf(argv[2], "%d", &len) < 1)
	{
	  fprintf(stderr, "error reading copy len from arguments\n");
	  len = DEFAULT_LEN;
	}
      else if (len > 0x100)
	{
	  fprintf(stderr, "len is outrageously high, using default\n");
	  len = DEFAULT_LEN;
	}
    }
  else
    len = DEFAULT_LEN;

  if (argc > 3) /* var name */
    strncpy(var, argv[3], strlen(argv[3]));
  else
    strncpy(var, DEFAULT_VAR, strlen(DEFAULT_VAR));
 
  printf("%s: copying %d bytes from %04lx:%04lx\n", argv[0], len, seg, off);

  tag = (char *) malloc(len*sizeof(char));
  tagptr = _MK_FP(seg, off);  /* get a __far pointer */
  memcpy(tag, tagptr, len);   /* must copy it into __near space */
  tag[len] = NULL;   	          
  
  if (!(comspec = getenv("COMSPEC")))
    printf("no comspec\n");
  sprintf(env, "%s=%s", var, tag);
  _putenv(env);
  printf("%s=%s", var, getenv(var));
  free(tag);
#if 1
  if (_execl(comspec, NULL, 0, NULL) < 0)
    perror("execl");
#endif
  return 0;
}

