# See ltrace.conf(5) for description of syntax of this file.

# XXX ltrace misses long double and long long support
typedef ldouble = double;
typedef llong = long;
typedef ullong = ulong;

void __libc_start_main(hide(void*), hide(int), array(string, arg2));

# arpa/inet.h
typedef in_addr = struct(hex(uint));
int inet_aton(string, +in_addr*);
hex(uint) inet_addr(string);
hex(uint) inet_network(string);
string inet_ntoa(in_addr);
in_addr inet_makeaddr(hex(int), hex(int));
hex(uint) inet_lnaof(in_addr);
hex(uint) inet_netof(in_addr);

# bfd.h
void bfd_init();
int bfd_set_default_target(string);
addr bfd_scan_vma(string, addr, int);
addr bfd_openr(string,string);
int bfd_check_format(addr,int);

# ctype.h
char tolower(char);
char toupper(char);
addr __ctype_b_loc();
addr __ctype_tolower_loc();
addr __ctype_toupper_loc();
ulong __ctype_get_mb_cur_max();

# curses.h
int waddch(addr, char);
int mvprintw(int, int, format);
int wmove(addr, int, int);
int waddnstr(addr, string, int);
string tgoto(string, int, int);

# dirent.h

# We can't portably rely on DIR internals at all.  Ideally this would
# be implemented in a per-OS config file, but even on Linux, we don't
# know whether there's a lock in the structure or not.  Luckily the
# one interesting datum, file descriptor, we can access reliably.
# Having the structure half-defined like this is potentially
# problematic as structure size influences parameter passing.  But
# POSIX always uses pointer to the structure, so it's fine.

typedef DIR = struct(int);
typedef FILE = addr;

# XXX We can't represent the following portably without having either
# uulong, or directly uint64_t.'

typedef ino_t = ulong;
typedef ino_t64 = ulong;
typedef off_t = ulong;
typedef off_t64 = ulong;

typedef dirent = struct(ino_t, hide(off_t), hide(ushort), hide(char), string(array(char, zero(256))));
typedef dirent64 = struct(ino_t64, hide(off_t64), hide(ushort), hide(char), string(array(char, zero(256))));

dirent *readdir(DIR *);
dirent64 *readdir64(DIR *);
int closedir(DIR *);
DIR *opendir(string);
DIR *fdopendir(int);
int dirfd(DIR *);
void rewinddir(DIR *);
long telldir(DIR *);
void seekdir(DIR *, long);

# dlfcn.h
addr  dlopen(string, int);
string dlerror();
addr  dlsym(addr, string);
int dlclose(addr);

# errno.h
addr __errno_location();

# fcntl.h
int open(string,int,octal);		; WARNING: 3rd argument may not be there
int open64(string,int,octal);		; WARNING: 3rd argument may not be there

# fnmatch.h
int fnmatch(string, string, int);

# getopt.h
int getopt_long(int,addr,string,addr,int*);
int getopt_long_only(int,addr,string,addr,addr);

# grp.h
void endgrent();
addr getgrnam(string);
void setgrent();
addr getgrent();

# libintl.h
string __dcgettext(string,string,int);
string bindtextdomain(string, string);
string textdomain(string);

# libio.h
char _IO_getc(file);
int _IO_putc(char,file);

# locale.h
string setlocale(enum(LC_CTYPE=0, LC_NUMERIC=1, LC_TIME=2, LC_COLLATE=3, LC_MONETARY=4, LC_MESSAGES=5, LC_ALL=6, LC_PAPER=7, LC_NAME=8, LC_ADDRESS=9, LC_TELEPHONE=10, LC_MEASUREMENT=11, LC_IDENTIFICATION=12), string);

# mcheck.h
void mtrace();
void muntrace();

