From bfc8570bb8fdbe127659eed83177b5bc5732dc05 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 3 Jan 2014 18:48:43 +0100 Subject: [PATCH] Fix libc function implementations without extern "C" linkage. --- libc/dirent/dir.cpp | 22 +++++++++++----------- libc/libgen/basename.cpp | 2 +- libc/libgen/dirname.cpp | 2 +- libc/signal/sigaction.cpp | 1 + libc/stdlib/realpath.cpp | 1 + 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/libc/dirent/dir.cpp b/libc/dirent/dir.cpp index 99c05a50..dda2cd91 100644 --- a/libc/dirent/dir.cpp +++ b/libc/dirent/dir.cpp @@ -31,7 +31,7 @@ static DIR* firstdir = NULL; -void dregister(DIR* dir) +extern "C" void dregister(DIR* dir) { dir->flags |= _DIR_REGISTERED; if ( !firstdir ) { firstdir = dir; return; } @@ -40,7 +40,7 @@ void dregister(DIR* dir) firstdir = dir; } -void dunregister(DIR* dir) +extern "C" void dunregister(DIR* dir) { if ( !(dir->flags & _DIR_REGISTERED) ) return; @@ -53,7 +53,7 @@ void dunregister(DIR* dir) dir->flags &= ~_DIR_REGISTERED; } -struct dirent* readdir(DIR* dir) +extern "C" struct dirent* readdir(DIR* dir) { if ( !dir->read_func ) { @@ -94,7 +94,7 @@ struct dirent* readdir(DIR* dir) return dir->entry; } -int closedir(DIR* dir) +extern "C" int closedir(DIR* dir) { int result = (dir->close_func) ? dir->close_func(dir->user) : 0; dunregister(dir); @@ -104,31 +104,31 @@ int closedir(DIR* dir) return result; } -void rewinddir(DIR* dir) +extern "C" void rewinddir(DIR* dir) { if ( dir->rewind_func ) dir->rewind_func(dir->user); dir->flags &= ~_DIR_EOF; } -int dirfd(DIR* dir) +extern "C" int dirfd(DIR* dir) { if ( !dir->fd_func ) return errno = EBADF, 0; return dir->fd_func(dir->user); } -void dclearerr(DIR* dir) +extern "C" void dclearerr(DIR* dir) { dir->flags &= ~_DIR_ERROR; } -int derror(DIR* dir) +extern "C" int derror(DIR* dir) { return dir->flags & _DIR_ERROR; } -int deof(DIR* dir) +extern "C" int deof(DIR* dir) { return dir->flags & _DIR_EOF; } @@ -138,7 +138,7 @@ static void dfreedir(DIR* dir) free(dir); } -DIR* dnewdir(void) +extern "C" DIR* dnewdir(void) { DIR* dir = (DIR*) calloc(sizeof(DIR), 1); if ( !dir ) @@ -149,7 +149,7 @@ DIR* dnewdir(void) return dir; } -int dcloseall(void) +extern "C" int dcloseall(void) { int result = 0; while ( firstdir ) diff --git a/libc/libgen/basename.cpp b/libc/libgen/basename.cpp index 6e47a07e..5d0681fe 100644 --- a/libc/libgen/basename.cpp +++ b/libc/libgen/basename.cpp @@ -25,7 +25,7 @@ #include #include -char* basename(char* path) +extern "C" char* basename(char* path) { static char static_stuff[2]; if ( !path || !*path ) diff --git a/libc/libgen/dirname.cpp b/libc/libgen/dirname.cpp index 55a6547e..77660897 100644 --- a/libc/libgen/dirname.cpp +++ b/libc/libgen/dirname.cpp @@ -25,7 +25,7 @@ #include #include -char* dirname(char* path) +extern "C" char* dirname(char* path) { static char static_stuff[2]; if ( !path || !*path ) diff --git a/libc/signal/sigaction.cpp b/libc/signal/sigaction.cpp index 46f54b3c..78487a95 100644 --- a/libc/signal/sigaction.cpp +++ b/libc/signal/sigaction.cpp @@ -29,6 +29,7 @@ const int MAX_SIGNALS = 128; extern sighandler_t handlers[MAX_SIGNALS]; // TODO: Actually implement the sigaction interface for real. +extern "C" int sigaction(int signum, const struct sigaction* restrict act, struct sigaction* restrict oldact) { diff --git a/libc/stdlib/realpath.cpp b/libc/stdlib/realpath.cpp index 144fb3d1..7ea1e389 100644 --- a/libc/stdlib/realpath.cpp +++ b/libc/stdlib/realpath.cpp @@ -30,6 +30,7 @@ #include #include +extern "C" char* realpath(const char* restrict path, char* restrict resolved_path) { char* ret_path = canonicalize_file_name(path);