| /*************************************************************************** | |
| * Copyright 1995, Technion, Israel Institute of Technology | |
| * Electrical Eng, Software Lab. | |
| * Author: Michael Veksler. | |
| *************************************************************************** | |
| * File: dde_proc.c | |
| * Purpose : test DDE signals and processes functionality for DDE | |
| * Usage: run two independant processes, one with an argument another | |
| * without (with the argument is the server). | |
| *************************************************************************** | |
| */ | |
| #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) | |
| #include <sys/syscall.h> | |
| #include <sys/param.h> | |
| #else | |
| #include <syscall.h> | |
| #endif | |
| #include <stdio.h> | |
| #include <unistd.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <signal.h> | |
| #include <win.h> | |
| #include "dde.h" | |
| #include "dde_proc.h" | |
| #include "shm_main_blk.h" | |
| #if !defined(BSD4_4) || defined(linux) || defined(__FreeBSD__) | |
| char * cstack[4096]; | |
| #endif | |
| #ifdef linux | |
| extern void ___sig_restore(); | |
| extern void ___masksig_restore(); | |
| /* Similar to the sigaction function in libc, except it leaves alone the | |
| restorer field */ | |
| static int | |
| wine_sigaction(int sig,struct sigaction * new, struct sigaction * old) | |
| { | |
| __asm__("int $0x80":"=a" (sig) | |
| :"0" (SYS_sigaction),"b" (sig),"c" (new),"d" (old)); | |
| if (sig>=0) | |
| return 0; | |
| errno = -sig; | |
| return -1; | |
| } | |
| #endif | |
| struct sigaction usr2_act; | |
| void init_signals() | |
| { | |
| #ifdef linux | |
| usr2_act.sa_handler = (__sighandler_t) stop_wait; | |
| usr2_act.sa_flags = 0; | |
| usr2_act.sa_restorer = | |
| (void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3); | |
| wine_sigaction(SIGUSR2,&usr2_act,NULL); | |
| #endif | |
| #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) | |
| usr2_act.sa_hadnler = (void (*)) stop_wait; | |
| usr2_act.sa_flags = SA_ONSTACK; | |
| usr2_act.sa_mask = sig_mask; | |
| usr2_act.sa_restorer = | |
| (void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3); | |
| if (sigaction(SIGUSR2,&usr2_act,NULL) <0) { | |
| perror("sigaction: SIGUSR2"); | |
| exit(1); | |
| } | |
| #endif | |
| } | |
| void ATOM_GlobalInit() | |
| { | |
| printf("ATOM_GlobalInit\n"); | |
| } | |
| void idle_loop() | |
| { | |
| int timeout; | |
| for(timeout=500; timeout ; timeout--) { | |
| if (DDE_GetRemoteMessage()) | |
| exit(0); ; | |
| usleep(1000); | |
| } | |
| exit(-1); | |
| } | |
| void client() | |
| { | |
| MSG msg; | |
| msg.hwnd=(HWND)-1; | |
| msg.message= WM_DDE_INITIATE; | |
| msg.wParam= 3; | |
| msg.lParam= 4; | |
| if (!DDE_SendMessage(&msg)) | |
| exit(-1); | |
| idle_loop(); | |
| } | |
| void server() | |
| { | |
| DDE_IPC_init(); | |
| idle_loop(); | |
| } | |
| int main(int argc, char *argv[]) | |
| { | |
| printf("Kill when done one message\n"); | |
| init_signals(); | |
| if (argc>1) | |
| server(); | |
| else | |
| client(); | |
| return 0; | |
| } |