118 lines
2.6 KiB
C
118 lines
2.6 KiB
C
/***************************************************************************
|
|
* 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;
|
|
}
|