# mqueue.h
int mq_open(string, int, octal, addr);  ; WARNING: 3rd and 4th arguments may not be there
int mq_close(int);
int mq_unlink(string);
int mq_getattr(int, addr);
int mq_setattr(int, addr, addr);
int mq_notify(int, addr);
int mq_send(int, string3, ulong, uint);
int mq_timedsend(int, string3, ulong, uint, addr);
long mq_receive(int, +string0, ulong, addr);
long mq_timedreceive(int, +string0, ulong, addr, addr);

# netdb.h
void endhostent();
void endnetent();
void endnetgrent();
void endprotoent();
void endservent();
void freeaddrinfo(addr);
string gai_strerror(int);
int getaddrinfo(string, string, addr, addr);
addr gethostbyaddr(string, uint, int);
addr gethostbyname(string);
addr gethostent();
int getnameinfo(addr, uint, string, uint, string, uint, uint);
addr getnetbyaddr(uint, int);
addr getnetbyname(string);
addr getnetent();
int getnetgrent(addr, addr, addr);
addr getprotobyname(string);
addr getprotobynumber(int);
addr getprotoent();
addr getservbyname(string, string);
addr getservbyport(int, string);
addr getservent();
void herror(string);
string hstrerror(int);
int rcmd(addr, ushort, string, string, string, addr);
int rcmd_af(addr, ushort, string, string, string, addr, int);
int rexec(addr, int, string, string, string, addr);
int rexec_af(addr, int, string, string, string, addr, int);
int rresvport (addr);
int rresvport_af (addr, int);
int ruserok(string, int, string, string);
int ruserok_af(string, int, string, string, int);
void sethostent(int);
void setnetent(int);
int setnetgrent(string);
void setprotoent(int);
void setservent(int);

# netinet/in.h
uint ntohs(uint);

# pcap.h
string pcap_lookupdev(addr);
addr pcap_open_live(string, int, int, int, addr);
int pcap_snapshot(addr);
int pcap_lookupnet(string, addr, addr, addr);
int pcap_compile(addr, addr, string, int, addr);

# pwd.h
string getpass(string);
void endpwent();
addr getpwnam(string);
void setpwent();

# readline/readline.h
string readline(string);

# signal.h
typedef signum = enum(SIGHUP=1, SIGINT=2, SIGQUIT=3, SIGILL=4, SIGTRAP=5, SIGABRT=6, SIGBUS=7, SIGFPE=8, SIGKILL=9, SIGUSR1=10, SIGSEGV=11, SIGUSR2=12, SIGPIPE=13, SIGALRM=14, SIGTERM=15, SIGSTKFLT=16, SIGCHLD=17, SIGCONT=18, SIGSTOP=19, SIGTSTP=20, SIGTTIN=21, SIGTTOU=22, SIGURG=23, SIGXCPU=24, SIGXFSZ=25, SIGVTALRM=26, SIGPROF=27, SIGWINCH=28, SIGIO=29, SIGPWR=30, SIGSYS=31, SIGRTMIN_0=32, SIGRTMIN_1=33, SIGRTMIN_2=34, SIGRTMIN_3=35, SIGRTMIN_4=36, SIGRTMIN_5=37, SIGRTMIN_6=38, SIGRTMIN_7=39, SIGRTMIN_8=40, SIGRTMIN_9=41, SIGRTMIN_10=42, SIGRTMIN_11=43, SIGRTMIN_12=44, SIGRTMIN_13=45, SIGRTMIN_14=46, SIGRTMIN_15=47, SIGRTMIN_16=48, SIGRTMIN_17=49, SIGRTMIN_18=50, SIGRTMIN_19=51, SIGRTMIN_20=52, SIGRTMIN_21=53, SIGRTMIN_22=54, SIGRTMIN_23=55, SIGRTMIN_24=56, SIGRTMIN_25=57, SIGRTMIN_26=58, SIGRTMIN_27=59, SIGRTMIN_28=60, SIGRTMIN_29=61, SIGRTMIN_30=62, SIGRTMIN_31=63);
typedef sigset_t = bitvec(ulong);
# elm3 should be flags
typedef sigaction = struct(addr, sigset_t, hex(int), addr);
int kill(int, signum);
int sigemptyset(+sigset_t*);
int sigaddset(+sigset_t*, signum);
int sigdelset(+sigset_t*, signum);
int sigfillset(+sigset_t*);
int sigismember(sigset_t*, signum);
addr signal(signum,addr);
int sigaction(signum, sigaction*, +sigaction*);
int sigprocmask(enum(SIG_BLOCK=1, SIG_UNBLOCK=2, SIG_SETMASK=3), sigset_t*, +sigset_t*);
int sigpending(+sigset_t*);
int sigsuspend(sigset_t*);
int sigisemptyset(sigset_t*);
int sigorset(+sigset_t*, sigset_t*, sigset_t*);
int sigandset(+sigset_t*, sigset_t*, sigset_t*);

