1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #pragma ident   "%Z%%M% %I%     %E% SMI"
  28 
  29 /*
  30  * MKS header file.  Defines that make programming easier for us.
  31  * Includes MKS-specific things and posix routines.
  32  *
  33  * Copyright 1985, 1993 by Mortice Kern Systems Inc.  All rights reserved.
  34  *
  35  * $Header: /rd/h/rcs/mks.h 1.233 1995/09/28 19:45:19 mark Exp $
  36  */
  37 
  38 #ifndef __M_MKS_H__
  39 #define __M_MKS_H__
  40 
  41 /*
  42  * This should be a feature test macro defined in the Makefile or
  43  * cc command line.
  44  */
  45 #ifndef MKS
  46 #define MKS     1
  47 #endif
  48 
  49 /*
  50  * Write function declarations as follows:
  51  *      extern char     *function ANSI((char *cp, int flags, NODE *np));
  52  * Expansion of this happens only when __STDC__ is set.
  53  */
  54 #ifdef  __STDC__
  55 #define ANSI(x) x
  56 #define _VOID   void            /* Used in VOID *malloc() */
  57 #else
  58 #define const
  59 #define signed
  60 #define volatile
  61 #define ANSI(x) ()
  62 #define _VOID   char            /* Used in _VOID *malloc() */
  63 #endif
  64 
  65 #ifndef STATIC
  66 #  define       STATIC  static          /* Used for function definition */
  67 #endif  /*STATIC*/
  68 
  69 #ifndef STATREF
  70 #  ifdef        __STDC__
  71 #    define     STATREF static
  72 #  else
  73 #    define     STATREF         /* Used in local function forward declaration */
  74 #  endif
  75 #endif  /*STATREF*/
  76 
  77 #define LEXTERN extern          /* Library external reference */
  78 #define LDEFN                   /* Define Loadable library entry */
  79 
  80 typedef void    (*_sigfun_t)(int);
  81 
  82 #include <mkslocal.h>
  83 #include <stdio.h>
  84 #include <unistd.h>
  85 #include <limits.h>
  86 #include <sys/stat.h>     /* required for m_samefile() prototype. */
  87 #include <m_wchar.h>
  88 #include <m_i18n.h>
  89 #include <m_invari.h>
  90 
  91 #if M_TFGETC || M_STTY_CC
  92 #include <termios.h>
  93 #endif
  94 
  95 #ifndef M_LIBDIR
  96  # error "You must define M_LIBDIR in mkslocal.h"
  97 #endif
  98 
  99 #ifndef M_ETCDIR
 100  # error "You must define M_ETCDIR in mkslocal.h"
 101 #endif
 102 
 103 #ifndef M_SPOOLDIR
 104  # error "You must define M_SPOOLDIR in mkslocal.h"
 105 #endif
 106 
 107 #ifndef M_MANPATH
 108  # error "You must define M_MANPATH in mkslocal.h"
 109 #endif
 110 
 111 #if defined(I18N) && !defined(M_NLSDIR)
 112  # error "You must define M_NLSDIR in mkslocal.h"
 113 #endif
 114 
 115 #if (defined(M_I18N_MKS_FULL) || defined(M_I18N_MKS_XPG)) && !defined(I18N)
 116  # error I18N must be defined
 117 #endif
 118 
 119 /* P_tmpdir - used by tmpnam.c and tempnam.c.
 120  * Could be in <stdio.h>. But in case it is not ..
 121  */
 122 #ifndef P_tmpdir
 123 #  ifndef M_TMPDIR
 124      # error  M_TMPDIR must be defined in mkslocal.h 
 125 #  endif
 126 #  define P_tmpdir        M_TMPDIR
 127 #endif /* P_tmpdir */
 128 
 129 /* L_cuserid - used by cuserid.c
 130  * Could be in <stdio.h>. But in case it is not ..
 131  */
 132 #ifndef L_cuserid
 133 #  ifndef M_L_CUSERID
 134      # error  M_L_CUSERID must be defined in mkslocal.h 
 135 #  endif
 136 #  define L_cuserid        M_L_CUSERID
 137 #endif /* L_cuserid */
 138 
 139 #ifdef  M_AUDIT
 140 LEXTERN char    *m_audmode (int, int);
 141 #if !defined(M_AUDITW1) || !defined(M_AUDITW2)
 142  # error "With M_AUDIT set, you must define M_AUDITW1 and M_AUDITW2"
 143 #endif
 144 #endif  /*M_AUDIT*/
 145 
 146 #ifndef M_CS_PATH
 147  # error "You must define M_CS_PATH in mkslocal.h"
 148 #endif
 149 
 150 #ifndef M_CS_SHELL
 151  # error "You must define M_CS_SHELL in mkslocal.h"
 152 #endif
 153 
 154 #ifndef M_SH_USER_FDS
 155 /*
 156  * default number of user file descriptors to be used in the shell
 157  * Must be >= 10, should be <= OPEN_MAX/2.
 158  */
 159 #define M_SH_USER_FDS   10
 160 #endif /*M_SH_USER_FDS*/
 161 
 162 #ifndef M_SH_MAX_FUNCTION_EVAL_DEPTH
 163 #define M_SH_MAX_FUNCTION_EVAL_DEPTH    100
 164 #endif 
 165 
 166 #ifndef M_MANPAGER
 167 #define M_MANPAGER      "more -A -s"
 168 #endif
 169 
 170 /* set up alert and verticalTab characters - This assumes an ANSI-C compiler */
 171 #undef  M_ALERT
 172 #undef  M_VTAB
 173 #define M_ALERT '\a'
 174 #define M_VTAB  '\v'
 175 
 176 #ifndef M_ESCAPE
 177 #  define       M_ESCAPE '\033'         /* default to ASCII code for <ESC> */
 178 #endif /*M_ESCAPE*/
 179 
 180 #ifndef SETVBUF     
 181 /* if SETVBUF not previously defined, then use default ANSI-C definition */
 182 #  define       SETVBUF setvbuf
 183 #endif
 184 
 185 #ifdef M_NULL
 186 /* if M_NULL defined in <mkslocal.h> then want to redefine NULL */
 187 #undef        NULL
 188 #define       NULL    (M_NULL)
 189 #endif /*M_NULL*/
 190 
 191 /*
 192  * Useful additions to sys/stat.h.
 193  */
 194 #ifndef S_IRALL
 195 #define S_IRALL         (S_IRUSR|S_IRGRP|S_IROTH)
 196 #endif
 197 #ifndef S_IWALL
 198 #define S_IWALL         (S_IWUSR|S_IWGRP|S_IWOTH)
 199 #endif
 200 #ifndef S_IXALL
 201 #define S_IXALL         (S_IXUSR|S_IXGRP|S_IXOTH)
 202 #endif
 203 
 204 #ifndef M_DEFMODE       /* Default directory creation mode */
 205 #define M_DEFMODE       ((mode_t)S_IRALL|S_IWALL)/* Default file creation mode*/
 206 #endif
 207 #ifndef M_DIRMODE
 208 #define M_DIRMODE       ((mode_t)S_IRALL|S_IWALL|S_IXALL)
 209 #endif
 210 
 211 #ifndef M_FLDSEP
 212 #define M_FLDSEP        ':'     /* UNIX field separator for passwd, PATH */
 213 #endif
 214 
 215 #ifndef M_TTYNAME
 216 #define M_TTYNAME "/dev/tty"
 217 #endif
 218 
 219 #ifndef M_NULLNAME
 220 #define M_NULLNAME "/dev/null"
 221 #endif
 222 
 223 #ifndef M_FSDELIM
 224 #define M_FSDELIM(c)    ((c)=='/')
 225 #endif
 226 
 227 #ifndef M_DRDELIM
 228 #define M_DRDELIM(c)    (0)
 229 #endif
 230 
 231 #ifndef M_DIRSTAT
 232 #define M_DIRSTAT(name, dp, sb) stat((name), (sb))
 233 #endif
 234 
 235 #ifndef M_HIDDEN
 236 #define M_HIDDEN(dirp, dp)      ((dp)->d_name[0] == '.')
 237 #endif
 238 
 239 #ifndef M_FSMOUNT               /* for use by setmnt routine */
 240 #define M_FSMOUNT M_ETCDIR(mtab)
 241 #endif
 242 
 243 #ifndef M_FSALL                 /* for use by setmnt routine */
 244 #define M_FSALL M_ETCDIR(fstab)
 245 #endif
 246 
 247 #ifndef M_NLSCHARMAP            /* Default charmap file for localedef */
 248 #define M_NLSCHARMAP    M_NLSDIR(charmap/ISO_8859-1)
 249 #endif
 250 
 251 #ifndef M_POSIXPATH     /* used when I18N undefined, default posix path */
 252 #define M_POSIXPATH     M_NLSDIR(locale/POSIX)
 253 #endif
 254 
 255 #ifndef M_ISEOV
 256 #define M_ISEOV(error)  0
 257 #endif
 258 
 259 #ifndef M_IS_NATIVE_LOCALE
 260 #define M_IS_NATIVE_LOCALE(s)   (strcmp(s, "POSIX")==0 || strcmp(s, "C")==0)
 261 #endif
 262 
 263 #ifndef M_FSCLOSE
 264 #define M_FSCLOSE(fp)
 265 #endif
 266 
 267 #ifndef ROOTUID         /* default superuser uid = 0 */
 268 #define ROOTUID 0
 269 #endif
 270 
 271 #ifndef ROOTGID         /* default superuser gid = 0 */
 272 #define ROOTGID 0
 273 #endif
 274 
 275 #ifndef M_GROUP_PASSWD
 276 #define M_GROUP_PASSWD(grp)  (grp->gr_passwd)
 277 #endif
 278 
 279 
 280 #ifndef M_NUMSIZE
 281 /*
 282  * define the expected max length of a printed number. (used in awk)
 283  * This should be the longest expected size for any type of number
 284  * ie. float, long etc.
 285  * This number is used to calculate the approximate
 286  * number of bytes needed to hold the number.
 287  */
 288 #define M_NUMSIZE       30
 289 #endif /* M_NUMSIZE */
 290 
 291 /*
 292  * VARARG[12345]: declare variadic functions.
 293  * Expands to either a standard C prototype or a K&R declaration.
 294  * For example:
 295  *
 296  * #include <stdarg.h>
 297  * int
 298  * fprintf VARARG2(FILE*, fp, char*, fmt)
 299  * {
 300  *      va_list ap;
 301  *
 302  *      va_start(ap, fmt);
 303  *      cp = va_arg(ap, char*);
 304  *      va_end(ap);
 305  * }
 306  */
 307 #ifndef VARARG1
 308 #ifdef  __STDC__
 309 #define VARARG1(type, name) (type name, ...)
 310 #define VARARG2(t1, n1, t2, n2) (t1 n1, t2 n2, ...)
 311 #define VARARG3(t1, n1, t2, n2, t3, n3) (t1 n1, t2 n2, t3 n3, ...)
 312 #define VARARG4(t1, n1, t2, n2, t3, n3, t4, n4) \
 313                 (t1 n1, t2 n2, t3 n3, t4 n4, ...)
 314 #define VARARG5(t1, n1, t2, n2, t3, n3, t4, n4, t5, n5) \
 315                 (t1 n1, t2 n2, t3 n3, t4 n4, t5 n5, ...)
 316 #else
 317 #define VARARG1(type, name) (name, va_alist) type name; int va_alist
 318 #define VARARG2(t1, n1, t2, n2) (n1, n2, va_alist) t1 n1; t2 n2; int va_alist
 319 #define VARARG3(t1, n1, t2, n2, t3, n3) (n1, n2, n3, va_alist) \
 320                 t1 n1; t2 n2; t3 n3; int va_alist
 321 #define VARARG4(t1, n1, t2, n2, t3, n3, t4, n4) (n1, n2, n3, n4, va_alist) \
 322                 t1 n1; t2 n2; t3 n3; t4 n4; int va_alist
 323 #define VARARG5(t1, n1, t2, n2, t3, n3, t4, n4, t5, n5) \
 324                 (n1, n2, n3, n4, n5, va_alist) \
 325                 t1 n1; t2 n2; t3 n3; t4 n4; t5 n5; int va_alist
 326 #endif
 327 #endif
 328 
 329 
 330 /*
 331  * MKS-specific library entry points.
 332  */
 333 extern  char    *_cmdname;
 334 LEXTERN char    *basename (char *);
 335 LEXTERN void    crc16 (ushort *, ushort);
 336 LEXTERN void    crcccitt (ushort *, ushort);
 337 LEXTERN int     eprintf (const char *, ...);
 338 LEXTERN void    eputs (const char *);
 339 LEXTERN pid_t   fexecve (const char *, char *const *, char *const *);
 340 LEXTERN pid_t   fexecvp (const char *, char *const *);
 341 LEXTERN pid_t   fexecvep (const char *, char *const *, char *const *);
 342 LEXTERN int     execvep (const char *, char *const *, char *const *);
 343 LEXTERN int     isabsname (const char *);
 344 LEXTERN const char *m_cescape (wint_t);
 345 LEXTERN int     m_escapec (char **);
 346 LEXTERN const char *m_toprint (wint_t);
 347 #if M_STTY_CC
 348 LEXTERN int     m_stty_cc (cc_t* cp, char *str);
 349 #endif
 350 LEXTERN char    *m_cmdname (char *);
 351 LEXTERN char    *m_strmode (mode_t);
 352 LEXTERN char    *m_readmode (const char *);
 353 LEXTERN char    *m_readnum (long *, char *, char **, int);
 354 LEXTERN char    *m_readunum (unsigned long *, char *, char **, int);
 355 LEXTERN mode_t  m_getmode (mode_t);
 356 LEXTERN int     m_wallow (int, const char *);
 357 LEXTERN char    *m_pathcat (const char *, const char *);
 358 LEXTERN void    m_sigcleanup (void (*__handler)(int __signo) );
 359 LEXTERN void    m_defaction (int __signo);
 360 LEXTERN char    *m_strdup (const char *s);
 361 LEXTERN int     m_stricmp (const char *, const char *);
 362 LEXTERN char    *m_self (int, char *, char *);
 363 LEXTERN int     m_grouplist (char *user, gid_t *gidlist[]);
 364 LEXTERN int     m_setgroups (int gidsetsize, gid_t grouplist[]);
 365 LEXTERN uint    m_binsrch (uint n, int (*cmp)(uint i));
 366 LEXTERN char    *m_dirname (const char*);
 367 LEXTERN char    *m_confstr (int);
 368 
 369 LEXTERN void    m_crcposix (ulong *, const uchar *, size_t);
 370 LEXTERN int     m_setprio (int, unsigned int, int);
 371 LEXTERN int     m_getprio (int, unsigned int);
 372 LEXTERN int     m_incrnice (int, unsigned int, int);
 373 LEXTERN char    *m_devname (dev_t);
 374 LEXTERN char    *m_mountdir (const char *);
 375 LEXTERN int     m_absname(char *, char *, char *, size_t);
 376 LEXTERN int     m_samefile(char *, struct stat *, char *, struct stat *);
 377 
 378 /* __m_system() : alternate interface into system() */
 379 LEXTERN int     __m_system (const char *, const char *, const char *);
 380 
 381 
 382 /* conversion routines - between single byte and UNICODE (wide) strings.
 383  * These return a pointer to malloc'd memory.
 384  * It is the caller's responsiblity to free() it, if necessary
 385  * These are for use primarily on NT
 386  */
 387 extern char *m_unicodetosb(const wchar_t*);
 388 extern wchar_t *m_sbtounicode(const char*);
 389 
 390 
 391 /*
 392  * things that could go into an "m_stdio.h"
 393  */
 394 
 395 /* m_unlink() : alternate unlink() for use with vendor-provided
 396  * libraries that do not have a satisfactory unlink() */
 397 #ifndef M_UNLINK
 398 #define m_unlink(s)     unlink(s)
 399 #endif
 400 
 401 /* __m_popen() : alternate interface into popen() */
 402 LEXTERN FILE    *__m_popen (const char *, const char *,
 403                             const char *, const char *);
 404 LEXTERN FILE    *__m_popenvp (const char *mode, const char *shell, 
 405                               char const * const *args);
 406 
 407 #if M_TFGETC
 408 LEXTERN int     m_tfgetc (FILE *fp, struct termios *tp);
 409 #else
 410 #define         m_tfgetc(fp,tp) fgetc(fp)
 411 #endif
 412 
 413 /* m_fsopen() - special routine for curses */
 414 LEXTERN FILE    *m_fsopen (char *, size_t, const char *, FILE *);
 415 
 416 #ifndef M_FFLUSH_NOT_POSIX_1
 417 # define        m_fflush fflush
 418 #else
 419   LEXTERN       int     m_fflush (FILE *);
 420 #endif
 421 
 422 /* m_fgets return values */
 423 enum {
 424         M_FGETS_OK,     /* Normal return */
 425         M_FGETS_EOF,    /*
 426                          * Regular EOF (same as NULL from fgets).
 427                          * Buffer is *untouched*.
 428                          */
 429         M_FGETS_SHORT,  /*
 430                          * Short input (buf[strlen(buf)-1] != '\n')
 431                          * This is a trailing line, without a newline at the
 432                          * end of the file.  The buffer is valid, ending in
 433                          * a \0, with no newline.  The case of terminal input
 434                          * ending with an EOF in the middle of the line will
 435                          * restart -- typing two EOF's will result in this
 436                          * case.
 437                          */
 438         M_FGETS_LONG,   /*
 439                          * Line too long: newline not found within len bytes
 440                          * (buf[len-1] != '\n').
 441                          * At this point, while((c=getc(fp)) != '\n') ...
 442                          * is a valid method to get the rest of the line.
 443                          */
 444         M_FGETS_BINARY, /*
 445                          * Input contained an invalid character (e.g. \0)
 446                          * Buffer contents *undefined*.
 447                          */
 448         M_FGETS_ERROR   /*
 449                          * A system call returned an error, errno is set.
 450                          * Buffer contents *undefined*.
 451                          */
 452 };
 453 LEXTERN int     m_fgets (char *, size_t, FILE *);
 454 
 455 /*
 456  * end of things that could go into an "m_stdio.h"
 457  */
 458 
 459 LEXTERN int     m_winsize (int *, int *);
 460 LEXTERN char    *m_cuserid ();
 461 
 462 /* m_ctype: generic character classification */
 463 typedef int     m_ctype_t;              /* ctype property */
 464 LEXTERN m_ctype_t       m_ctype (const char *property);
 465 LEXTERN int     m_isctype (int c, m_ctype_t ctype);
 466 LEXTERN char    *m_readdate (char *, time_t *, int);
 467 
 468 #ifndef M_READDATE_SYSV
 469 #define M_READDATE_SYSV 0
 470 #endif
 471 #ifndef M_READDATE_BSD
 472 #define M_READDATE_BSD  1
 473 #endif
 474 
 475 #ifdef M_MALLOC
 476   LEXTERN _VOID *m_malloc (size_t size);
 477 #else
 478 # define m_malloc(size) malloc(size)
 479 #endif /*M_MALLOC*/
 480 
 481 #ifdef M_REALLOC
 482   LEXTERN _VOID *m_realloc (void* ptr, size_t size);
 483 #else
 484 # define m_realloc      realloc
 485 #endif /*M_MALLOC*/
 486 
 487 #ifdef NAME_MAX
 488 #define         m_namemax(path) NAME_MAX
 489 #else
 490 LEXTERN int     m_namemax (char *path);
 491 #endif /*NAME_MAX*/
 492 
 493 #ifdef PATH_MAX
 494 #define         m_pathmax(path) PATH_MAX
 495 #else
 496 LEXTERN int     m_pathmax (char *path);
 497 #endif /* PATH_MAX */
 498 
 499 #ifdef M_DEVBIN
 500  LEXTERN int     m_devbin (int fd);         /* begin raw I/O transfer */
 501  LEXTERN void    m_devstd (int fd, int mode); /* end raw I/O transfer */
 502 #else
 503 # define        m_devbin(fd)    0
 504 # define        m_devstd(fd, mode)
 505 #endif /*M_DEVBIN*/
 506 
 507 #ifndef m_setbinary
 508 #define m_setbinary(fp)
 509 #endif /*m_setbinary*/
 510 
 511 #ifndef M_PRIO_PROCESS
 512 #define M_PRIO_PROCESS  0
 513 #endif
 514 #ifndef M_PRIO_PGRP
 515 #define M_PRIO_PGRP     1
 516 #endif
 517 #ifndef M_PRIO_USER
 518 #define M_PRIO_USER     2
 519 #endif
 520 
 521 /* m_wallow type values */
 522 #ifndef MWA_NO
 523 #define MWA_NO  0               /* Deny talk, write */
 524 #endif
 525 #ifndef MWA_YES
 526 #define MWA_YES 1               /* Allow talk, write */
 527 #endif
 528 #ifndef MWA_TEST
 529 #define MWA_TEST 2              /* Test for YES/NO */
 530 #endif
 531 
 532 /* Interface for compression (m_cm_*) and decompression (m_dc_*) */
 533 LEXTERN int     m_cm_open (int (*wrtfn) (const uchar *,int), int);
 534 LEXTERN int     m_cm_write (const uchar *, int);
 535 LEXTERN int     m_cm_close (int);
 536 LEXTERN char    *m_cm_error (void);
 537 LEXTERN int     m_dc_open (ssize_t (*rdfn)(uchar *, int));
 538 LEXTERN ssize_t m_dc_read (uchar *, size_t);
 539 LEXTERN int     m_dc_close (int);
 540 LEXTERN char    *m_dc_error (void);
 541 
 542 LEXTERN int     m_mkpardir (char *);
 543 
 544 /*
 545  * Some UNIX routines that aren't in SVID
 546  */
 547 LEXTERN void    cfree (void *, size_t, size_t);
 548 LEXTERN void    swaw (const short *, short *, int);
 549 
 550 /* Some dos routines we sometimes want from posix utilities */
 551 LEXTERN void    _uttoof (time_t, ushort *, ushort *);
 552 LEXTERN time_t  _oftout (ushort, ushort);
 553 
 554 
 555 #ifndef M_SETENV
 556 #define m_setenv()      environ
 557 #endif
 558 
 559 #ifdef M_NON_STATIC_GETENV
 560 #define __m_getenv getenv
 561 #else
 562 LEXTERN char    *__m_getenv(char const *);  /* Library safe getenv() */
 563 #endif
 564 
 565 #ifndef M_CRON_MAILER
 566 /* 
 567  * Default case: assume only POSIX.2 mailx is available.
 568  * Must be careful when cron sends output to mailx.
 569  * We must ensure that lines with leading '~' are escaped
 570  * so mailx doesn't interpret these lines
 571  * This string MUST include a trailing space character.
 572  */
 573 #define M_CRON_MAILER   "sed -e s/^~/~~/ | mailx "
 574 #endif
 575 
 576 /*
 577  * m_cp() - copy a file in an O/S specific way.  See m_cp.3
 578  * for details
 579  */
 580 
 581 /* Return codes */
 582 #define M_CP_ERR        -1
 583 #define M_CP_NOOP       -2
 584 
 585 /* processing flags */
 586 #define M_CP_PRESERVE   1
 587 
 588 /*
 589  * MKS MEMORY MANIPULATIONS:
 590  *      Specific to MKS and non-portable.
 591  */
 592 LEXTERN _VOID   *membtst (const char *s, size_t m, int c);
 593 
 594 #ifdef M_LDATA
 595 #define memLchr         memchr
 596 #define memSLccpy       memccpy
 597 #define memLbtst        membtst
 598 #define memLset         memset
 599 #define memLLcpy        memcpy
 600 #define memLLrlcpy      memrlcpy
 601 #define memLLcmp        memcmp
 602 #else
 603 /* for machines with small data models (e.g PC's - DOS, OS2) */
 604 LEXTERN void    far*memLchr (const void far*s, int c, size_t n);
 605 LEXTERN void    *memSLccpy (_VOID *s1, const _VOID far*s2, int, size_t n);
 606 LEXTERN void    far*memLbtst (const char far*s, size_t m, int n);
 607 LEXTERN void    far*memLset (void far*s, int c, size_t n);
 608 LEXTERN void    far*memLsetl (void far*p, int value, long count);
 609 LEXTERN void    far*memLLcpy (void far*s1, const void far*s2, size_t n);
 610 LEXTERN void    far*memLLrlcpy (void far*s1, const void far*s2, size_t);
 611 LEXTERN int     memLLcmp (const void far *s1,const void far *s2,size_t n);
 612 #endif /* M_LDATA */
 613 
 614 
 615 /* mks error handling routines */
 616 #include <stdarg.h>
 617 LEXTERN void    m_error (const char * fmt, ...);
 618 LEXTERN void    m_errorexit (const char *fmt, va_list args);
 619 LEXTERN void    m_errorret (const char *fmt, va_list args);
 620 LEXTERN void    m_errorjmp (const char *fmt, va_list args);
 621 LEXTERN void    m_errornull (const char *fmt, va_list args);
 622 LEXTERN void    (*m_errorfn) (const char *fmt, va_list args);
 623 #define M_ERROR(fn)     void (*m_errorfn) (const char *fmt, va_list args) = fn
 624 
 625 /*
 626  * The filesystem type and attribute routine
 627  */
 628 #ifndef M_FSTYPE
 629 #define m_fstype(path)  M_FSTYPE_POSIX
 630 #endif
 631 
 632 /* File system types */
 633 #define M_FSTYPE_MASK   0x1
 634 #define M_FSTYPE_POSIX  0
 635 #define M_FSTYPE_FAT    1
 636 
 637 /* File system attributes */
 638 #define M_FSATTR_NO_LEADING_DOT 0x08
 639 #define M_FSATTR_ONE_DOT        0x10
 640 #define M_FSATTR_SHORT_FILENAME 0x20
 641 #define M_FSATTR_SHORT_EXT      0x40
 642 #define M_FSATTR_LOWER_CASE     0x80
 643 
 644 /* This one should be ifdef'ed on something else */
 645 #ifndef M_FNMATCH_DUALCASE
 646 #define m_get_original_filename_case(path)      /* nil */
 647 #endif
 648 
 649 /*
 650  * m_tempname() generates a filename for a temp file using "code" 
 651  * in the name.
 652  */
 653 #ifndef M_TEMPNAME
 654 #define m_tempname(code)        tempnam(__m_getenv("TMPDIR"), (code))
 655 #else
 656 char *m_tempname(char const *code);
 657 #endif
 658 
 659 /*
 660  * __m_getopt() alternate "stateless" entry into getopt().
 661  */
 662 
 663 struct getopt_state {
 664         char    *optarg;                /* Argument */
 665         int     optind;                 /* Index into argv */
 666         int     opterr;                 /* Print error message */
 667         int     optopt;                 /* Invalid option */
 668         int     index;                  /* argv[optind] index */
 669 #ifdef  M_I18N_MB
 670         mbstate_t st;                   /* State of argv[optind][index] */
 671 #endif 
 672 };
 673 
 674 int __m_getopt(int argc, char * const *argv, char const *optstring,
 675                struct getopt_state *state);
 676         
 677 
 678 #ifdef M_MKSEXTRA_H
 679 /* Any overrides etcetera for a particular system can go in here */
 680 #include <mksextra.h>
 681 #endif /* M_MKSEXTRA_H */
 682 
 683 #endif  /* __M_MKS_H__ */