/* Initialize the library. This function should be run early. */ gpg_error_t _gpg_err_init (void) { #ifdef HAVE_W32_SYSTEM # ifdef DLL_EXPORT /* We always have a constructor and thus this function is called automatically. Due to the way the C init code of mingw works, the constructors are called before our DllMain function is called. The problem with that is that the TLS has not been setup and w32-gettext.c requires TLS. To solve this we do nothing here but call the actual init code from our DllMain. */ # else /*!DLL_EXPORT*/ /* Note that if the TLS is actually used, we can't release the TLS as there is no way to know when a thread terminates (i.e. no thread-specific-atexit). You are really better off to use the DLL! */ if (tls_index == TLS_OUT_OF_INDEXES) { tls_index = TlsAlloc (); if (tls_index == TLS_OUT_OF_INDEXES) { /* No way to continue - commit suicide. */ abort (); } _gpg_w32__init_gettext_module (); real_init (); } # endif /*!DLL_EXPORT*/ #else real_init (); #endif return 0; }
int WINAPI DllMain (HINSTANCE hinst, DWORD reason, LPVOID reserved) { struct tls_space_s *tls; (void)reserved; (void)hinst; switch (reason) { case DLL_PROCESS_ATTACH: tls_index = TlsAlloc (); if (tls_index == TLS_OUT_OF_INDEXES) return FALSE; #ifndef _GPG_ERR_HAVE_CONSTRUCTOR /* If we have not constructors (e.g. MSC) we call it here. */ _gpg_w32__init_gettext_module (); #endif /* falltru. */ case DLL_THREAD_ATTACH: tls = LocalAlloc (LPTR, sizeof *tls); if (!tls) return FALSE; tls->gt_use_utf8 = 0; TlsSetValue (tls_index, tls); if (reason == DLL_PROCESS_ATTACH) { real_init (); } break; case DLL_THREAD_DETACH: tls = TlsGetValue (tls_index); if (tls) LocalFree (tls); break; case DLL_PROCESS_DETACH: tls = TlsGetValue (tls_index); if (tls) LocalFree (tls); TlsFree (tls_index); break; default: break; } return TRUE; }
/* Initialize the library. This function should be run early. */ gpg_error_t gpg_err_init (void) { #ifdef HAVE_W32_SYSTEM /* We always have a constructor and thus this function is called automatically. Due to the way the C init code of mingw works, the constructors are called before our DllMain function is called. The problem with that is that the TLS has not been setup and w32-gettext.c requires TLS. To solve this we do nothing here but call the actual init code from our DllMain. */ #else real_init (); #endif return 0; }
/* Entry point called by the DLL loader. */ int WINAPI DllMain (HINSTANCE hinst, DWORD reason, LPVOID reserved) { struct tls_space_s *tls; (void)reserved; switch (reason) { case DLL_PROCESS_ATTACH: tls_index = TlsAlloc (); if (tls_index == TLS_OUT_OF_INDEXES) return FALSE; /* falltru. */ case DLL_THREAD_ATTACH: tls = LocalAlloc (LPTR, sizeof *tls); if (!tls) return FALSE; tls->gt_use_utf8 = 0; TlsSetValue (tls_index, tls); if (reason == DLL_PROCESS_ATTACH) { real_init (); } break; case DLL_THREAD_DETACH: tls = TlsGetValue (tls_index); if (tls) LocalFree (tls); break; case DLL_PROCESS_DETACH: tls = TlsGetValue (tls_index); if (tls) LocalFree (tls); TlsFree (tls_index); break; default: break; } return TRUE; }
int main() { //Start video driver (must always be before loading message) mm_init(); pg_init(); real_init(); video_init(); video_setdriver(video_vgatext_getdriver(),0); //Put loading message cli_puts("ArcaneOS Loading...\n"); //Setup kernel gdt_init(); idt_init(); isr_init(); irq_init(); timer_init(); kb_init(); ui_init(); cpuid_init(); cmos_init(); rtc_init(); acpi_init(); power_init(); mt_init(); syscall_init(); floppy_init(); __asm__ __volatile__ ("sti"); //Enable ACPI acpi_enable(); //Create thread for ui mt_create_thread(mt_kernel_process,test,2); //Endless loop to prevent bugs when all threads are sleeping for(;;) __asm__ __volatile__ ("hlt"); }
static void wrapper_init(void) { int stdin_flags; int c; /* The first call to print to a stream will cause glibc to * invoke the fstat system call, which will cause SECCOMP * to kill the process. There does not seem to be any way * of working around this problem except to print some output * on the stdout and strerr streams before entering SECCOMP mode. * Unfortunately, a printf call that generates no output doesn't * work, so some extraneous output seems unavoidable. Fortunately, * this is easy to filter out as a post-processing step. */ fprintf(stdout, "<<entering SECCOMP mode>>\n"); fflush(stdout); fprintf(stderr, "<<entering SECCOMP mode>>\n"); fflush(stderr); /* The first call to read from stdin will also result in a * call to fstat. Work around this by setting the stdin * file descriptor to nonblocking, then reading a single character * from stdin. */ stdin_flags = fcntl(0, F_GETFL, 0); fcntl(0, F_SETFL, stdin_flags | O_NONBLOCK); /* make stdin nonblocking */ c = fgetc(stdin); if (c != EOF) { /* We read a character, so put it back */ ungetc(c, stdin); } fcntl(0, F_SETFL, stdin_flags); /* restore original stdin flags */ #if 1 /* Enter SECCOMP mode */ if (prctl(PR_SET_SECCOMP, 1, 0, 0) == -1) { _exit(SECCOMP_FAILED); } #endif /* Call the real init function */ real_init(); }