mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15071 87f5fb63-7c3d-0410-a384-fd976d0f7a62
422 lines
16 KiB
C
422 lines
16 KiB
C
/*
|
|
* $Id: dos.h,v 1.14 2005-11-27 09:51:45 obarthel Exp $
|
|
*
|
|
* :ts=4
|
|
*
|
|
* Portable ISO 'C' (1994) runtime library for the Amiga computer
|
|
* Copyright (c) 2002-2005 by Olaf Barthel <olsen@sourcery.han.de>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* - Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* - Neither the name of Olaf Barthel nor the names of contributors
|
|
* may be used to endorse or promote products derived from this
|
|
* software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
****************************************************************************/
|
|
*
|
|
* Documentation and source code for this library, and the most recent library
|
|
* build are available from <http://sourceforge.net/projects/clib2>.
|
|
*
|
|
****************************************************************************/
|
|
*/
|
|
|
|
#ifndef _DOS_H
|
|
#define _DOS_H
|
|
|
|
/****************************************************************************/
|
|
|
|
/* The following is not part of the ISO 'C' (1994) standard. */
|
|
|
|
/****************************************************************************/
|
|
|
|
#ifndef _STDIO_H
|
|
#include <stdio.h>
|
|
#endif /* _STDIO_H */
|
|
|
|
/****************************************************************************/
|
|
|
|
#ifndef EXEC_LIBRARIES_H
|
|
#include <exec/libraries.h>
|
|
#endif /* EXEC_LIBRARIES_H */
|
|
|
|
#ifndef WORKBENCH_STARTUP_H
|
|
#include <workbench/startup.h>
|
|
#endif /* WORKBENCH_STARTUP_H */
|
|
|
|
/****************************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* The Workbench startup message passed to this program; this may be NULL
|
|
* if the program was started from shell instead.
|
|
*
|
|
* The variable name is set up to be __WBenchMsg to make it fit into the
|
|
* ISO 'C' standard context. It is redefined to WBenchMsg to make it
|
|
* compatible with the original Amiga program startup code which would
|
|
* refer to the variable under that name.
|
|
*
|
|
* It is recommended to access the Workbench startup message as part of your
|
|
* program's main() function, like this:
|
|
*
|
|
* int
|
|
* main(int argc,char ** argv)
|
|
* {
|
|
* struct WBStartup * wb_startup_message;
|
|
*
|
|
* if(argc == 0)
|
|
* wb_startup_message = (struct WBStartup *)argv;
|
|
* else
|
|
* wb_startup_message = NULL;
|
|
*
|
|
* ...
|
|
* }
|
|
*
|
|
* This approach has the advantage that your program does not rely upon a
|
|
* global variable initialized by the startup code, whose name you might
|
|
* not even know exactly.
|
|
*/
|
|
extern struct WBStartup * __WBenchMsg;
|
|
#define WBenchMsg __WBenchMsg
|
|
|
|
/****************************************************************************/
|
|
|
|
/* This is filled in with a pointer to the name of the program being run. */
|
|
extern char * __program_name;
|
|
|
|
/****************************************************************************/
|
|
|
|
/* Set this to FALSE to disable all Ctrl+C checking in the program. */
|
|
extern BOOL __check_abort_enabled;
|
|
|
|
/*
|
|
* You can replace this function with your own and perform your own
|
|
* Ctrl+C checking.
|
|
*/
|
|
extern void __check_abort(void);
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* Call this function to set up the environment information for your
|
|
* program to access its data. This is typically used in Task or Process
|
|
* functions, as launched from the main program.
|
|
*
|
|
* Note: this function is unavailable for residentable programs and may
|
|
* not be available for PowerPC programs.
|
|
*/
|
|
extern void geta4(void);
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* Read and modify the current value of register A4; helpful for
|
|
* programs which are residentable, yet need to be able to pass the
|
|
* context information around A4 points to.
|
|
*
|
|
* Note: this function may not be available for PowerPC programs.
|
|
*/
|
|
extern unsigned long __get_a4(void);
|
|
extern void __set_a4(unsigned long value);
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* Obtain the low level 'file' handle or socket ID bound to a file
|
|
* descriptor. This function returns 0 for success and non-zero
|
|
* otherwise (if, for example, the file descriptor value you
|
|
* provided is not valid; errno will be set to the appropriate
|
|
* error code, too). Put a pointer to the file handle variable you
|
|
* want to be filled in into the second parameter to this function.
|
|
*/
|
|
extern int __get_default_file(int file_descriptor,long * file_ptr);
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* If your program is intended to be launched by the Internet superserver
|
|
* (inetd) to run as a daemon, receiving and sending data through a network
|
|
* connection set up for it, declare the following variable in your program
|
|
* and set it to TRUE. This will make the program's network startup code
|
|
* link the stdin/stdout/stderr streams with the daemon socket passed to it.
|
|
* Whether or not your program is running as a daemon can be tested by
|
|
* checking the global __is_daemon variable described below.
|
|
*/
|
|
extern BOOL __check_daemon_startup;
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* This will be set to TRUE if the current program was launched from
|
|
* the internet superserver ('inetd') or an equivalent facility. Note
|
|
* that you need to have set __check_daemon_startup to TRUE before
|
|
* you can rely upon __is_daemon to be initialized correctly.
|
|
*/
|
|
extern BOOL __is_daemon;
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* If the library is built with memory debugging features enabled,
|
|
* the following variable controls whether memory allocated, to be
|
|
* released, will actually get released. If set to TRUE all memory
|
|
* allocations will persist until the program exits.
|
|
*/
|
|
extern BOOL __never_free;
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* Before memory is allocated, a quick check can be performed in order
|
|
* to avoid draining so much system memory that both the operating system
|
|
* and application software becomes unstable. This test checks for the
|
|
* largest available block of memory, which has to be larger than a
|
|
* threshold value for the memory allocation to proceed. That size
|
|
* can be configured here. It defaults to 0, which means that no test
|
|
* is performed. If this feature is enabled, a minimum threshold value
|
|
* of 250000 bytes is recommended.
|
|
*/
|
|
extern ULONG __free_memory_threshold;
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* The following section lists variables and function pointers which are used
|
|
* by the startup code right after the program is launched. These variables are
|
|
* looked up before your program's main() function is invoked. Therefore, you
|
|
* would have to declare these variables in your program's data section and have
|
|
* them initialized to certain well-defined values to get the desired effect.
|
|
*/
|
|
|
|
/*
|
|
* The minimum required operating system version number is 37, which
|
|
* corresponds to Workbench/Kickstart 2.04. You may request a higher
|
|
* version number by defining the following variable; if you do so,
|
|
* please provide a fitting error message, too. Note that you cannot
|
|
* request a minimum version number lower than 37.
|
|
*/
|
|
extern int __minimum_os_lib_version;
|
|
extern char * __minimum_os_lib_error;
|
|
|
|
/*
|
|
* If your program is launched from Workbench it will not necessarily
|
|
* have a window to send console output to and from which console
|
|
* input can be read. The startup code attempts to set up such a console
|
|
* window for you, but it uses defaults for the window specification.
|
|
* These defaults can be overridden by your program if you define a
|
|
* variable to point to the specification string. Note that if you
|
|
* request a specific window specification, this will also override
|
|
* any tool window definition stored in the program's icon.
|
|
*/
|
|
extern char * __stdio_window_specification;
|
|
|
|
/*
|
|
* If set to TRUE, your program's process->pr_WindowPtr will be set to -1
|
|
* when it starts. The process->pr_WindowPtr will be automatically restored
|
|
* to the initial value before it exits.
|
|
*/
|
|
extern BOOL __disable_dos_requesters;
|
|
|
|
/*
|
|
* If set to TRUE, your program will disconnect itself from the shell it was
|
|
* launched from and keep running in the background. This service is unavailable
|
|
* for residentable programs. Note that you should not use this feature for
|
|
* programs which are supposed to be launched by the internet superserver.
|
|
* Also, note that when a program is run in the background, its input and
|
|
* output streams will be connected to NIL:.
|
|
*/
|
|
extern BOOL __detach;
|
|
|
|
/*
|
|
* If this function pointer is not NULL, it must point to a function which
|
|
* figures out whether the program should detach itself from the shell it
|
|
* was launched from. The function return value replaces the value of the
|
|
* __detach variable.
|
|
*
|
|
* At the time this function is invoked, dos.library and utility.library
|
|
* have already been opened for you.
|
|
*/
|
|
extern BOOL (* __check_detach)(void);
|
|
|
|
/*
|
|
* If this pointer is not NULL, it refers the name that will be given to
|
|
* the process which is created when the program detaches. The default
|
|
* is to reuse the program name instead.
|
|
*/
|
|
extern char * __process_name;
|
|
|
|
/*
|
|
* This variable controls the task priority of the program, when running.
|
|
* It must be in the range -128..127 to be useful. By default, the task
|
|
* priority will not be changed.
|
|
*/
|
|
extern int __priority;
|
|
|
|
/*
|
|
* This variable can be set up to contain the minimum stack size the program
|
|
* should be launched with. If the startup code finds that there is not enough
|
|
* stack space available to start with, it will attempt to allocate more and
|
|
* then proceed to run your program.
|
|
*
|
|
* If this variable is set to 0 (the default) then no stack size test will
|
|
* be performed upon startup.
|
|
*/
|
|
extern unsigned int __stack_size;
|
|
|
|
/*
|
|
* If this function pointer is not NULL, it must point to a function which
|
|
* figures out how much stack space is required to run the program. The
|
|
* function return value replaces the value of the __stack_size variable
|
|
* if it is not equal to zero.
|
|
*
|
|
* At the time this function is invoked, dos.library and utility.library
|
|
* have already been opened for you.
|
|
*/
|
|
extern unsigned int (* __get_default_stack_size)(void);
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* This library falls back onto locale.library to perform string collation
|
|
* in strcoll(), character conversion in toupper() and various other
|
|
* functions. This may not your intention. To restrict the library to use
|
|
* only the "C" language locale, declare the following variable in your
|
|
* code and set it to FALSE, so that it overrides the default settings.
|
|
* The variable value is checked during program startup and, if set to
|
|
* TRUE, has the effect of opening locale.library and obtaining the
|
|
* default locale.
|
|
*/
|
|
extern BOOL __open_locale;
|
|
|
|
/*
|
|
* Two functions control how this library uses the locale.library API to
|
|
* perform string collation, character and time conversion, etc.
|
|
*
|
|
* __locale_init() opens locale.library and attempts to open the default
|
|
* locale. If it succeeds, it will return 0 and -1 otherwise.
|
|
*
|
|
* __locale_exit() releases the default locale and closes locale.library.
|
|
*/
|
|
extern int __locale_init(void);
|
|
extern void __locale_exit(void);
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* If linked with -lunix, Unix path names are translated to Amiga path
|
|
* names (and the other way round). If you wish to disable this, set the
|
|
* following variable to FALSE. Only the path name translation is affected
|
|
* by setting this variable to FALSE. You will always get Unix-like behaviour
|
|
* from certain functions regardless of whether the path names are translated
|
|
* or not.
|
|
*/
|
|
extern BOOL __unix_path_semantics;
|
|
|
|
/****************************************************************************/
|
|
|
|
/* A data structures used by the path translation routines below. */
|
|
struct name_translation_info
|
|
{
|
|
char substitute[MAXPATHLEN];
|
|
char * original_name;
|
|
int is_root;
|
|
};
|
|
|
|
/****************************************************************************/
|
|
|
|
extern int __translate_relative_path_name(char const ** name_ptr,char *replace,size_t max_replace_len);
|
|
extern void __restore_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
|
extern int __translate_amiga_to_unix_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
|
extern int __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translation_info * nti);
|
|
extern int __translate_io_error_to_errno(LONG io_error);
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* Routines for use with shared libraries: invoke __lib_init() in your own
|
|
* shared library initialization function and __lib_exit() in your shared
|
|
* library cleanup function.
|
|
*
|
|
* __lib_init() will initialize the global SysBase/DOSBase variables
|
|
* (and the IExec/IDOS variables for OS4) and invoke the constructor
|
|
* functions required by your library code. It returns FALSE upon
|
|
* failure and TRUE otherwise. Make this the very first function you
|
|
* call in your shared library initialization function. The __lib_init()
|
|
* function expects to be called with a pointer to the exec.library
|
|
* base, which is normally passed to your shared library as part of the
|
|
* library startup code initialization performed by the operating
|
|
* system.
|
|
*
|
|
* __lib_exit() will undo all the initializations performed by the
|
|
* __lib_init() function, but leave the global SysBase variable
|
|
* (and the IExec variable for OS4) intact. Make this the very last
|
|
* function you call in your shared library cleanup function.
|
|
*
|
|
* Note that neither __lib_init() nor __lib_exit() are reentrant. You must
|
|
* make sure that while you are calling them no other library user can
|
|
* call them by accident.
|
|
*
|
|
* Both functions are only available as part of the thread-safe clib2
|
|
* linker library.
|
|
*/
|
|
extern VOID __lib_exit(VOID);
|
|
extern BOOL __lib_init(struct Library * SysBase);
|
|
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* The following variables are part of libnet.a, which provides for
|
|
* a BSD-Unix-like socket networking API. Traditionally, only one process
|
|
* at a time may use the underlying bsdsocket.library base, but with a
|
|
* multithreaded application you may want all of them to share the same
|
|
* library base. As of this writing there is one single TCP/IP stack which
|
|
* supports this feature (Roadshow) and it must be enabled early on. If
|
|
* this worked out well you can test through the following variable which
|
|
* will be set to TRUE:
|
|
*/
|
|
extern BOOL __can_share_socket_library_base;
|
|
|
|
/*
|
|
* The next global variable is also part of the thread-safe libnet.a and
|
|
* indicates that the TCP/IP stack will call the functions __set_errno()
|
|
* and __set_h_errno() when it modifies the global errno and h_errno
|
|
* variables, respectively. If you want to save the error codes for each
|
|
* of the Processes in your multithreaded application then you should
|
|
* override these functions with your. The following variable will be
|
|
* set to TRUE if the __set_errno() and __set_h_errno() functions will
|
|
* be used to change the corresponding variables:
|
|
*/
|
|
extern BOOL __thread_safe_errno_h_errno;
|
|
|
|
/****************************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
/****************************************************************************/
|
|
|
|
#endif /* _DOS_H */
|