2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A
2N/A/*
2N/A * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
2N/A */
2N/A
2N/A/*
2N/A * MKS header file. Defines that make programming easier for us.
2N/A * Includes MKS-specific things and posix routines.
2N/A *
2N/A * Copyright 1985, 1993 by Mortice Kern Systems Inc. All rights reserved.
2N/A *
2N/A * $Header: /rd/h/rcs/mks.h 1.233 1995/09/28 19:45:19 mark Exp $
2N/A */
2N/A
2N/A#ifndef __M_MKS_H__
2N/A#define __M_MKS_H__
2N/A
2N/A/*
2N/A * This should be a feature test macro defined in the Makefile or
2N/A * cc command line.
2N/A */
2N/A#ifndef MKS
2N/A#define MKS 1
2N/A#endif
2N/A
2N/A/*
2N/A * Write function declarations as follows:
2N/A * extern char *function ANSI((char *cp, int flags, NODE *np));
2N/A * Expansion of this happens only when __STDC__ is set.
2N/A */
2N/A#ifdef __STDC__
2N/A#define ANSI(x) x
2N/A#define _VOID void /* Used in VOID *malloc() */
2N/A#else
2N/A#define const
2N/A#define signed
2N/A#define volatile
2N/A#define ANSI(x) ()
2N/A#define _VOID char /* Used in _VOID *malloc() */
2N/A#endif
2N/A
2N/A#ifndef STATIC
2N/A# define STATIC static /* Used for function definition */
2N/A#endif /*STATIC*/
2N/A
2N/A#ifndef STATREF
2N/A# ifdef __STDC__
2N/A# define STATREF static
2N/A# else
2N/A# define STATREF /* Used in local function forward declaration */
2N/A# endif
2N/A#endif /*STATREF*/
2N/A
2N/A#define LEXTERN extern /* Library external reference */
2N/A#define LDEFN /* Define Loadable library entry */
2N/A
2N/Atypedef void (*_sigfun_t)(int);
2N/A
2N/A#include <mkslocal.h>
2N/A#include <stdio.h>
2N/A#include <unistd.h>
2N/A#include <limits.h>
2N/A#include <sys/stat.h> /* required for m_samefile() prototype. */
2N/A#include <m_wchar.h>
2N/A#include <m_i18n.h>
2N/A#include <m_invari.h>
2N/A
2N/A#if M_TFGETC || M_STTY_CC
2N/A#include <termios.h>
2N/A#endif
2N/A
2N/A#ifndef M_LIBDIR
2N/A # error "You must define M_LIBDIR in mkslocal.h"
2N/A#endif
2N/A
2N/A#ifndef M_ETCDIR
2N/A # error "You must define M_ETCDIR in mkslocal.h"
2N/A#endif
2N/A
2N/A#ifndef M_SPOOLDIR
2N/A # error "You must define M_SPOOLDIR in mkslocal.h"
2N/A#endif
2N/A
2N/A#ifndef M_MANPATH
2N/A # error "You must define M_MANPATH in mkslocal.h"
2N/A#endif
2N/A
2N/A#if defined(I18N) && !defined(M_NLSDIR)
2N/A # error "You must define M_NLSDIR in mkslocal.h"
2N/A#endif
2N/A
2N/A#if (defined(M_I18N_MKS_FULL) || defined(M_I18N_MKS_XPG)) && !defined(I18N)
2N/A # error I18N must be defined
2N/A#endif
2N/A
2N/A/* P_tmpdir - used by tmpnam.c and tempnam.c.
2N/A * Could be in <stdio.h>. But in case it is not ..
2N/A */
2N/A#ifndef P_tmpdir
2N/A# ifndef M_TMPDIR
2N/A # error M_TMPDIR must be defined in mkslocal.h
2N/A# endif
2N/A# define P_tmpdir M_TMPDIR
2N/A#endif /* P_tmpdir */
2N/A
2N/A/* L_cuserid - used by cuserid.c
2N/A * Could be in <stdio.h>. But in case it is not ..
2N/A */
2N/A#ifndef L_cuserid
2N/A# ifndef M_L_CUSERID
2N/A # error M_L_CUSERID must be defined in mkslocal.h
2N/A# endif
2N/A# define L_cuserid M_L_CUSERID
2N/A#endif /* L_cuserid */
2N/A
2N/A#ifdef M_AUDIT
2N/ALEXTERN char *m_audmode (int, int);
2N/A#if !defined(M_AUDITW1) || !defined(M_AUDITW2)
2N/A # error "With M_AUDIT set, you must define M_AUDITW1 and M_AUDITW2"
2N/A#endif
2N/A#endif /*M_AUDIT*/
2N/A
2N/A#ifndef M_CS_PATH
2N/A # error "You must define M_CS_PATH in mkslocal.h"
2N/A#endif
2N/A
2N/A#ifndef M_CS_SHELL
2N/A # error "You must define M_CS_SHELL in mkslocal.h"
2N/A#endif
2N/A
2N/A#ifndef M_SH_USER_FDS
2N/A/*
2N/A * default number of user file descriptors to be used in the shell
2N/A * Must be >= 10, should be <= OPEN_MAX/2.
2N/A */
2N/A#define M_SH_USER_FDS 10
2N/A#endif /*M_SH_USER_FDS*/
2N/A
2N/A#ifndef M_SH_MAX_FUNCTION_EVAL_DEPTH
2N/A#define M_SH_MAX_FUNCTION_EVAL_DEPTH 100
2N/A#endif
2N/A
2N/A#ifndef M_MANPAGER
2N/A#define M_MANPAGER "more -A -s"
2N/A#endif
2N/A
2N/A/* set up alert and verticalTab characters - This assumes an ANSI-C compiler */
2N/A#undef M_ALERT
2N/A#undef M_VTAB
2N/A#define M_ALERT '\a'
2N/A#define M_VTAB '\v'
2N/A
2N/A#ifndef M_ESCAPE
2N/A# define M_ESCAPE '\033' /* default to ASCII code for <ESC> */
2N/A#endif /*M_ESCAPE*/
2N/A
2N/A#ifndef SETVBUF
2N/A/* if SETVBUF not previously defined, then use default ANSI-C definition */
2N/A# define SETVBUF setvbuf
2N/A#endif
2N/A
2N/A#ifdef M_NULL
2N/A/* if M_NULL defined in <mkslocal.h> then want to redefine NULL */
2N/A#undef NULL
2N/A#define NULL (M_NULL)
2N/A#endif /*M_NULL*/
2N/A
2N/A/*
2N/A * Useful additions to sys/stat.h.
2N/A */
2N/A#ifndef S_IRALL
2N/A#define S_IRALL (S_IRUSR|S_IRGRP|S_IROTH)
2N/A#endif
2N/A#ifndef S_IWALL
2N/A#define S_IWALL (S_IWUSR|S_IWGRP|S_IWOTH)
2N/A#endif
2N/A#ifndef S_IXALL
2N/A#define S_IXALL (S_IXUSR|S_IXGRP|S_IXOTH)
2N/A#endif
2N/A
2N/A#ifndef M_DEFMODE /* Default directory creation mode */
2N/A#define M_DEFMODE ((mode_t)S_IRALL|S_IWALL)/* Default file creation mode*/
2N/A#endif
2N/A#ifndef M_DIRMODE
2N/A#define M_DIRMODE ((mode_t)S_IRALL|S_IWALL|S_IXALL)
2N/A#endif
2N/A
2N/A#ifndef M_FLDSEP
2N/A#define M_FLDSEP ':' /* UNIX field separator for passwd, PATH */
2N/A#endif
2N/A
2N/A#ifndef M_TTYNAME
2N/A#define M_TTYNAME "/dev/tty"
2N/A#endif
2N/A
2N/A#ifndef M_NULLNAME
2N/A#define M_NULLNAME "/dev/null"
2N/A#endif
2N/A
2N/A#ifndef M_FSDELIM
2N/A#define M_FSDELIM(c) ((c)=='/')
2N/A#endif
2N/A
2N/A#ifndef M_DRDELIM
2N/A#define M_DRDELIM(c) (0)
2N/A#endif
2N/A
2N/A#ifndef M_DIRSTAT
2N/A#define M_DIRSTAT(name, dp, sb) stat((name), (sb))
2N/A#endif
2N/A
2N/A#ifndef M_HIDDEN
2N/A#define M_HIDDEN(dirp, dp) ((dp)->d_name[0] == '.')
2N/A#endif
2N/A
2N/A#ifndef M_FSMOUNT /* for use by setmnt routine */
2N/A#define M_FSMOUNT M_ETCDIR(mtab)
2N/A#endif
2N/A
2N/A#ifndef M_FSALL /* for use by setmnt routine */
2N/A#define M_FSALL M_ETCDIR(fstab)
2N/A#endif
2N/A
2N/A#ifndef M_NLSCHARMAP /* Default charmap file for localedef */
2N/A#define M_NLSCHARMAP M_NLSDIR(charmap/ISO_8859-1)
2N/A#endif
2N/A
2N/A#ifndef M_POSIXPATH /* used when I18N undefined, default posix path */
2N/A#define M_POSIXPATH M_NLSDIR(locale/POSIX)
2N/A#endif
2N/A
2N/A#ifndef M_ISEOV
2N/A#define M_ISEOV(error) 0
2N/A#endif
2N/A
2N/A#ifndef M_IS_NATIVE_LOCALE
2N/A#define M_IS_NATIVE_LOCALE(s) (strcmp(s, "POSIX")==0 || strcmp(s, "C")==0)
2N/A#endif
2N/A
2N/A#ifndef M_FSCLOSE
2N/A#define M_FSCLOSE(fp)
2N/A#endif
2N/A
2N/A#ifndef ROOTUID /* default superuser uid = 0 */
2N/A#define ROOTUID 0
2N/A#endif
2N/A
2N/A#ifndef ROOTGID /* default superuser gid = 0 */
2N/A#define ROOTGID 0
2N/A#endif
2N/A
2N/A#ifndef M_GROUP_PASSWD
2N/A#define M_GROUP_PASSWD(grp) (grp->gr_passwd)
2N/A#endif
2N/A
2N/A
2N/A#ifndef M_NUMSIZE
2N/A/*
2N/A * define the expected max length of a printed number. (used in awk)
2N/A * This should be the longest expected size for any type of number
2N/A * ie. float, long etc.
2N/A * This number is used to calculate the approximate
2N/A * number of bytes needed to hold the number.
2N/A */
2N/A#define M_NUMSIZE 30
2N/A#endif /* M_NUMSIZE */
2N/A
2N/A/*
2N/A * VARARG[12345]: declare variadic functions.
2N/A * Expands to either a standard C prototype or a K&R declaration.
2N/A * For example:
2N/A *
2N/A * #include <stdarg.h>
2N/A * int
2N/A * fprintf VARARG2(FILE*, fp, char*, fmt)
2N/A * {
2N/A * va_list ap;
2N/A *
2N/A * va_start(ap, fmt);
2N/A * cp = va_arg(ap, char*);
2N/A * va_end(ap);
2N/A * }
2N/A */
2N/A#ifndef VARARG1
2N/A#ifdef __STDC__
2N/A#define VARARG1(type, name) (type name, ...)
2N/A#define VARARG2(t1, n1, t2, n2) (t1 n1, t2 n2, ...)
2N/A#define VARARG3(t1, n1, t2, n2, t3, n3) (t1 n1, t2 n2, t3 n3, ...)
2N/A#define VARARG4(t1, n1, t2, n2, t3, n3, t4, n4) \
2N/A (t1 n1, t2 n2, t3 n3, t4 n4, ...)
2N/A#define VARARG5(t1, n1, t2, n2, t3, n3, t4, n4, t5, n5) \
2N/A (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, ...)
2N/A#else
2N/A#define VARARG1(type, name) (name, va_alist) type name; int va_alist
2N/A#define VARARG2(t1, n1, t2, n2) (n1, n2, va_alist) t1 n1; t2 n2; int va_alist
2N/A#define VARARG3(t1, n1, t2, n2, t3, n3) (n1, n2, n3, va_alist) \
2N/A t1 n1; t2 n2; t3 n3; int va_alist
2N/A#define VARARG4(t1, n1, t2, n2, t3, n3, t4, n4) (n1, n2, n3, n4, va_alist) \
2N/A t1 n1; t2 n2; t3 n3; t4 n4; int va_alist
2N/A#define VARARG5(t1, n1, t2, n2, t3, n3, t4, n4, t5, n5) \
2N/A (n1, n2, n3, n4, n5, va_alist) \
2N/A t1 n1; t2 n2; t3 n3; t4 n4; t5 n5; int va_alist
2N/A#endif
2N/A#endif
2N/A
2N/A
2N/A/*
2N/A * MKS-specific library entry points.
2N/A */
2N/Aextern char *_cmdname;
2N/ALEXTERN char *basename (char *);
2N/ALEXTERN void crc16 (ushort *, ushort);
2N/ALEXTERN void crcccitt (ushort *, ushort);
2N/ALEXTERN int eprintf (const char *, ...);
2N/ALEXTERN void eputs (const char *);
2N/A#if defined(M_FEXEC)
2N/ALEXTERN pid_t fexecve (const char *, char *const *, char *const *);
2N/ALEXTERN pid_t fexecvp (const char *, char *const *);
2N/ALEXTERN pid_t fexecvep (const char *, char *const *, char *const *);
2N/A#endif /* M_FEXEC */
2N/ALEXTERN int execvep (const char *, char *const *, char *const *);
2N/ALEXTERN int isabsname (const char *);
2N/ALEXTERN const char *m_cescape (wint_t);
2N/ALEXTERN int m_escapec (char **);
2N/ALEXTERN const char *m_toprint (wint_t);
2N/A#if M_STTY_CC
2N/ALEXTERN int m_stty_cc (cc_t* cp, char *str);
2N/A#endif
2N/ALEXTERN char *m_cmdname (char *);
2N/ALEXTERN char *m_strmode (mode_t);
2N/ALEXTERN char *m_readmode (const char *);
2N/ALEXTERN char *m_readnum (long *, char *, char **, int);
2N/ALEXTERN char *m_readunum (unsigned long *, char *, char **, int);
2N/ALEXTERN mode_t m_getmode (mode_t);
2N/ALEXTERN int m_wallow (int, const char *);
2N/ALEXTERN char *m_pathcat (const char *, const char *);
2N/ALEXTERN void m_sigcleanup (void (*__handler)(int __signo) );
2N/ALEXTERN void m_defaction (int __signo);
2N/ALEXTERN char *m_strdup (const char *s);
2N/ALEXTERN int m_stricmp (const char *, const char *);
2N/ALEXTERN char *m_self (int, char *, char *);
2N/ALEXTERN int m_grouplist (char *user, gid_t *gidlist[]);
2N/ALEXTERN int m_setgroups (int gidsetsize, gid_t grouplist[]);
2N/ALEXTERN uint m_binsrch (uint n, int (*cmp)(uint i));
2N/ALEXTERN char *m_dirname (const char*);
2N/ALEXTERN char *m_confstr (int);
2N/A
2N/ALEXTERN void m_crcposix (ulong *, const uchar *, size_t);
2N/ALEXTERN int m_setprio (int, unsigned int, int);
2N/ALEXTERN int m_getprio (int, unsigned int);
2N/ALEXTERN int m_incrnice (int, unsigned int, int);
2N/ALEXTERN char *m_devname (dev_t);
2N/ALEXTERN char *m_mountdir (const char *);
2N/ALEXTERN int m_absname(char *, char *, char *, size_t);
2N/ALEXTERN int m_samefile(char *, struct stat *, char *, struct stat *);
2N/A
2N/A/* __m_system() : alternate interface into system() */
2N/ALEXTERN int __m_system (const char *, const char *, const char *);
2N/A
2N/A
2N/A/* conversion routines - between single byte and UNICODE (wide) strings.
2N/A * These return a pointer to malloc'd memory.
2N/A * It is the caller's responsiblity to free() it, if necessary
2N/A * These are for use primarily on NT
2N/A */
2N/Aextern char *m_unicodetosb(const wchar_t*);
2N/Aextern wchar_t *m_sbtounicode(const char*);
2N/A
2N/A
2N/A/*
2N/A * things that could go into an "m_stdio.h"
2N/A */
2N/A
2N/A/* m_unlink() : alternate unlink() for use with vendor-provided
2N/A * libraries that do not have a satisfactory unlink() */
2N/A#ifndef M_UNLINK
2N/A#define m_unlink(s) unlink(s)
2N/A#endif
2N/A
2N/A/* __m_popen() : alternate interface into popen() */
2N/ALEXTERN FILE *__m_popen (const char *, const char *,
2N/A const char *, const char *);
2N/ALEXTERN FILE *__m_popenvp (const char *mode, const char *shell,
2N/A char const * const *args);
2N/A
2N/A#if M_TFGETC
2N/ALEXTERN int m_tfgetc (FILE *fp, struct termios *tp);
2N/A#else
2N/A#define m_tfgetc(fp,tp) fgetc(fp)
2N/A#endif
2N/A
2N/A/* m_fsopen() - special routine for curses */
2N/ALEXTERN FILE *m_fsopen (char *, size_t, const char *, FILE *);
2N/A
2N/A#ifndef M_FFLUSH_NOT_POSIX_1
2N/A# define m_fflush fflush
2N/A#else
2N/A LEXTERN int m_fflush (FILE *);
2N/A#endif
2N/A
2N/A/* m_fgets return values */
2N/Aenum {
2N/A M_FGETS_OK, /* Normal return */
2N/A M_FGETS_EOF, /*
2N/A * Regular EOF (same as NULL from fgets).
2N/A * Buffer is *untouched*.
2N/A */
2N/A M_FGETS_SHORT, /*
2N/A * Short input (buf[strlen(buf)-1] != '\n')
2N/A * This is a trailing line, without a newline at the
2N/A * end of the file. The buffer is valid, ending in
2N/A * a \0, with no newline. The case of terminal input
2N/A * ending with an EOF in the middle of the line will
2N/A * restart -- typing two EOF's will result in this
2N/A * case.
2N/A */
2N/A M_FGETS_LONG, /*
2N/A * Line too long: newline not found within len bytes
2N/A * (buf[len-1] != '\n').
2N/A * At this point, while((c=getc(fp)) != '\n') ...
2N/A * is a valid method to get the rest of the line.
2N/A */
2N/A M_FGETS_BINARY, /*
2N/A * Input contained an invalid character (e.g. \0)
2N/A * Buffer contents *undefined*.
2N/A */
2N/A M_FGETS_ERROR /*
2N/A * A system call returned an error, errno is set.
2N/A * Buffer contents *undefined*.
2N/A */
2N/A};
2N/ALEXTERN int m_fgets (char *, size_t, FILE *);
2N/A
2N/A/*
2N/A * end of things that could go into an "m_stdio.h"
2N/A */
2N/A
2N/ALEXTERN int m_winsize (int *, int *);
2N/ALEXTERN char *m_cuserid ();
2N/A
2N/A/* m_ctype: generic character classification */
2N/Atypedef int m_ctype_t; /* ctype property */
2N/ALEXTERN m_ctype_t m_ctype (const char *property);
2N/ALEXTERN int m_isctype (int c, m_ctype_t ctype);
2N/ALEXTERN char *m_readdate (char *, time_t *, int);
2N/A
2N/A#ifndef M_READDATE_SYSV
2N/A#define M_READDATE_SYSV 0
2N/A#endif
2N/A#ifndef M_READDATE_BSD
2N/A#define M_READDATE_BSD 1
2N/A#endif
2N/A
2N/A#ifdef M_MALLOC
2N/A LEXTERN _VOID *m_malloc (size_t size);
2N/A#else
2N/A# define m_malloc(size) malloc(size)
2N/A#endif /*M_MALLOC*/
2N/A
2N/A#ifdef M_REALLOC
2N/A LEXTERN _VOID *m_realloc (void* ptr, size_t size);
2N/A#else
2N/A# define m_realloc realloc
2N/A#endif /*M_MALLOC*/
2N/A
2N/A#ifdef NAME_MAX
2N/A#define m_namemax(path) NAME_MAX
2N/A#else
2N/ALEXTERN int m_namemax (char *path);
2N/A#endif /*NAME_MAX*/
2N/A
2N/A#ifdef PATH_MAX
2N/A#define m_pathmax(path) PATH_MAX
2N/A#else
2N/ALEXTERN int m_pathmax (char *path);
2N/A#endif /* PATH_MAX */
2N/A
2N/A#ifdef M_DEVBIN
2N/A LEXTERN int m_devbin (int fd); /* begin raw I/O transfer */
2N/A LEXTERN void m_devstd (int fd, int mode); /* end raw I/O transfer */
2N/A#else
2N/A# define m_devbin(fd) 0
2N/A# define m_devstd(fd, mode)
2N/A#endif /*M_DEVBIN*/
2N/A
2N/A#ifndef m_setbinary
2N/A#define m_setbinary(fp)
2N/A#endif /*m_setbinary*/
2N/A
2N/A#ifndef M_PRIO_PROCESS
2N/A#define M_PRIO_PROCESS 0
2N/A#endif
2N/A#ifndef M_PRIO_PGRP
2N/A#define M_PRIO_PGRP 1
2N/A#endif
2N/A#ifndef M_PRIO_USER
2N/A#define M_PRIO_USER 2
2N/A#endif
2N/A
2N/A/* m_wallow type values */
2N/A#ifndef MWA_NO
2N/A#define MWA_NO 0 /* Deny talk, write */
2N/A#endif
2N/A#ifndef MWA_YES
2N/A#define MWA_YES 1 /* Allow talk, write */
2N/A#endif
2N/A#ifndef MWA_TEST
2N/A#define MWA_TEST 2 /* Test for YES/NO */
2N/A#endif
2N/A
2N/A/* Interface for compression (m_cm_*) and decompression (m_dc_*) */
2N/ALEXTERN int m_cm_open (int (*wrtfn) (const uchar *,int), int);
2N/ALEXTERN int m_cm_write (const uchar *, int);
2N/ALEXTERN int m_cm_close (int);
2N/ALEXTERN char *m_cm_error (void);
2N/ALEXTERN int m_dc_open (ssize_t (*rdfn)(uchar *, int));
2N/ALEXTERN ssize_t m_dc_read (uchar *, size_t);
2N/ALEXTERN int m_dc_close (int);
2N/ALEXTERN char *m_dc_error (void);
2N/A
2N/ALEXTERN int m_mkpardir (char *);
2N/A
2N/A/*
2N/A * Some UNIX routines that aren't in SVID
2N/A */
2N/ALEXTERN void cfree (void *, size_t, size_t);
2N/ALEXTERN void swaw (const short *, short *, int);
2N/A
2N/A/* Some dos routines we sometimes want from posix utilities */
2N/ALEXTERN void _uttoof (time_t, ushort *, ushort *);
2N/ALEXTERN time_t _oftout (ushort, ushort);
2N/A
2N/A
2N/A#ifndef M_SETENV
2N/A#define m_setenv() environ
2N/A#endif
2N/A
2N/A#ifdef M_NON_STATIC_GETENV
2N/A#define __m_getenv getenv
2N/A#else
2N/ALEXTERN char *__m_getenv(char const *); /* Library safe getenv() */
2N/A#endif
2N/A
2N/A#ifndef M_CRON_MAILER
2N/A/*
2N/A * Default case: assume only POSIX.2 mailx is available.
2N/A * Must be careful when cron sends output to mailx.
2N/A * We must ensure that lines with leading '~' are escaped
2N/A * so mailx doesn't interpret these lines
2N/A * This string MUST include a trailing space character.
2N/A */
2N/A#define M_CRON_MAILER "sed -e s/^~/~~/ | mailx "
2N/A#endif
2N/A
2N/A/*
2N/A * m_cp() - copy a file in an O/S specific way. See m_cp.3
2N/A * for details
2N/A */
2N/A
2N/A/* Return codes */
2N/A#define M_CP_ERR -1
2N/A#define M_CP_NOOP -2
2N/A
2N/A/* processing flags */
2N/A#define M_CP_PRESERVE 1
2N/A
2N/A/*
2N/A * MKS MEMORY MANIPULATIONS:
2N/A * Specific to MKS and non-portable.
2N/A */
2N/ALEXTERN _VOID *membtst (const char *s, size_t m, int c);
2N/A
2N/A#ifdef M_LDATA
2N/A#define memLchr memchr
2N/A#define memSLccpy memccpy
2N/A#define memLbtst membtst
2N/A#define memLset memset
2N/A#define memLLcpy memcpy
2N/A#define memLLrlcpy memrlcpy
2N/A#define memLLcmp memcmp
2N/A#else
2N/A/* for machines with small data models (e.g PC's - DOS, OS2) */
2N/ALEXTERN void far*memLchr (const void far*s, int c, size_t n);
2N/ALEXTERN void *memSLccpy (_VOID *s1, const _VOID far*s2, int, size_t n);
2N/ALEXTERN void far*memLbtst (const char far*s, size_t m, int n);
2N/ALEXTERN void far*memLset (void far*s, int c, size_t n);
2N/ALEXTERN void far*memLsetl (void far*p, int value, long count);
2N/ALEXTERN void far*memLLcpy (void far*s1, const void far*s2, size_t n);
2N/ALEXTERN void far*memLLrlcpy (void far*s1, const void far*s2, size_t);
2N/ALEXTERN int memLLcmp (const void far *s1,const void far *s2,size_t n);
2N/A#endif /* M_LDATA */
2N/A
2N/A
2N/A/* mks error handling routines */
2N/A#include <stdarg.h>
2N/ALEXTERN void m_error (const char * fmt, ...);
2N/ALEXTERN void m_errorexit (const char *fmt, va_list args);
2N/ALEXTERN void m_errorret (const char *fmt, va_list args);
2N/ALEXTERN void m_errorjmp (const char *fmt, va_list args);
2N/ALEXTERN void m_errornull (const char *fmt, va_list args);
2N/ALEXTERN void (*m_errorfn) (const char *fmt, va_list args);
2N/A#define M_ERROR(fn) void (*m_errorfn) (const char *fmt, va_list args) = fn
2N/A
2N/A/*
2N/A * The filesystem type and attribute routine
2N/A */
2N/A#ifndef M_FSTYPE
2N/A#define m_fstype(path) M_FSTYPE_POSIX
2N/A#endif
2N/A
2N/A/* File system types */
2N/A#define M_FSTYPE_MASK 0x1
2N/A#define M_FSTYPE_POSIX 0
2N/A#define M_FSTYPE_FAT 1
2N/A
2N/A/* File system attributes */
2N/A#define M_FSATTR_NO_LEADING_DOT 0x08
2N/A#define M_FSATTR_ONE_DOT 0x10
2N/A#define M_FSATTR_SHORT_FILENAME 0x20
2N/A#define M_FSATTR_SHORT_EXT 0x40
2N/A#define M_FSATTR_LOWER_CASE 0x80
2N/A
2N/A/* This one should be ifdef'ed on something else */
2N/A#ifndef M_FNMATCH_DUALCASE
2N/A#define m_get_original_filename_case(path) /* nil */
2N/A#endif
2N/A
2N/A/*
2N/A * m_tempname() generates a filename for a temp file using "code"
2N/A * in the name.
2N/A */
2N/A#ifndef M_TEMPNAME
2N/A#define m_tempname(code) tempnam(__m_getenv("TMPDIR"), (code))
2N/A#else
2N/Achar *m_tempname(char const *code);
2N/A#endif
2N/A
2N/A/*
2N/A * __m_getopt() alternate "stateless" entry into getopt().
2N/A */
2N/A
2N/Astruct getopt_state {
2N/A char *optarg; /* Argument */
2N/A int optind; /* Index into argv */
2N/A int opterr; /* Print error message */
2N/A int optopt; /* Invalid option */
2N/A int index; /* argv[optind] index */
2N/A#ifdef M_I18N_MB
2N/A mbstate_t st; /* State of argv[optind][index] */
2N/A#endif
2N/A};
2N/A
2N/Aint __m_getopt(int argc, char * const *argv, char const *optstring,
2N/A struct getopt_state *state);
2N/A
2N/A
2N/A#ifdef M_MKSEXTRA_H
2N/A/* Any overrides etcetera for a particular system can go in here */
2N/A#include <mksextra.h>
2N/A#endif /* M_MKSEXTRA_H */
2N/A
2N/A#endif /* __M_MKS_H__ */