# stdio.h
int fclose(file);
int feof(file);
int ferror(file);
int fflush(file);
char fgetc(file);
addr fgets(+string, int, file);
int fileno(file);
file fopen(string,string);
file fopen64(string,string);
file fdopen(int, string);
int fprintf(file,format);
int fputc(char,file);
int fputs(string,file);
ulong fread(addr,ulong,ulong,file);
ulong fread_unlocked(addr,ulong,ulong,file);
ulong fwrite(string,ulong,ulong,file);
ulong fwrite_unlocked(string,ulong,ulong,file);
int pclose(addr);
void perror(string);
addr popen(string, string);
int printf(format);
int puts(string);
int remove(string);
int snprintf(+string2,ulong,format);
int sprintf(+string,format);
string tempnam(string,string);
int vfprintf(file,string,addr);
int vsnprintf(+string2,ulong,string,addr);
int setvbuf(file,addr,int,ulong);
void setbuf(file,addr);
void setbuffer(file,addr,ulong);
void setlinebuf(file);
int rename(string,string);

# xlocale.h
typedef locale_t = void*;
locale_t newlocale(hex(int), string, locale_t);

# stdlib.h
long __strtol_internal(string, +string*, int);
ulong __strtoul_internal(string, +string*, int);

double strtod(string, +string*);
float strtof(string, +string*);
ldouble strtold(string, +string*);

double strtod_l(string, +string*, locale_t);
float strtof_l(string, +string*, locale_t);
ldouble strtold_l(string, +string*, locale_t);

int atexit(addr);
addr bsearch(string, addr, ulong, ulong, addr);
addr calloc(ulong, ulong);
void exit(int);
void free(addr);
string getenv(string);
int putenv(string);
int setenv(string,string,int);
void unsetenv(string);
addr malloc(ulong);
void qsort(addr,ulong,ulong,addr);
addr realloc(addr,ulong);
int system(string);

int rand();
int rand_r(uint*);
void srand(uint);
long random();
void srandom(uint);
void* initstate(uint, void*, ulong);
void* setstate(void*);
int random_r(void*, +int*);
int srandom_r(uint, void*);
int initstate_r(uint, void*, ulong, void*);
int setstate_r(void*, void*);
double drand48();
double erand48(+array(ushort,3)*);
long lrand48();
long nrand48(+array(ushort,3)*);
long mrand48();
long jrand48(+array(ushort,3)*);
void srand48(long);
array(ushort,3)* seed48(array(ushort,3)*);
void lcong48(array(ushort,7)*);

# string.h
void bcopy(addr,addr,ulong);
void bzero(addr,ulong);
string basename(string);
string index(string,char);
addr memchr(string,char,ulong);
addr memcpy(addr,string(array(char, arg3)*),ulong);
addr memmove(addr,string(array(char, arg3)*),ulong);
addr memset(addr,char,long);
string rindex(string,char);
addr stpcpy(addr,string);
int strcasecmp(string, string);
string strcat(string, string);
string strchr(string,char);
int strcoll(string,string);
ulong strlen(string);
int strcmp(string,string);
addr strcpy(addr,string);
addr strdup(string);
string strerror(int);
int strncmp(string,string,ulong);
addr strncpy(addr,string3,ulong);
string strrchr(string,char);
string strsep(addr,string);
ulong strspn(string,string);
ulong strcspn(string,string);
string strstr(string,string);
string strtok(string, string);

