Added support for DE200C VFD
[lcdproc-de200c.git] / contrib / patches / lcdprocserverSEG.diff
blob80e0f2f8d0257e27ba5dfea0f5b6d32ba4599da8
1 diff -Nuarp server/main.c server.SEG/main.c
2 --- server/main.c 2006-01-26 19:47:59.000000000 -0800
3 +++ server.SEG/main.c 2006-02-21 09:14:08.000000000 -0800
4 @@ -165,6 +165,31 @@
5 #define CHAIN(e,f) { if (e>=0) { e=(f); }}
6 #define CHAIN_END(e,msg) { if (e<0) { report(RPT_CRIT,(msg)); exit(e); }}
8 +#ifndef SEG //sigsegv handler for stackdump
9 +#include <stdio.h>
10 +#include <stdlib.h>
11 +#include <string.h>
12 +#include <execinfo.h>
13 +#include <signal.h>
14 +#include <time.h>
15 +#include <fcntl.h>
16 +#define STACKDUMP_FILENAME "/tmp/LCDdStackDump"
18 +#ifndef DWORD
19 +#define DWORD unsigned long
20 +#endif
23 +int InstallSigSegvHandler();
24 +void SigSegvHandler(int nSig, siginfo_t *pSigInfo, void *pAddr);
25 +unsigned GetFreeMem( unsigned long* pTotalMem, unsigned long* pUsedMem, unsigned long* pFreeMem, unsigned long* pBuffers, unsigned long* pCached );
28 +struct sigaction SigTerm;
29 +struct sigaction SigPipe;
30 +struct sigaction SigSegv;
32 +#endif /*SEG*/
34 int
35 main(int argc, char **argv)
36 @@ -172,6 +197,10 @@
37 int e = 0;
38 pid_t parent_pid = 0;
40 +#ifndef SEG //sigsegv handler for stackdump
41 + InstallSigSegvHandler();
42 +#endif /*SEG*/
44 stored_argc = argc;
45 stored_argv = argv;
47 @@ -1036,3 +1065,100 @@
48 * help message.
52 +#ifndef SEG //sigsegv handler for stackdump
53 +int InstallSigSegvHandler()
55 + SigSegv.sa_sigaction = SigSegvHandler;
56 + sigemptyset( &SigSegv.sa_mask );
57 + SigSegv.sa_flags = SA_SIGINFO;
59 + sigaddset (&SigSegv.sa_mask, SIGINT);
60 + sigaddset (&SigSegv.sa_mask, SIGTSTP);
61 + sigaddset (&SigSegv.sa_mask, SIGQUIT);
62 + sigaddset (&SigSegv.sa_mask, SIGTERM);
64 + return sigaction( SIGSEGV, &SigSegv, NULL);
67 +void SigSegvHandler(int nSig, siginfo_t *pSigInfo, void *pAddr)
69 + void *array[50];
70 + size_t size;
71 + char **strings;
72 + size_t i;
74 + FILE* fd = fopen( STACKDUMP_FILENAME, "w" );
75 + DWORD dwTotalMem, dwUsedMem, dwFreeMem, dwCached, dwBuffers, dwTotalFree;
76 + time_t now;
77 + struct tm date_time;
78 + now = time(NULL);
79 + date_time = *localtime(&now);
80 + fprintf( fd, "Dump Created : %s",asctime(&date_time));
82 + dwTotalFree = GetFreeMem( &dwTotalMem, &dwUsedMem, &dwFreeMem, &dwBuffers, &dwCached );
83 + fprintf( fd, "Free memory %lX ......\n", dwTotalFree );
85 + if ( pSigInfo->si_signo == SIGSEGV )
86 + fprintf( fd, "Segmentation fault at Address %X ......\n", (unsigned)pSigInfo->si_addr );
88 + switch( pSigInfo->si_code )
89 + {
90 + case SI_KERNEL:
91 + fprintf( fd, "Sent by Kernel at Address %X ......\n", (unsigned)pSigInfo->si_addr );
92 + break;
94 + case SEGV_MAPERR:
95 + fprintf( fd, "Mapping Error at Address %X ......\n", (unsigned)pSigInfo->si_addr );
96 + break;
98 + case SEGV_ACCERR:
99 + fprintf( fd, "Permisson Error at Address %X ......\n", (unsigned)pSigInfo->si_addr );
100 + break;
103 + size = backtrace (array, 50);
104 + strings = backtrace_symbols (array, size);
106 + fprintf ( fd, "Obtained %d stack frames.\n", size);
108 + for (i = 0; i < size; i++)
109 + fprintf ( fd, "%s\n", strings[i]);
111 + fclose( fd );
112 + free (strings);
113 + signal (nSig, SIG_DFL);
114 + raise (nSig);
117 +unsigned GetFreeMem( unsigned long* pTotalMem, unsigned long* pUsedMem, unsigned long* pFreeMem, unsigned long* pBuffers, unsigned long* pCached )
119 + char buffer[1024];
120 + long garbage;
121 + int nSize;
122 + char* lpStr;
123 + int fd = 0;
125 + fd = open("/proc/meminfo", O_RDONLY );
127 + if ( fd > 0 )
129 + *pFreeMem = 0;
130 + *pCached = 0;
131 + *pBuffers = 0;
133 + nSize = read( fd, buffer, 1024 );
134 + close( fd );
136 + lpStr = strstr( buffer, "Mem:" );
137 + if ( lpStr )
138 + sscanf( lpStr, "Mem: %lu %lu %lu %lu %lu %lu\n", pTotalMem, pUsedMem, pFreeMem, &garbage, pBuffers, pCached);
140 + else
142 + return 0;
145 + return (*pFreeMem+*pBuffers+*pCached);
147 +#endif /*SEG*/