/* Copyright 1997 Acorn Computers Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/****************************************************************************
 * This source file was written by Acorn Computers Limited. It is part of   *
 * the Internet library for writing network applications in C. It may be    *
 * used freely in the creation of programs for Archimedes or Risc PC. It    *
 * should be used with Acorn's C Compiler Release 5 or later.               *
 *                                                                          *
 *                                                                          *
 * Copyright  Acorn Computers Ltd, 1996                                    *
 *                                                                          *
 ***************************************************************************/

/*
 * File:    unixlib.h
 * Purpose: Unix-like support calls to ease porting of Unix utilities
 * Author:  K Bracey
 * History: 26-Nov-96: KJB: Internet 5 release
 *          29-Jan-97: KJB: KVM functions added to header
 *          30-Mar-04: KJB: getifaddrs added
 */


/*
 * variable declarations
 */
extern const char *const sys_errlist[];
extern const int   sys_nerr;
extern char *optarg;
extern int   optind;
extern int   optopt;
extern int   opterr;
extern int   optreset;

struct iovec;
struct stat;
struct timeval;
struct timespec;
struct timezone;

#ifndef kvm_t
#define kvm_t void
#endif

#include <stdio.h>  /* For __va_list */

/*
 * function prototypes
 */
extern int access(const char *path, int mode);

extern int bcmp(const void *s1, const void *s2, unsigned int length);
extern void bcopy(const void *src, void *dst, unsigned int length);
extern void bzero(void *s, unsigned int length);

extern int chdir(const char *dir);
extern int chmod(const char *path, unsigned short mode);
extern int close(int s);
extern int clock_gettime(int clock_id, struct timespec *ts);

extern void endpwent(void);
extern void err(int eval, const char *fmt, ...);
extern void errc(int eval, int code, const char *fmt, ...);
extern void errx(int eval, const char *fmt, ...);
extern void err_set_exit(void (*ef)(int));
extern void err_set_file(void *fp);
extern void err_set_silent(int silent);

extern int ffs(int value);
extern int filestat(const char *fname, char *type);
extern void flushinput(void);
extern int fstat(int s, struct stat *buf);

extern int getdtablesize(void);
extern unsigned long getegid(void);
extern unsigned long geteuid(void);
extern int getgroups(int ngrps, unsigned long grparray[]);
extern int gethostname(char *name, int max_namelen);
extern char *getlogin(void);
extern int getopt(int nargc, char *const *nargv, const char *ostr);
extern char *getpass(const char *prompt);
extern long getpid(void);
extern struct passwd *getpwent(void);
extern struct passwd *getpwnam(const char *name);
extern struct passwd *getpwuid(unsigned long uid);
extern int gettimeofday(struct timeval *tv, struct timezone *tzp);
extern unsigned long getuid(void);
extern char *getvarhostname(void);
extern char *getvarusername(void);
extern char *getwd(char *buf);

extern void herror(const char *c);

extern char *index(const char *s, int c);
extern int ioctl(int s, unsigned long cmd, ...);

extern void killfile(const char *name);
extern int kvm_close(kvm_t *kd);
#ifdef __STDC__
extern unsigned long long kvm_counter_u64_fetch(kvm_t *kd, unsigned long base);
#endif
extern kvm_t *kvm_open(const char *uf, const char *mf, const char *sf,
                       int flag, const char *errout);
extern kvm_t *kvm_openfiles(const char *uf, const char *mf, const char *sf,
                       int flag, char *errout);
extern int kvm_read(kvm_t *kd, unsigned long kva, void *buf, size_t len);
extern char *kvm_geterr(kvm_t *kd);

extern long lseek(int d, long offset, int whence);

extern int osreadc(void);

extern int read(int s, void *buf, unsigned int nbytes);
extern int readdir(const char *path, char *buf, int len, const char *name, int offset);
extern int readv(int s, const struct iovec *iov, int iovcnt);
extern char *rindex(const char *s, int c);
extern void *reallocf(void *ptr, size_t size);

extern int setpwent(void);
extern unsigned int sleep(unsigned int seconds);
extern int strcasecmp(const char *a, const char *b);
extern char *strdup(const char *s);
extern int strncasecmp(const char *a, const char *b, size_t n);
#ifdef __STDC__
extern long long strtonum(const char *numstr, long long minval, long long maxval, const char **errstrp);
#endif
extern char *strsep(char **stringp, const char *delim);
extern size_t strlcpy(char *dst, const char *src, size_t dsize);
extern size_t strlcat(char *dst, const char *src, size_t dsize);

extern void trimdomain(char *, int);

extern int unlink(const char *path);

#ifdef __STDC__
extern void verr(int eval, const char *fmt, __va_list);
extern void verrc(int eval, int code, const char *fmt, __va_list);
extern void verrx(int eval, const char *fmt, __va_list);
extern void vwarn(const char *fmt, __va_list);
extern void vwarnc(int code, const char *fmt, __va_list);
extern void vwarnx(const char *fmt, __va_list);
#else
extern void verr(int eval, const char *fmt, int);
extern void verrc(int eval, int code, const char *fmt, int);
extern void verrx(int eval, const char *fmt, int);
extern void vwarn(const char *fmt, int);
extern void vwarnc(int code, const char *fmt, int);
extern void vwarnx(const char *fmt, int);
#endif

extern void warn(const char *fmt, ...);
extern void warnc(int code, const char *fmt, ...);
extern void warnx(const char *fmt, ...);
extern int write(int s, const void *buf, unsigned int nbytes);
extern int writev(int s, const struct iovec *iov, int iovcnt);

extern char *xgets(char *buf);
extern void xperror(const char *s);
extern char xputchar(char ch);
extern char *xstrerror(int num);

/* EOF unixlib.h */