# sys/ioctl.h
int ioctl(int, int, addr);

# sys/socket.h
int socket(int,int,int);

# sys/stat.h
int __fxstat(int,int,addr);
int __xstat(int,string,addr);
int __lxstat(int,string,addr);
int __fxstat64(int,int,addr);
int __xstat64(int,string,addr);
int __lxstat64(int,string,addr);
int chmod(string,octal);
int fchmod(int,octal);
int mkfifo(string,octal);
octal umask(octal);

# sys/utsname.h
int uname(addr);

# sys/vfs.h
int statfs(string,addr);

# syslog.h
void closelog();
void openlog(string,int,int);
void syslog(int,format);

# term.h
int tputs(string, int, addr);

# termios.h
int tcgetattr(int,addr);
int tcsetattr(int,int,addr);

# time.h
string ctime(addr);
int gettimeofday(addr, addr);
addr gmtime(addr);
addr localtime(addr);
ulong strftime(+string2,ulong,string,addr);
long time(addr);
# XXX in fact (time_t, long), which may be (llong, long) on 32-bit
# arches.  We don't have llong as of this writing.
typedef timespec = struct(long, long);
int nanosleep(timespec*, timespec*);

# unistd.h
void _exit(int);
int access(string, int);
uint alarm(uint);
int chdir(string);
int chown(string,int,int);
int close(int);
string crypt(string,string);
int dup2(int,int);
int execlp(string,string,addr,addr,addr);
int execv(string,addr);
int fchdir(int);
int fork();
int ftruncate(int,ulong);
string2 getcwd(addr,ulong);
int getdomainname(+string2,ulong);
int geteuid();
int getegid();
int getgid();
int gethostname(+string2,ulong);
string getlogin();
int getopt(int,addr,string);
int getpid();
int getppid();
int getuid();
int getpgrp();
int setpgrp();
int getpgid(int);
int isatty(int);
int link(string,string);
int mkdir(string,octal);
long read(int, +string[retval], ulong);
int rmdir(string);
int seteuid(uint);
int setgid(int);
int sethostname(+string2,ulong);
int setpgid(int,int);
int setreuid(uint, uint);
int setuid(int);
uint sleep(uint);
int symlink(string,string);
int sync();
int truncate(string,ulong);
string ttyname(int);
int unlink(string);
void usleep(uint);
long write(int, string3, ulong);
addr sbrk(long);
int getpagesize();
long lseek(int,long,int);
int pipe(addr);

# utmp.h
void endutent();
addr getutent();
void setutent();

# wchar.h
typedef wchar_t = string(uint);
typedef wint_t = string(int);
typedef wstring_t = string(array(uint, zero)*);
typedef wstring2_t = string(array(uint, zero(arg2))*);
typedef wstring3_t = string(array(uint, zero(arg3))*);

int fwide(FILE*, int);
wint_t btowc(int);

wint_t getwc(FILE *);
wint_t getwchar();
wint_t fgetwc(FILE*);
wstring_t fgetws(+wstring2_t, int, FILE*);
wint_t ungetwc(wint_t, FILE*);

wint_t fputwc(wchar_t, FILE*);
int fputws(wstring_t, FILE*);
wint_t putwc(wchar_t, FILE*);
wint_t putwchar(wchar_t);

int wprintf(format(wstring_t));
int fwprintf(FILE*, format(wstring_t));
int swprintf(+wstring2_t, ulong, format(wstring_t));
int vfwprintf(FILE*, wstring_t, addr);
int vwprintf(wstring_t, addr);
int vswprintf(+wstring2_t, ulong, wstring_t, addr);

