home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / commands / arp.lzh / ARP / TOOLS / ADDLIB.C next >
Encoding:
C/C++ Source or Header  |  1991-08-16  |  3.0 KB  |  122 lines

  1. /* addlib.c -- Used to add more than one version of the same library
  2.  *           to the library list - *extremely handy tool*.
  3.  *
  4.  * Copyright (C) 1987 SDB.
  5.  * Use at your own risk.
  6.  *
  7.  * SDB - For use in working on new versions of ArpLib, while keeping old.
  8.  *
  9.  *    If Exec finds a library node using the name requested, but with a
  10.  *    version which is lower than the requested version, it does not
  11.  *    abort the search, but continues searching for a library with the correct
  12.  *    name and version.  This allows several libraries to be in memory at
  13.  *    the same time, and to be correctly found by code which is looking for
  14.  *    the correct version - NOTE: lower lib versions MUST BE added first.
  15.  *
  16.  *    Revised: KILLS environment if GREATER than version 11.
  17.  *
  18.  */
  19.  
  20. #include <exec/types.h>
  21. #include <exec/resident.h>
  22. #include <exec/libraries.h>
  23. #include <exec/execbase.h>
  24. #include <libraries/arpbase.h>
  25.  
  26. struct ArpBase *ArpBase, *FindName();
  27. struct EnvironmentBase *EB;
  28. extern struct ExecBase *SysBase;
  29.  
  30. ULONG LoadSeg();
  31. VOID UnLoadSeg();
  32. VOID RemLibrary();
  33.  
  34. main(argc, argv)
  35. char **argv;
  36. {
  37.     ULONG         segment;
  38.     REGISTER UWORD *realptr;
  39.     ULONG         segsize;
  40.     REGISTER struct Resident *res;
  41.     REGISTER ULONG    i;
  42.     int c;
  43.  
  44.     if (argc <= 1)
  45.         printf("Usage: addlib <pathname>\n"),exit(120);
  46.  
  47.     ++argv;
  48.  
  49.     segment = LoadSeg(*argv);
  50.     if (segment == 0)
  51.         printf("Can't find %s\n", *argv), exit(130);
  52.  
  53.     realptr = (UWORD *)(segment << 2);
  54.  
  55.     for (i = 0; i < 1000; i++, realptr++)
  56.     {
  57.         res = (struct Resident *)realptr;
  58.         if (res->rt_MatchWord == RTC_MATCHWORD && res == res->rt_MatchTag)
  59.             break;    /* Gotcha! */
  60.     }
  61.     res = (struct Resident *)realptr;
  62.  
  63.     if ( res->rt_MatchWord != RTC_MATCHWORD || res != res->rt_MatchTag)
  64.     {
  65.         printf("Can't find resident segment in first 2000 bytes!\n");
  66.         UnLoadSeg(segment);
  67.         exit(140);
  68.     }
  69.     /* Flush library if there is one of that name/version already on list */
  70.  
  71.     Forbid();
  72.     ArpBase = (struct ArpBase *)(&SysBase->LibList);
  73.     while ( ArpBase = FindName(ArpBase, "arp.library"))
  74.         if (ArpBase->LibNode.lib_Version == res->rt_Version)
  75.             break;
  76.  
  77.     if (ArpBase)
  78.     {
  79.         i = ArpBase->LibNode.lib_Version;
  80.         /* FOLLOWING CODE IS DANGEROUS!!!! */
  81.         EB = (struct EnvironmentBase *)ArpBase->EnvBase;
  82.         if (i >= 12 && *EB->EnvSpace)
  83.         {
  84.             puts("Warning: Installed ArpLib has active an environment");
  85.             puts("Are you sure you want to Expunge? (y/n)");
  86.             c = getchar();
  87.             if (c != 'y')
  88.             {
  89.                 puts("ABORTED");
  90.                 UnLoadSeg(segment);
  91.                 Permit();
  92.                 exit(500);
  93.             }
  94.             *EB->EnvSpace = 0;    /* Kill environment */
  95.         }
  96.         if (ArpBase->LibNode.lib_OpenCnt)
  97.         {
  98.             printf("Warning: Version %ld of arplibrary has %d openers\n",
  99.                 i, ArpBase->LibNode.lib_OpenCnt);
  100.             printf("Are you sure you want to Expunge and add? (y/n) ");
  101.             c = getchar();
  102.             if (c != 'y')
  103.             {
  104.                 puts("ABORTED");
  105.                 UnLoadSeg(segment);
  106.                 Permit();
  107.                 exit(1000);
  108.             }
  109.  
  110.             while (ArpBase->LibNode.lib_OpenCnt > 1)
  111.                 CloseLibrary(ArpBase);
  112.         }
  113.         if (ArpBase->LibNode.lib_OpenCnt)
  114.             RemLibrary(ArpBase), CloseLibrary(ArpBase);
  115.         else
  116.             RemLibrary(ArpBase);
  117.     }    
  118.     InitResident(res, segment);
  119.     Permit();
  120.     puts("Added");
  121. }
  122.