home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / utility / system / mb45_bin / data1.ins next >
Text File  |  1992-03-24  |  18KB  |  330 lines

  1.                                 GEMENV v1.1
  2.              Environment Variable Manager for the GEM Desktop
  3.                     Public Domain Program by Ian Lepore
  4.  
  5.  
  6. Overview
  7.  
  8.  
  9.     Environment variables (referred to as "env vars" in much of this
  10.     document) are a facility for storing information in character-string
  11.     format for a duration that exceeds the run of a single program.  (My,
  12.     that sounds stuffy.)  Many popular operating systems support env vars,
  13.     among them MSDOS, Unix, and GEMDOS.  Unfortunately, while GEMDOS
  14.     supports env vars, the GEM desktop doesn't, so it's a feature that goes
  15.     largely unused on the ST.
  16.  
  17.     This program was written to bring to GEM desktop users all the power of
  18.     environment variables that command-shell users have been enjoying for
  19.     years.  With some software, such as the public domain Sozobon C
  20.     compiler, env vars are required for the software to work correctly.
  21.  
  22.  
  23. About Environment Variables
  24.  
  25.  
  26.     Environment variables are stored in memory.  They are character strings
  27.     with a format of "VARIABLE=VALUE".  Every program inherits a copy of
  28.     the env vars owned by its parent (the program that started it).  DOS is
  29.     responsible for making a copy of the parent's env data area at the time
  30.     that it starts a new program.  It places a pointer to this copy in the
  31.     program's basepage, so that the program can access the env var data
  32.     through the pointer.
  33.  
  34.     When programming in C, there are two functions for accessing env vars,
  35.     getenv() and putenv().  These functions retrieve or store a value in
  36.     the env data area.  However, since each program receives a copy of its
  37.     parent's env vars, using putenv() won't make permanent changes to the
  38.     system's env data area; it can only affect the program's local copy.
  39.     (GEMENV.PRG uses the ST cookie jar to work around this problem.)
  40.     Therefore, the biggest use of env vars for most programs involves
  41.     reading the values that are already there.  Programs such as compilers
  42.     often read env vars to get device and path information such as where to
  43.     search for #include files or runtime libraries.
  44.  
  45.     When using GEM, the desktop is the parent program to all programs that
  46.     are started by clicking on a file.  These programs, therefore, inherit
  47.     a copy of the desktop's env data area.  Unfortunately, the desktop
  48.     doesn't keep much useful information in its env data area.  In fact,
  49.     it's only a few bytes long, and contains the string "PATH=C:\" (or
  50.     "PATH=A:\").  GEM itself uses this env var (PATH=) to locate RSC files
  51.     when they are not found in the current default directory.
  52.  
  53.  
  54. Using GEMENV
  55.  
  56.  
  57.     The GEMENV program has two different modes, depending on whether it is
  58.     run from the AUTO folder or from the desktop.  When run from AUTO, it
  59.     prepares the system to support env vars, and loads the initial env vars
  60.     from a file called ROOT.ENV, which must be in the root directory of the
  61.     boot drive.  This process is described in greater detail in the section
  62.     labeled "How GEMENV Works."
  63.  
  64.     When run from the desktop, the program does a check to see if it was
  65.     installed from the AUTO folder at bootup time.  If not, the program
  66.     will complain that a root environment doesn't exist.  In this case, you
  67.     can still use the program to create an initial set of env vars and save
  68.     them into a ROOT.ENV file, and then reboot to install them into the
  69.     system.  (If you obtained this program as part of Ian's Sozobon C
  70.     release, the Sozobon installation program will have created your
  71.     initial ROOT.ENV file for you.)
  72.  
  73.     The main interface to the program is a large dialog box that lists all
  74.     the current in-memory env vars and their values.  At the bottom of the
  75.     dialog is a series of buttons providing access to the major functions
  76.     of the program.  The displayed variables are also active buttons:
  77.     clicking on a variable in the scolling area of the dialog will bring up
  78.     the edit dialog which allows you to edit or delete a variable.
  79.  
  80.     Most of the buttons are self-explanatory, but several need further
  81.     explanation.  The CANCEL button will allow you to exit the program
  82.     without saving any changes you've done into the system env data area.
  83.     The OK button saves all changes INTO MEMORY ONLY, and then exits.
  84.  
  85.     The OPTIONS button provides access to the LOAD FILE and SAVE FILE
  86.     options.  It is possible to start the program, use the LOAD option to
  87.     load a set of variables from a file, make changes to the variables, use
  88.     the SAVE option to store them, and then exit via CANCEL so that the
  89.     changes don't affect the current in-memory variables even though
  90.     they've been stored to a file.  It can be handy to keep several
  91.     different configurations stored in different files, especially if you
  92.     use more than one C compiler.  Remember that at bootup time, GEMENV
  93.     will only install itself if a ROOT.ENV file exists, so this file should
  94.     contain your most common configuration.
  95.  
  96.     The OPTIONS dialog also provides a choice between PC FORMAT and TOS
  97.     FORMAT environment variables.  This choice affects the way the
  98.     variables are formatted in memory.  TOS FORMAT variables treat the
  99.     variable's name and value as two separate strings, each with its own
  100.     null terminator character (eg, "VARIABLE=\0VALUE\0").  The more common
  101.     PC FORMAT stores the variable name and value as a single string (eg,
  102.     "VARIABLE=VALUE\0").  It is recommended that you use PC FORMAT unless
  103.     your software specifically requires TOS FORMAT.  (You may need to use
  104.     TOS FORMAT if you're using TOS 1.0 -- I'm not sure about this yet.)
  105.  
  106.     GEMENV places few restrictions on the names or values stored in env
  107.     vars.  The only hardcore restrictions are that variable names can't
  108.     contain an '=' character (since that delimits the name from the value),
  109.     and you can't store binary data in the name or value string.  (Mainly
  110.     because GEMENV doesn't have a hex editor, but also because a binary
  111.     zero in any position would be mistaken for the end of the value
  112.     string.)  In general, the programs which use env vars dictate what the
  113.     names of env vars must be and what types of data should appear in the
  114.     value string.  Most programs require uppercase names, and some require
  115.     uppercase values, but these are not universal standards.
  116.  
  117.     The GEM desktop really likes to see a PATH= variable in the set
  118.     somewhere, and the value string must be a list of valid pathnames
  119.     separated with semicolons between each name, and with the trailing
  120.     backslash on each pathname.  Most ST software that uses a PATH=
  121.     variable is also happy with this format.  (And, if you design your own
  122.     software, you should stay compatible with this if you access the PATH=
  123.     variable.)  As mentioned previously, GEM will search the paths listed
  124.     in PATH= for .RSC files, If you want, you can put all your resource
  125.     files in one place and put that pathname in the PATH= list.  This can
  126.     also be handy when you have installed applications.  By putting all
  127.     your installed aps and their RSC files into one path, and listing that
  128.     path in the PATH= var, you'll never run into the "cannot load RSC file"
  129.     glitches that installed aps are prone to.
  130.  
  131.     There will always be two special variables in your configuration which
  132.     you cannot delete:  ENV$ROOTSIZE and ENV$OPTIONS.  ENV$OPTIONS stores
  133.     the state of the buttons in the options dialog, so that whenever
  134.     you use the program, the options will be as you last set them.  The
  135.     ENV$ROOTSIZE variable tells the program how much memory to allocate for 
  136.     env data area at bootup time.  Since you might add to the env vars at
  137.     any time by running GEMENV, a little extra memory is always allocated
  138.     when the ROOT.ENV file is loaded.  The program, by default, uses the
  139.     size of the current env data, rounded up to the next 1k boundry.
  140.     Typically, ENV$ROOTSIZE will always equal 1024 unless you have a lot of 
  141.     vars.  You can manually change this value upwards if you need to, but
  142.     it can never be made smaller than the current size rounded up to the
  143.     next 1k (if you try, the program overrides you when you save.)
  144.  
  145.     The format of the ROOT.ENV file (and other .ENV files) is compatible
  146.     with a normal text editor.  Each line contains a single entry in the
  147.     format NAME=VALUE, and the lines are terminated with a CRLF sequence
  148.     (or simply LF).  An installation utility program might want to create
  149.     or modify the ROOT.ENV file, and that's fine, given that it follows a
  150.     couple simple rules:
  151.  
  152.         - There MUST be an ENV$ROOTSIZE variable, and it MUST be an even
  153.           multiple of 1024 bytes, and the value MUST be larger than the
  154.           total size of all the env data in the file.
  155.         - There MUST be an ENV$OPTIONS variable.  If one exists already,
  156.           don't monkey with the values in it.  If you are creating a .ENV
  157.           file from scratch, create this as ENV$OPTIONS=TYY.  If you use
  158.           any other value beside TYY, don't come crying to me if the
  159.           GEMENV fails to work correctly!
  160.  
  161.     If you are modifying an existing ROOT.ENV file programmatically, please
  162.     be aware that the user may be fond of the values s/he currently has
  163.     stored in the variables.  To add your software path, for example, don't
  164.     just create a new PATH= variable, append your path to what's already
  165.     there.  If for some reason you just can't take the time to code up a
  166.     fancy modification program to handle the data that's already there,
  167.     then at the very least create a ROOT.BAK for the user which contains
  168.     the current data before you modify it.
  169.  
  170.  
  171. How GEMENV Works
  172.  
  173.  
  174.     As mentioned above, whenever a program starts, DOS provides that
  175.     program a copy of its parent's env data area.  This applies to the
  176.     process that TOS uses to start the GEM desktop as well.  After all the
  177.     AUTO programs have finished running, TOS creates a basepage for the
  178.     desktop using the standard DOS Pexec() call.  However, rather than
  179.     loading a file from disk to execute, it jumps through the exec_os
  180.     vector at $4FE in low memory after the basepage is created.
  181.  
  182.     When the GEMENV program is run from the AUTO folder it detects that
  183.     fact by trying to do an appl_init() call and getting a bad status
  184.     because GEM isn't available yet.  When this happens, it bypasses the
  185.     normal dialog stuff it does when run from the desktop.  Instead, it
  186.     loads the env vars from the ROOT.ENV file, and checks the value of the
  187.     ENV$ROOTSIZE variable.  It allocates that much memory and stores the
  188.     env vars (in TOS or PC format, as indicated by the ENV$OPTIONS var.)
  189.  
  190.     After the env data area is set up, GEMENV installs a cookie in the
  191.     system cookie jar so that it can locate the installed data area later,
  192.     when run from the desktop.  (If a cookie jar doesn't exist yet in the
  193.     system, one is installed in the standard Atari-recommended fashion.)
  194.     The cookie used is "ENV$", which isn't likely to conflict with any
  195.     existing cookies (and GEMENV will work even if there is a conflict,
  196.     although it's quite likely that the any other user of an "ENV$" cookie
  197.     would die.)
  198.  
  199.     Next, the program saves the current contents of the exec_os system
  200.     vector, and places a 'hook' into that vector, so that when TOS jumps
  201.     through the vector to start the desktop, a routine in the resident
  202.     portion of GEMENV will get control instead.  Once this is done, GEMENV
  203.     issues a Ptermres() call to remain resident, keeping only a small
  204.     program stub (about 300 bytes) and the env data itself.  The stub and
  205.     the data are adjacent; GEMENV's installation will not fragment your
  206.     free memory area like some TSRs do.
  207.  
  208.     When all the other AUTO programs are done, and TOS starts the desktop,
  209.     the stub left resident by GEMENV gets control.  All this stub does is
  210.     replace the environment data pointer in the current program basepage
  211.     with a pointer to the data area loaded from the ROOT.ENV file.  It then
  212.     restores the old value of the exec_os vector, then jumps through that
  213.     vector.  Because the env data pointer in the desktop's basepage was
  214.     changed, the desktop starts with the full contents of the ROOT.ENV data
  215.     area instead of the minimal PATH=C:\ data area that TOS created for it.
  216.     When the desktop starts other programs, it will pass copies of this
  217.     full data area along to everyone else.
  218.  
  219.     Note that GEMENV does not leave any hooks in any system vectors once
  220.     the desktop has started.  After replacing the env pointer and passing
  221.     control along to the desktop, the resident portion of GEMENV never
  222.     executes anything again; it just sits there providing a data area for
  223.     everyone else.  In this sense, GEMENV is a passive TSR that is unlikely
  224.     to interfere with anything else in the system.
  225.  
  226.     Also note that there are other programs in the world that use the
  227.     exec_os vector.  Foremost among these are the replacement desktop
  228.     programs that install themselves in place of the GEM desktop.  Because
  229.     a replacement desktop truly steals the exec_os vector (rather than
  230.     borrowing it and then jumping through it as GEMENV does), it may be
  231.     necessary to play with the order of the files in your AUTO folder a bit
  232.     to ensure that GEMENV can briefly gain control of the system.  In
  233.     general, if GEMENV reports successfull installation while AUTO stuff is
  234.     running, and then complains about no root env data when you run it from
  235.     the desktop, try rearranging your AUTO folder.
  236.  
  237.  
  238. Programming Notes
  239.  
  240.  
  241.     It was mentioned earlier that your programs can't modify the system env
  242.     data because they are really only modifying their own local copy of the
  243.     env data when the putenv() function is used.  Your programs can,
  244.     however, use the same technique that GEMENV uses to modify the main
  245.     system env data area.
  246.  
  247.     This techique involves locating the root data area via the ENV$ cookie,
  248.     then accessing that memory directly.  I'm not going to go into a long
  249.     discussion of using the cookie jar; see the appropriate Atari docs for
  250.     info on how to locate the ENV$ cookie.  The value of the ENV$ cookie is
  251.     a 32-bit pointer to the following data structure:
  252.  
  253.          struct gemenv_control {
  254.             long    magic;
  255.             short   version;
  256.             char    *pdata;
  257.             long    sdata;
  258.             long    reserved[4];
  259.          };
  260.  
  261.     The 'magic' field must contain the value 0x04021959.  If it does not,
  262.     someone else is also using ENV$ as a cookie, and you found them, not
  263.     GEMENV.  In this case, just keep searching, you may find another ENV$
  264.     cookie that points to the right magic value.
  265.  
  266.     The version word is the installed GEMENV version, encoded as 0xVVRR,
  267.     where VV is the major version and RR is the release.  The current v1.1
  268.     value is 0x0101.
  269.  
  270.     The pdata field is the pointer to the root env data area.  It is this
  271.     pointer that you would use to access the env vars directly.  (But,
  272.     NEVER EVER modify this pointer!  (Or, for that matter, anything else in
  273.     this structure.)  Doing so will break GEMENV, and it will NOT cause the
  274.     desktop to see a new set of env vars; that can only be done via the
  275.     exec_os hook.)
  276.  
  277.     The sdata field is the size of the root env data area.  If you modify
  278.     the root area, you must ensure that the modifications don't exceed this
  279.     size.
  280.  
  281.     The reserved array is just that: reserved.  Right now, this will be
  282.     four longwords of zeroes.  Someday, I'm going to provide a programmatic
  283.     interface so that you don't have to manipulate the root data directly
  284.     but can call gputenv() and ggetenv() to access the global data instead
  285.     of your program's local copy.  When I do that, the vectors for the
  286.     functions will go here.
  287.  
  288.  
  289.  
  290. Credits and Disclaimers
  291.  
  292.  
  293.     I'd like to thank Mike Dorman for helping me test this program, and Bob
  294.     Goff for both testing, and for obtaining the Atari docs on the cookie
  295.     jar for me.  I'd like to thank David Stabb for inspiring the program,
  296.     although I'm sure that by now he's quite forgotten how or why he was
  297.     inspirational in this project. :-)
  298.  
  299.     This program, the executable code, documents, and source code are all
  300.     in the public domain, and the author specifically releases any and all
  301.     rights associated with it.  You are free to modify and/or use this work
  302.     in any way you see fit.  You may include or distribute this work as a
  303.     part of your own product or program, be it public domain, shareware, or
  304.     commercial.  If you incorporate this into your own product, there is no
  305.     need to include any reference to me or my work on it unless you feel
  306.     like it.  I just want to see it distributed widely, and I want to see
  307.     ST applications start to make better use of environment variables.
  308.  
  309.     This software is delivered on an as-is basis, and no warranties are
  310.     made, including warranty of suitability for a particular purpose.  The
  311.     author assumes no responsibility for the consequences of using this
  312.     software, even if the consequences result from defects in this
  313.     program.  Besides, I don't have enough money to make suing me worth
  314.     your while. :-)
  315.  
  316.  
  317.     Ian Lepore
  318.     moderator, BIX atari.st and c.language conferences
  319.     07/19/91
  320.  
  321. --------------------------------------------------------
  322.                    < OK TO PORT >
  323. This information comes from the atari.st conference 
  324. on BIX (r), the BYTE Information Exchange.
  325.  
  326. For additional information about BIX, call 800-227-2983
  327. or 603-924-7681.
  328. ---------------------------------------------------------
  329.  
  330.