home · contact · privacy
MAJOR re-write. Split plomrogue into a server and a client. Re-wrote large parts
[plomrogue] / src / common / rexit.c
1 /* src/common/rexit.c */
2
3 #include "rexit.h"
4 #include <errno.h> /* global errno */
5 #include <stdint.h> /* uint16_t */
6 #include <stdio.h> /* printf(), perror(), sprintf() */
7 #include <stdlib.h> /* exit(), EXIT_FAILURE */
8 #include <string.h> /* strlen() */
9
10
11
12 void (* cleanup_func) ();
13
14
15
16 extern void set_cleanup_func(void (* f)())
17 {
18     cleanup_func = f;
19 }
20
21
22
23 extern void exit_err(int err, char * msg)
24 {
25     if (0 == err)
26     {
27         return;
28     }
29     cleanup_func();
30     if (NULL == msg)
31     {
32         msg = "Details unknown.";
33     }
34     printf("Aborted program due to error. %s\n"
35             "Internal error code: %d\n",
36             msg, err);
37     if (0 != errno)
38     {
39         perror("errno states");
40     }
41     exit(EXIT_FAILURE);
42 }
43
44
45
46 extern void exit_trouble(int err, char * parent, char * child)
47 {
48     char * p1 = "Trouble in ";
49     char * p2 = " with ";
50     char * p3 = ".";
51     uint16_t size = strlen(p1) + strlen(parent) + strlen(p2) + strlen(child)
52                     + strlen(p3) + 1;
53     char msg[size];
54     sprintf(msg, "%s%s%s%s%s", p1, parent, p2, child, p3);
55     exit_err(err, msg);
56 }