; int wscanf(const wchar_t *restrict, ...);
; int fwscanf(FILE *restrict, const wchar_t *restrict, ...);
; int swscanf(const wchar_t *restrict, const wchar_t *restrict, ...);
; int vfwscanf(FILE *restrict, const wchar_t *restrict, va_list);
; int vswscanf(const wchar_t *restrict, const wchar_t *restrict, va_list);
; int vwscanf(const wchar_t *restrict, va_list);

int iswalnum(wint_t);
int iswalpha(wint_t);
int iswcntrl(wint_t);
int iswdigit(wint_t);
int iswgraph(wint_t);
int iswlower(wint_t);
int iswprint(wint_t);
int iswpunct(wint_t);
int iswspace(wint_t);
int iswupper(wint_t);
int iswxdigit(wint_t);
uint wctype(string);
int iswctype(wint_t, uint);

ulong mbrlen(string, ulong, addr);
ulong mbrtowc(+wchar_t*, string[arg3], ulong, addr);
ulong mbsrtowcs(+wstring3_t, string*, ulong, addr);
ulong wctomb(+string0, wchar_t);
ulong wcrtomb(+string0, wchar_t, addr);
ulong wcsrtombs(+string3, wstring_t*, ulong, addr);
int mbsinit(addr);

wint_t towlower(wint_t);
wint_t towupper(wint_t);

wstring_t wcscat(wstring_t, wstring_t);
wstring_t wcsncat(wstring3_t, wstring_t, ulong);
wstring_t wcschr(wstring_t, wchar_t);
wstring_t wcsrchr(wstring_t, wchar_t);
int wcscmp(wstring_t, wstring_t);
int wcsncmp(wstring3_t, wstring3_t, ulong);
int wcscoll(wstring_t, wstring_t);
addr wcscpy(addr, wstring_t);
addr wcsncpy(addr, wstring_t, ulong);
ulong wcslen(wstring_t);

wstring_t wcsstr(wstring_t, wstring_t);
wstring_t wcswcs(wstring_t, wstring_t);

ulong wcscspn(wstring_t, wstring_t);
ulong wcsspn(wstring_t, wstring_t);
wstring_t wcspbrk(wstring_t, wstring_t);
wstring_t wcstok(wstring_t, wstring_t, +wstring_t*);

ulong wcsftime(+wstring2_t, ulong, wstring_t, addr);

double wcstod(wstring_t, +wstring_t*);
float wcstof(wstring_t, +wstring_t*);
ldouble wcstold(wstring_t, +wstring_t*);
long wcstol(wstring_t, +wstring_t*, int);
llong wcstoll(wstring_t, +wstring_t*, int);
ulong wcstoul(wstring_t, +wstring_t*, int);
ullong wcstoull(wstring_t, +wstring_t*, int);

int wcwidth(wchar_t);
int wcswidth(wstring2_t, ulong);

wstring_t wmemchr(wstring3_t, wchar_t, ulong);
int wmemcmp(wstring3_t, wstring3_t, ulong);
int wctob(wint_t);
wstring3_t wmemcpy(addr, wstring3_t, ulong);
wstring3_t wmemmove(addr, wstring3_t, ulong);
wstring3_t wmemset(addr, wchar_t, ulong);

# sys/wait.h
int wait(addr);
int waitpid(int,addr,int);

# other symbols not included above
long a64l(string);
string l64a(long);
void abort();
int abs(int);
long labs(long);

typedef mntent = struct(string, string, string, string, int, int);
int addmntent(file, mntent*);
int endmntent(file);
int __endmntent(file);
file setmntent(string,string);
file __setmntent(string,string);
mntent *getmntent(addr);
mntent *getmntent_r(file, +mntent*, string, int);
mntent *__getmntent_r(file, +mntent*, string, int);
string hasmntopt(mntent*, string);
