home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / c / ixemlib9.lha / README < prev    next >
Text File  |  1992-03-17  |  32KB  |  697 lines

  1. Markus M. Wild                             March 16, 1992
  2.  
  3. This  is  the  second public release of my shared library, that should make
  4. porting  programs  originally  written to be run on a **IX/BSD system to be
  5. much easier on the Amiga computer running AmigaDOS.
  6.  
  7. ---------------------------------------------------------------------------
  8.             COPYRIGHT restrictions
  9.  
  10. The  source  code  shipped  with this library is subject to the GNU LIBRARY
  11. GENERAL PUBLIC LICENSE, please look at the file COPYING.LIB that comes with
  12. this distribution.  If not, write to the
  13.   Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14.  
  15. NOTE:   
  16. There  are  lots  of  files  subject to  other Copyrights, especially those
  17. Copyright  by the Regents of the University of California.  In those cases,
  18. the  specified  Copyright restriction applies TO EACH SUCH SINGLE FILE, but
  19. not the arrangement of putting it in this library.  With this restriction I
  20. want to enforce consistency of this library.
  21.  
  22. After reading the COPYING.LIB file, you'll notice, that a program that just
  23. uses the library by using OpenLibrary(), and calling functions in it, is to
  24. be  considered  as  a  `work that uses the Library', and 5.  of COPYING.LIB
  25. says  for this case:  " Such a work, in isolation, is not a derivative work
  26. of the Library, and therefore falls outside the scope of this License."
  27.  
  28. Since  I  declare  the  glue  functions  created  by  compiling and running
  29. gen_glue.c  (in lib/) to be in the Public Domain (thus not to be covered by
  30. any  license),  your  compiled  and  linked  executable  will  NOT become a
  31. derivative  of  the  library, and will thus not be subject to this license.
  32. Thus,  you  may  use  the  compiled version of the glue files and the stdio
  33. functions,  libc.a (except alloca.c, please see the copyright notice in its
  34. header.   Use  the  builtin alloca() (__builtin_alloca() to be explicit) in
  35. all  situations  where this is possible) and crt0.o in a commercial product
  36. without  making  it a derivative of the library and thus make it subject to
  37. the   library   license.   However,  you  must  tell  your  customers  that
  38. ixemul.library  is  free software according to this license, and where they
  39. can get a copy of its source code.
  40.  
  41. ---------------------------------------------------------------------------
  42.  
  43. Now that the legal stuff is over, some comments to this library.
  44.  
  45.  
  46.  
  47. *** note to upgraders (that is, people who already worked with the previous
  48. *** versions): The following text is the (slightly edited) README file of
  49. *** the previous version. If you decide to skip to the really new stuff, you
  50. *** might miss important information of things that have changed, so if at
  51. *** all possible read the first part as well! 
  52.  
  53.  
  54.  
  55. 68000 users, take care!
  56. =======================
  57.  
  58. I tried to be fully 68000 compatible (this is important in the signal
  59. code), but since I don't have a 68000 equipped Amiga anymore, I can't test
  60. whether the library really works under this environents.  Please tell me,
  61. if you encounter problems!  Since this is the second library release,
  62. chances are high that most things should work, as I did extensive bugfixing
  63. in this area over the past months.  The warning still holds though, I just
  64. *can't* test this compatibility issue myself!
  65.  
  66. I always wanted a library, that would emulate as much as possible of a
  67. **IX/BSD environment on the Amiga, so that programs (usually programming
  68. tools) written for **IX/BSD could be ported in a quick and straight forward
  69. way to the Amiga.  I guess the library accomplishes this goal fairly well.
  70.  
  71.  
  72.  
  73. What it is and what it isn't
  74. ============================
  75.  
  76. The design of the library was therefore guided towards **IX/BSD
  77. compatibility, and *not* :
  78.  o to be too conservative with resources 
  79.  o to be particularly conformant to Amiga habits. Thus if I had to decide
  80.    whether I should make a function act more like an Amiga function or
  81.    more like a **IX/BSD one, I decided for the latter. As an example:
  82.    _cli_parse() does wildcard expansion, and tries to apply more or less
  83.    **IX/BSD shell semantics to an argument line, it doesn't call
  84.    ReadArgs().
  85.    The types used in my own source code are all from sys/types.h (except
  86.    BPTR). I don't think capitalized identifiers should be used for typedef'd
  87.    types. According to C-conventions, anything written in captials should
  88.    be `#undef'inable, which typedefs aren't. Thus if you write contributions
  89.    to be included into the official distribution of this library, code
  90.    according to this. Use `u_char' and not UBYTE, etc. I don't care that
  91.    this is against the Commodore coding standard, this is my code, and
  92.    I decide what I like and what not.
  93.  o to be particularly suited for inclusion into a shared library, although
  94.    most things *are* shared now. What I'd really want for the Amiga is 
  95.    the concept of a dynamic linker.
  96.  
  97. On the other hand, it should be:
  98.  o expandable. As an example, a file descriptor already can refer to `real'
  99.    files, directories, memory buffers treated as files. I plan to add 
  100.    sockets in some next release (Commodore: please get out some examples 
  101.    on how to use SANA-II stuff, so my sockets can be compatible!)
  102.  o patchable. If you want some function to behave differently, you can
  103.    SetFunction() it, and the rest of the library should use your new entry.
  104.    NOTE: I used this only for major functions, that may reasonably change. 
  105.      I didn't call functions like strcmp(), strlen(), bcopy() that way for
  106.          efficiency reasons (and my lazyness to change the whole string/
  107.          and other libraries;-)))
  108.    This version doesn't particularly follow this goal very well, mostly
  109.    stdio is still the original BSD code, and doesn't use syscall()...
  110.  
  111.  
  112.  
  113. Difference to `usual' Amiga shared libraries
  114. ============================================
  115.  
  116. The library is designed to be used by C, and not by assembly.  So
  117. parameters are passed on the stack rather than in registers.  This also
  118. means that there is no `fd' file, and you can't use any current library
  119. call  pragmas  to  access  its  functions.   Recall  though,  that  calling
  120. functions  of  ixemul.library  inline  will  not  result  in  an  order  of
  121. improvement  as  calling  standard  library  functions  inline.   The  glue
  122. functions  don't have to shuffle arguments from and to the stack, they just
  123. do a jump over the base table and are therefore very short and very fast.
  124.  
  125. I provided revision control in the startup code. Thus if you get a program
  126. written for a newer revision of the library than you currently have, a 
  127. warning requester tells you about this, you can still use the program though.
  128. I don't believe in bumping up the version counter because of every small 
  129. improvement. Bumping up the version means you can't use any older versions at
  130. all. Bumping up the revision just gives you an annoying requester (and
  131. perhaps an `illegal action' trap though..) that you should upgrade.
  132.  
  133. As some kind of replacement for an fd file I use the <sys/syscall.def> file,
  134. which is a symbolic link to `library/syscall.def' in the source directory.
  135. It contains lines of the form
  136.   SYSTEM_CALL (name_of_call, entry_number)
  137. Where `name_of_call' is the name you'd use in a C program using the library
  138. (for example write, abort, unlink, etc), and `entry_number' gives the number
  139. of the system call used in syscall(). You can convert this number into
  140. a more common _LVO for the Amiga by doing:
  141.   _LVO = -6*(entry_number + 4)
  142.  
  143. For examples how <sys/syscall.def> can be used, look at <sys/syscall.h>,
  144. `library/start.s' and `lib/gen_glue.c'.
  145.  
  146.  
  147.  
  148. Where to use it
  149. ===============
  150.  
  151. Libc.a should be the one and only C library you need to get most of your
  152. programs linked correctly with the GNU CC compiler.  For some math-
  153. oriented stuff you'll also need a math library, libm.a (the BSD math
  154. library) should be suited fine for this. Just link with `-lm'.
  155.  
  156.  
  157.  
  158. If you want to recompile
  159. ========================
  160.  
  161. I provided Makefiles for the most directories (for all by now ?).  Those
  162. Makefiles assume a decent Make tool, I'm currently using a version (hacked
  163. for the Amiga) of DMake (not the one from Matt Dillon, sources are on
  164. wuarchive.wustl.edu), you'll have to rewrite the Makefiles if you don't use
  165. DMake, as the .LIBRARY feature seems to be unique, other `make's use other
  166. techniques to accomplish the same goal, if they support it at all.
  167.  
  168. Sources are written for compilation by GCC. You might be able to compile
  169. 95% of them with any ordinary ANSI-C compiler, but there are cases where
  170. you have to change things for non-GCC environments (mostly asm() situations).
  171.  
  172. For recompilation, see also the following comments in `How complete are the
  173. headers'.
  174.  
  175. To regenerate libc.a, cd into lib/ and type `make'.  Then cd into `glue',
  176. enter `/gen_glue', and wait for it to finish (can take quite some time, it
  177. has to create more than 400 files !).  Then `make' in this directory and cd
  178. back to lib/.  You may now (cross your fingers and) type `make libc.a', and
  179. if you have sksh configured as system shell, libc.a should now be built
  180. automatically.  If something doesn't work, look at the Makefile and do it
  181. manually ;-)
  182.  
  183. As an explanation to the separate compilation of crt0.o:  this has to be
  184. compiled with `-fwritable-strings', since you have to be sure that ENTRY()
  185. is the first thing in the generated object file.  If you don't specify
  186. `-fwritable-strings', you'll get string constants at the first executable
  187. address in your programs, and this will get you (and your computer) into
  188. meditation if you try to execute such programs ;-))
  189.  
  190. To regenerate ixemul.library, cd into string/, gen_library/, stdlib/,
  191. gnulib/, gnulib20/, stdio_2/ and at last library/, and type `make'.  At the
  192. end, you should get a current version of ixemul.library.
  193.  
  194. Note: the library is currently compiled in a way that makes it easy for me
  195. to have a debugged version or not, ie. the debugging statements stay in
  196. the code, but the kprintf() function is either linked with the library
  197. to get a debugging version, or stubbed out to get a working version. When the
  198. library gets more stable, parts of it can be compiled by inlining code
  199. to the library, instead of going thru syscall().
  200.  
  201.  
  202.  
  203. If you want to write code that uses the library
  204. ===============================================
  205.  
  206. Code like you would on a **IX/BSD system, thus DON'T USE any information
  207. private to the library, especially don't use any information that
  208. tc_TrapData points to.  This data is subject to change in every release of
  209. the library, and you may only access its variables thru library access
  210. functions!  This restriction fully applies as well to applications that
  211. SetFunction() some functions of the library.  So if you for example write
  212. your own memory allocation functions, you may NOT use the space the library
  213. malloc() function uses for your own purpose.  I may decide in a later
  214. release of the library to use a different malloc() implementation that
  215. uses different data in the user area, and then your code almost certainly
  216. would trash innocent variables!
  217.  
  218.  
  219.  
  220. How complete are the headers
  221. ============================
  222.  
  223. The header files distributed in `include/' are all you need - except the 
  224. Amiga specific header files copyright by Commodore-Amiga. You either have
  225. to get them from a commercial compiler, or order them from CATS.
  226. If you don't intend to compile Amiga specific programs, you don't need
  227. those headers at all.
  228.  
  229. You need to make one change to one of those Amiga headers to avoid
  230. duplicate definition of a datatype:
  231.  
  232. The <devices/timer.h> file includes the following definition:
  233.     struct    timeval    {
  234.         ULONG tv_secs;
  235.         ULONG tv_micro;
  236.     };
  237. Please comment this definition out, and add 
  238.     #include <sys/time.h>
  239. somewhere at the beginning of the file, and instead of the above definition,
  240. put
  241.     #define tv_secs  tv_sec
  242.     #define tv_micro tv_usec
  243. That way, you can use the timeval structure defined in <sys/time.h> as well
  244. as the one defined in <devices/timer.h>. The structures are identical, but
  245. the field names are not (sigh..).
  246.  
  247.  
  248. I included more or less all headers from 4.3BSD-net2, except those that 
  249. refer to really **IX/BSD specific material in the kernel. I included more
  250. headers that are currently used and supported, just to make life easier for
  251. people using **IX/BSD sources under AmigaDOS. Among the things not supported
  252. currently are networking (sockets) and process management (fork, eg).
  253. Signals on the other hand *are* implemented, see the special section for
  254. restrictions.
  255.  
  256.  
  257.  
  258. How BSD signals are implemented
  259. ===============================
  260.  
  261. I tried to implement as much of Berkeley style signals as possible on the
  262. Amiga. This includes a trap handler as well as an asynchronous signal 
  263. facility. The one thing not implemented are interruptable system calls.
  264. Since there are no `real' system calls on the Amiga (ie. no calls that are
  265. executed in Supervisor mode), those calls cannot normally be interrupted,
  266. ie. forced to return to their caller. So all functions except sigpause()/
  267. sigsuspend() will return to where they were interrupted if a signal 
  268. occurs.
  269.  
  270. These 32 new signals are 32 really new signals, not tied to any of the 32
  271. Amiga signals provided by Exec.  The one exception is SIGBREAKB_CTRL_C,
  272. which is by default bound to generate a SIGINT.
  273.  
  274. Signal handlers are called with the following arguments:
  275.   void 
  276.   signal_handler (int signo, int code, void *address, struct sigcontext *sc)
  277.  
  278. Where
  279.   signo:  is the signal number that occured, see <signal.h>
  280.   code:   is a more specific characterization of signo available with some
  281.       signals. It is available with all signals that are generated
  282.       because of a processor exception, and then contains the format
  283.       identifier of the exception frame (this is correct even for the
  284.       68000, where such an identifier is faked, ie. it doesn't really
  285.       exist). Thus a `division by zero' exception would be invoked by
  286.         signal_handler (SIGFPE, 0x2014, address, sc)
  287.   address:address referrs to the instruction that caused the signal.
  288.   sc:     please don't use sc, as it may change in the future. It contains
  289.       the context to restore after the signal handler returns.
  290.  
  291. ***************************************************************************
  292. If you use signals in your own code, make sure that you never allow a 
  293. situation, where when your program is interrupted resources stay allocated!
  294. ***************************************************************************
  295.  
  296. That is, the following example is BAD :
  297.     ..
  298.     fh = Open ("foobar", MODE_OLDFILE);
  299.     if (fh)
  300.       {
  301.         .. do something with it ..
  302.         Close (fh);
  303.       }
  304.  
  305. If your program is interrupted and terminated after you got your file handle,
  306. `fh' will never be closed! There are two sollution to get around this problem,
  307. either use library functions from ixemul.library, or explicitly mask signals
  308. while you have resources locked. Thus in this example, either do:
  309.  
  310.     fd = open ("foobar", O_RDWR);
  311.     if (fd >= 0)
  312.       {
  313.         .. do something with it ..
  314.         close (fd);
  315.       }
  316.  
  317. in that case the library will do resource tracking on fd. Or explicitly mask
  318. the signals:
  319.  
  320.     omask = sigsetmask (~0);    /* mask all signals */
  321.     fh = Open ("foobar", MODE_OLDFILE);
  322.     if (fh)
  323.       {
  324.         .. do something with it ..
  325.         Close (fh);
  326.       }
  327.     sigsetmask (omask);        /* reset the mask */
  328.  
  329. Note that the second sollution is worse than the first one, because the
  330. user may send the process a non-maskable signal that would terminate the
  331. process unconditionally (SIGKILL does this), and don't forget that the user
  332. isn't able to break your program as long as you have signals masked!
  333.  
  334. Ixemul.library does resource tracking on all file-related functions (create(),
  335. open(), dup(), pipe()) and on memory allocations thru malloc() and realloc().
  336. Thus if you use those functions instead of dos.library and exec.library 
  337. functions, you don't need any clever resource tracking stuff to do on your
  338. own, that's what the library is for ;-)
  339.  
  340. If you use Amiga specific resources like Windows and Screens from
  341. Intuition, make sure to add an atexit() handler to close those resources,
  342. if the user should decide to interrupt your program.  Before the program is
  343. left, the chain of registered atexit-handlers is called in exit().  So
  344. PLEASE NEVER EVER call _exit() if you have registered any custom atexit()
  345. handlers.  It is a bad habbit anyway, but normally you may call _exit()
  346. without resource lossage (stdio won't flush its buffers, but that's about
  347. all), as long as you close ixemul.library after use, and this IS A MUST, as
  348. for every Amiga shared library anyway.
  349.  
  350. I provided a new unique Amiga specific signal called SIGMSG. If you set up
  351. a handler for this signal, then
  352.  o  the default mapping from SIGBREAKB_CTRL_C into SIGINT will no longer
  353.     occur
  354.  o  your handler is called with the following arguments
  355.       signal_handler (SIGMSG, new_exec_signal_mask)
  356.  
  357. In this case, you have to deal with Exec signals yourself, so don't forget
  358. to clear those signals that you want to receive notification about again
  359. later. 
  360. Thus if you'd want to handle SIGBREAKB_CTRL_C yourself, don't forget to
  361.  
  362.   SetSignal (0, SIGBREAKF_CTRL_C)
  363.  
  364. at the end of the handler, or you'll never get notification about that
  365. signal again.
  366.  
  367.  
  368. If your program is interrupted by a signal and the default action of that
  369. signal is to terminate your program, and you didn't set up a handler to deal
  370. with that signal, your program is terminated by calling `exit (128 + signo)'.
  371. There are no core-dumps yet, I first have to think about a useful format
  372. for a debugger that takes care of the Amiga's memory architecture.
  373.  
  374.  
  375. The signal implementation uses some of the Berkeley kernel sources of the
  376. 4.3BSD-reno release for the hp300. I didn't disable everything that isn't
  377. implemented currently, so you might face strange behavior if you currently
  378. try to send a SIGSTOP to a process using the library, you better not ;-))
  379.  
  380. Currently supported are the following signals:
  381.   SIGINT:    bound to ^C (SIGBREAKB_CTRL_C) unless there is a SIGMSG handler
  382.   SIGILL:    generated by some hardware exceptions
  383.   SIGFPE:    generated by some hardware exceptions
  384.   SIGBUS:    generated by some hardware exceptions
  385.   SIGALRM:   if you use alarm() or the ITIMER_REAL interval timer
  386.   SIGVTALRM: if you use the ITIMER_VIRTUAL interval timer
  387.   SIGPROF:   if you use the ITIMER_PROF interval timer
  388.   SIGMSG:    if you provide a signal handler for it
  389.   SIGCHLD:   a vfork()'d child died (or stopped ?;-))
  390.   SIGSEGV:   the programs used more stack than you allowed it to (see below)
  391.  
  392. more are to follow.  You may send any of the 32 signals to a process using
  393. the library with the `kill ()' function, the default behavior of a process
  394. is described in a **IX/BSD man page for signals.  As mentioned above,
  395. stopping a process isn't currently implemented, and may produce strange
  396. behavior...
  397.  
  398.  
  399.  
  400. Compatibility
  401. =============
  402. I tried to port some commonly used programs to the Amiga using this
  403. library. And the following programs were quite easy to port:
  404.  o patch
  405.  o GNU tar-1.10  (the first Amiga tar that knows about symlinks ;-))
  406.  o GNU find-2.2 (replace the fork,exec-stuff with a call to ssystem() )
  407.  o BSD ar, ranlib (with DMake even things like VPATH=../ar work ;-))
  408.  o GNU cc ;-))
  409.  o DMake 
  410.  o ...
  411. As a guideline, if you find stuff that uses fork,exec,wait stuff, try to
  412. replace it with a call to ssystem()/system().  system() corresponds to the
  413. usual **IX/BSD library function, it runs the argument thru the current
  414. shell.  ssystem() is some lower level execution function, that under 1.3
  415. uses ARPs SyncRun() function (that's where the name came from ;-)), and
  416. under 2.0 uses my own code to find the executable (searches the users
  417. PATH), and tries to do interpreter expansion on the file (the thing with #!
  418. rsp.  ;!  as the first two characters. Please see the `library/__load_seg.c'
  419. file for more details;-)).  
  420. Note for second version:  beginning support for vfork(), exec*() and wait()
  421. is provided, please use with care!
  422.  
  423.  
  424.  
  425. ***
  426. *** New stuff as of March 16, 1992
  427. ***
  428. ***************************************************************************
  429.  
  430.  
  431. The library got quite a bit larger, and executables using it get smaller
  432. and smaller ;-) This is mainly due to the fact that now stdio is included
  433. in the shared library, and no longer in the statically linked libc.a. Since
  434. I switched to the newest BSD stdio implementation, compatibility to older
  435. versions was no longer required, and you get additional functionality in
  436. the same run (setvbuf() for example). There is one compatibility problem
  437. though:
  438.  
  439. *************************************************************************
  440. Don't use the 1.40 libg++.a together with this new library, 1.40 libg++.a
  441. has intimate knowledge of the old stdio implementation, and won't work
  442. with this one (you'll probably get linktime errors, missing _iob). Use 
  443. the 2.0 libg++.a instead (soon on amiga.physik.unizh.ch as well).
  444. *************************************************************************
  445.  
  446. The main new thing is `ixconfig', which you find in the bin/ directory.
  447.  
  448.  
  449.  
  450. ixconfig
  451. ========
  452.  
  453. ixconfig is used to tailor the library to your requirements and/or 
  454. habits. Just running ixconfig without options prints the current settings,
  455. which look like this by default:
  456.  
  457.     1> ixconfig
  458.     Translate . and .., translate /, don't translate symlinks,
  459.     allow AmigaDOS notation, membuf size = 0,
  460.     red zone size = 0, stack watcher is disabled (and not active).
  461.  
  462. Here's an explanation of those settings:
  463. "translate . and .."    mapping of `a/./b/../c' into `a/b//c' is enabled
  464. "translate /"        mapping of `a///b' into `a/b' and `/device' into
  465.             `device:' is enabled. Note: You can't currently get
  466.             a directory of the virtual `/' directory this way.
  467. "translate symlinks"    apply `translate /' to contents of symlinks as well
  468. "AmigaDOS notation"    allow use of device names in the colon form 
  469.             (ie. sys: instead of /sys), and don't force `..'
  470.             notation.
  471. "membuf size"        if you set a non-zero value here, all files upto
  472.             that value, that are opened O_RDONLY are read
  473.             into memory, and read/seek operations occur in memory.
  474. "red zone size N"    size of `safety net'. If your program uses
  475.             so much stack, that the stack pointer is more
  476.             than N bytes near the stack bottom, your program
  477.             is sent a SIGSEGV signal. Red zone size is used
  478.             when starting a new process, if you change it later,
  479.             no already running processes are affected.
  480. "stack watcher"        global toggle. If disabled, no SIGSEGV signal is
  481.             sent to any program (but if red zone size is > 0,
  482.             the process keeps a pointer, so that if you reenable
  483.             the stack watcher, SIGSEGV will be sent again).
  484.             
  485. This was an explanation of the output of ixconfig, to change those values
  486. type `ixconfig -h' for an explanation on the available switches. One
  487. switch might need further explanation: `-s'. If you specify `-s', ixconfig
  488. goes to sleep after setting the new parameters, and won't return until you
  489. break it with ^C. This is the preferred switch if you run ixconfig from your
  490. startup-sequence in the background, as then your changes can't be undone by
  491. flushing the library (ixconfig keeps it open, so that Expunge() can't flush
  492. it).
  493.  
  494.  
  495.  
  496. Some notes to vfork() and friends
  497. =================================
  498.  
  499. **IX/BSD process management is one of the most nasty design differences
  500. between AmigaDOS ans **IX/BSD. `fork()' for example is hardly possible to
  501. implement on AmigaDOS, as it requires to create an identical copy of the
  502. parent process. This is only feasible with virtual memory, where processes
  503. can be mapped at equal places in memory. Under AmigaDOS this would have
  504. to be simulated by copying of stack and malloc'd data whenever a process
  505. is activated, and copying them to a safe place before it is disactivated.
  506.  
  507. This problem can be avoided, if the program to be run under AmigaDOS is
  508. only fork()ing, because it just wants to start another process. In that
  509. case, no such copying as described before is necessary, and BSD therefore
  510. invented the `vfork()' function, which works like `fork', but runs the 
  511. child on the parents memory segments (stack and malloc'd data). While the
  512. child is using the parents resources, the parent is sleeping in a not
  513. interruptible state. 
  514.  
  515. That much for theory;-) I tried to implement an as compatible as possible
  516. vfork() function, that behaves like the BSD one. This should work under
  517. any OS version, for Kickstart 1.3 the arp.library is used, starting with
  518. OS 2.0 dos.library is powerful enough to do it itself.
  519.  
  520. Since I won't try to implement `fork', I provided a possible alternative
  521. (you tell me;-)). As an extension, you get the `vfork_resume()' function,
  522. which causes the parent to resume, just like it would if you called 
  523. `_exit()' or one of the `exec*()' functions. Since this function is quite
  524. dangerous (and an even bigger hack than vfork() itself..), here's what's
  525. happening in `vfork_resume()':
  526.  
  527.   o  the child switches to its own stack. After vfork(), the child is
  528.      using the stack of the parent process. Since no two processes can
  529.      share the same stack in parallel, vfork_resume() causes a switch
  530.      to the `real' stack of the child.
  531.   o  the parent is sent a wakeup message.
  532.   o  both processes run concurrently
  533.  
  534. The first point is the most important one: Since vfork_resume() changes
  535. the stack pointer of the running process, you can't refer to any variables
  536. or parameters anymore after calling vfork_resume()! Only register
  537. variables survive such a call, and you have to explicitly store values
  538. in register variables that are subject to survive!
  539.  
  540. There's another potential problem with vfork_resume():
  541.  
  542. **************************************************************************
  543.   Don't exit() from the parent before all vfork()'d children have died!!
  544. **************************************************************************
  545.  
  546. Since exiting from the parent causes the parents code and data segments to
  547. be deallocated, the child would find itself without code space to run
  548. on, and would probably cause a severe machine crash!
  549.  
  550. So always call at least `wait (0)' before returning from the parent.
  551.  
  552.  
  553.  
  554. exec*()
  555. =======
  556.  
  557. In most cases, you just use `vfork()' to later overlay the process with 
  558. a new image, that is you want to start another program. The way AmigaDOS
  559. loads processes is not too well suited to do `exec' style program starting,
  560. yet it is possible, although with slight resource wasting.. 
  561.  
  562. First problem is, that all exec* functions pass an argument vector to
  563. the new program, whereas AmigaDOS programs expect to be passed an argument
  564. line (instead of the vector of arguments). Since in my opinion it would
  565. be a good thing if a program could get an argument vector directly (in that
  566. case the inherent problem of passing multi word arguments to a program would
  567. be finally solved, no more weird quoting needed!). That's why I provided
  568. a mechanism that allows this vector passing, and it works like this (look
  569. at crt0.c for a concrete implementation of this concept!):
  570.  
  571.   The program has to provide a magic header at the first executable location
  572.   in its code. This magic header looks like this:
  573.      o  JMP instruction to common AmigaDOS startup
  574.      o  struct exec area. Use the OMAGIC a_magic code.
  575.      o  provide an alternate entry vector in a_entry. execve() jumps thru
  576.         this vector to pass vectors to your program, instead of going
  577.         thru the normal AmigaDOS startup part.
  578.  
  579. As long as you use my crt0.o and libc.a, this whole thing is completely
  580. transparent to your program, you only have to care for it, if you want
  581. to support the mechanism in other languages as well.
  582.  
  583. The second problem is how to start `old' AmigaDOS programs from execve().
  584. If the program has the described magic header, starting is easy. Else 
  585. another approach is taken, depending on the OS version. Common to both
  586. OS versions (1.3 and 2.0) is redirection of stdin and stdout. Since the
  587. new program can't refer to the real file descriptors (I can't pass the
  588. open library without my startup code), I have to setup DOS fields to
  589. use my filehandles. This may succeed or not, depending on whether the
  590. descriptors in question are realized by DOS files or not (in the future
  591. a not-compatible alternative would be descriptors that refer to sockets!).
  592. Actual starting of the program is done with RunCommand() under 2.0, and
  593. some own hack under 1.3. If someone is interested to get this working
  594. well under 1.3, I'd be happy to include a better starter function, my
  595. kludge doesn't particularly deal graceful with BCPL functions...
  596.  
  597.  
  598.  
  599. Documentation to the provided functions
  600. =======================================
  601.  
  602. I'm a rather lazy guy, and I really hate it writing documentation ;-) 
  603. However, since the library is aimed at emulating as much of BSD as I could
  604. find (more to come ;-)), you can use BSD man pages in almost any situation.
  605. Such man pages can be ftp'd for example from wuarchive.wustl.edu, in
  606. unix/4.3bsd-reno/lib/libc. Look for */*.[1-9] files in that directory
  607. (a nicer way to obtain that information is to download the ls-lR file
  608. from the root, and than to use grep on your local machine!).
  609.  
  610.  
  611.  
  612. Quick guide to those that just want to use the library with GCC
  613. ===============================================================
  614.  
  615. If you're not particularly interested in how things are implemented,
  616. and just want an ANSI compliant C library with gcc, here's what you
  617. have to do.
  618.  
  619. o  unpack the archive (you probably did already ;-))
  620. o  you may delete the following directories, if you don't plan to
  621.    look at the implementation:
  622.      - gnulib/
  623.      - gnulib20/
  624.      - string/
  625.      - stdlib/
  626.      - gen_library/
  627.      - static_library/
  628.      - library/    (but first copy library/syscall.def into
  629.        include/sys/syscall.def, overwriting the symbolic link there!!!)
  630.      - libm/
  631. o  assign gcc: to the base directory, so that you can refer to the
  632.    include/ directory by `gcc:include', and to lib/ by `gcc:lib'.
  633. o  copy libs/ixemul.library into your system libs: directory, or add
  634.    the libs/ directory to LIBS: (only OS 2.0, creating a multi-assign for
  635.    LIBS:).
  636.  
  637. That's it, gcc should now work fine with this library!
  638.  
  639.  
  640.  
  641. What about inline/ headers for 2.0 functions ?
  642. ==============================================
  643.  
  644. I don't use 2.0 functions too often, and I didn't want to distribute
  645. header files I rarely use. The basic step to generate those files 
  646. automatically involves parsing of prototype files and fd files, and
  647. mixing the information together to generate a file of inline function
  648. definitions. Since my current parser is ways too hacky that I would ever
  649. distribute it, if someone else really wants inline headers supporting
  650. 2.0, write the necesssary tool yourself! You might want to contact me
  651. before starting work, so that not multiple people make the same effort
  652. at once.
  653.  
  654.  
  655.  
  656. Some final words
  657. ================
  658.  
  659. I wish you good luck using this library, it isn't that thoroughly tested
  660. yet, but I did manage to recompile gcc with itself using the library, so
  661. some basic reliability should be granted. But keep in mind:
  662.  
  663.     This library is distributed in the hope that it will be useful,
  664.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  665.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  666.     Library General Public License for more details.
  667.  
  668. New versions of the library will first be released on amiga.physik.unizh.ch
  669. in amiga/new, migrating to amiga/devel later.
  670.  
  671. If you like to contribute new functions to the library, please reread
  672. the `What it is and what it isn't' section, and if you think that your
  673. code contributes to those goals, I'd be very happy to include it in
  674. the library in a later release. 
  675. Since indentation style is a great deal a thing of personal taste, 
  676. I make up the following rules:
  677.  o if you change one of the existing files, follow the style of the
  678.    file
  679.  o if you provide a completely new set of functions, you're at your own.
  680.  
  681. If you find bugs in the code (I'm absolutely sure there are some...), please
  682. tell me about them!
  683.  
  684. I'd like to thank specially Michael B. Smith and Michael Bond, who
  685. contributed many bug reports and ideas for improvements, as well as all
  686. the other bug reporters, thank you!
  687.  
  688. Send your bug reports, enhancement requests and constructive remarks to
  689.  
  690.    <wild@nessie.cs.id.ethz.ch>   or   <wild@amiga.physik.unizh.ch>
  691.  
  692. send flames to <bitbucket@nessie.cs.id.ethz.ch> (but don't overflood
  693. nessie's /dev/null please ;-)).
  694.  
  695.  
  696. Markus M. Wild
  697.