ftp.nice.ch/pub/next/developer/languages/c/djgpp-NS.s.tar.gz#/djgpp/go32/fixstub.c

This is fixstub.c in view mode; [Download] [Up]

/* This is file FIXSTUB.C */
/*
** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
**
** This file is distributed under the terms listed in the document
** "copying.dj", available from DJ Delorie at the address above.
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained.  This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>

#include "gotypes.h"
#include "stubinfo.h"

word32 offset_of_info = 0;
word32 size_of_info = 0;

StubInfo stub_info = {
  STUB_INFO_MAGIC
};

char *key = stub_info.magic;

void find_info(char *filename)
{  
  FILE *f;
  int ch;
  int key_p = 0;
  long key_max, key_cnt=0;
  unsigned char header[6];

  f = fopen(filename, "rb");
  if (f == 0)
  {
    char buf[100];
    sprintf(buf, "Fatal error in stubedit reading %s", filename);
    perror(buf);
    exit(1);
  }

  fread(header, 6, 1, f);
  key_p += 6;
  key_max = header[4] + header[5]*256 + 1;
  key_max *= 512;

  while ((ch = fgetc(f)) != EOF)
  {
    if (ch == key[key_p])
    {
      key_p++;
      if (key[key_p] == 0)
      {
        fgetc(f); /* the NULL */
        offset_of_info = ftell(f) - 16; /* skip the NULL in the file */
        fread(&size_of_info, 1, 4, f);
        stub_info.struct_length = size_of_info;
        if (size_of_info > sizeof(StubInfo))
          size_of_info = sizeof(StubInfo);
        fseek(f, offset_of_info, 0);
        fread(&stub_info, 1, (int)size_of_info, f);
        fclose(f);
        return;
      }
    }
    else
      key_p = 0;
    key_cnt++;
    if (key_cnt > key_max)
      break;
  }
  fclose(f);
  fprintf(stderr, "Error: I cannot find the stub info structure.  Must be either\n");
  fprintf(stderr, "this is not a stub'd program, or it is older and does not have one.\n");
  exit(1);
}

main(int argc, char **argv)
{
  long info_ofs;
  int stub_f;
  char *stub_fname;
  long size;
  
  if (argc > 1)
    stub_fname = argv[1];
  else
    stub_fname = "stub.exe";

  stub_f = _open(stub_fname, O_RDONLY);
  if (stub_f < 0)
  {
    fprintf(stderr, "Unable to open file %s\n", stub_fname);
    perror("The error was");
    exit(1);
  }

  find_info(stub_fname);

  size = lseek(stub_f, -4L, 2);
  _read(stub_f, &info_ofs, 4);

  if (info_ofs <= 0 || info_ofs > size || info_ofs != offset_of_info)
  {
    unsigned short header[2];
    int stub_f = _open(stub_fname, O_WRONLY);
    if (stub_f < 0)
    {
      fprintf(stderr, "Error: cannot write to %s\n", stub_fname);
      perror("The error was");
      exit(1);
    }
    size = lseek(stub_f, 0L, 2) + 4;
    size = (size+511)&~511;
    lseek(stub_f, size-4, 0);
    _write(stub_f, &offset_of_info, 4);
    header[0] = size & 511;
    header[1] = (size + 511)/512;
    lseek(stub_f, 2L, 0);
    _write(stub_f, header, 4);
    _close(stub_f);
  }

  _close(stub_f);

  return 0;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.