1 /* This file is part of Netwib. Read and honor its license.
2 */
3 
4 /*-------------------------------------------------------------*/
netwib_priv_notify_string(netwib_priv_notifytype type,netwib_conststring msg)5 netwib_err netwib_priv_notify_string(netwib_priv_notifytype type,
6                                    netwib_conststring msg)
7 {
8   /* currently, we use "fprintf(stderr" on every system. On Windows,
9      we could popup a new window. */
10   if (type == NETWIB_PRIV_NOTIFYTYPE_EMERG ||
11       type == NETWIB_PRIV_NOTIFYTYPE_ALERT) {
12     fprintf(stderr, "\n");
13     fprintf(stderr, "%s\n", "           _          _          _");
14     fprintf(stderr, "%s\n", "          / \\        / \\        / \\");
15     fprintf(stderr, "%s\n", "         / I \\      / I \\      / I \\");
16     fprintf(stderr, "%s\n", "        /  o  \\    /  o  \\    /  o  \\");
17     fprintf(stderr, "%s\n", "       /_______\\  /_______\\  /_______\\");
18     fprintf(stderr, "\n");
19   }
20 
21   fprintf(stderr, "%s\n", msg);
22 
23   if (type == NETWIB_PRIV_NOTIFYTYPE_EMERG) {
24     fprintf(stderr, "%s\n", "This is a fatal error.");
25     fprintf(stderr, "%s\n", "Please contact Laurent.");
26   } else if (type == NETWIB_PRIV_NOTIFYTYPE_ALERT) {
27     fprintf(stderr, "%s\n", "This is a fatal error.");
28     fprintf(stderr, "%s\n", "You must change your program.");
29   } else if (type == NETWIB_PRIV_NOTIFYTYPE_WARNING) {
30     fprintf(stderr, "%s\n", "This is a warning.");
31     fprintf(stderr, "%s\n", "You should correct your program.");
32   }
33 
34   fflush(stderr);
35 
36 #if NETWIB_DEBUG_ERROR_BT==1
37   if (type != NETWIB_PRIV_NOTIFYTYPE_DEBUG) {
38     netwib_string str;
39     fprintf(stderr, "Backtrace : ");
40     netwib_er(netwib_debug_backtrace_string(&str));
41     fprintf(stderr, "%s\n", str);
42     netwib_er(netwib_debug_string_close(&str));
43     fflush(stderr);
44   }
45 #endif
46 
47   if (type == NETWIB_PRIV_NOTIFYTYPE_EMERG ||
48       type == NETWIB_PRIV_NOTIFYTYPE_ALERT) {
49     netwib_er(netwib_priv_program_exit());
50   }
51 
52   return(NETWIB_ERR_OK);
53 }
54 
55 /*-------------------------------------------------------------*/
netwib_priv_notify_fmt(netwib_priv_notifytype type,netwib_conststring fmt,...)56 netwib_err netwib_priv_notify_fmt(netwib_priv_notifytype type,
57                                   netwib_conststring fmt,
58                                   ...)
59 {
60   va_list ap;
61   netwib_err ret;
62   netwib_char arr[4096];
63   netwib_string pc;
64   netwib_buf buf;
65 
66   netwib_er(netwib_buf_init_ext_arraysizeofempty(arr, &buf));
67   va_start(ap, fmt);
68   ret = netwib_priv_buf_append_vfmt(&buf, fmt, &ap);
69   va_end(ap);
70   if (ret != NETWIB_ERR_OK) {
71     netwib__buf_reinit(&buf);
72     netwib_er(netwib_buf_append_string("Error when trying to generate ", &buf));
73     netwib_er(netwib_buf_append_string(fmt, &buf));
74   }
75 
76   netwib_er(netwib_buf_ref_string(&buf, &pc));
77   netwib_er(netwib_priv_notify_string(type, pc));
78 
79   return(NETWIB_ERR_OK);
80 }
81 
82 /*-------------------------------------------------------------*/
netwib_priv_notify_err(netwib_priv_notifytype type,netwib_err error)83 netwib_err netwib_priv_notify_err(netwib_priv_notifytype type,
84                                   netwib_err error)
85 {
86   netwib_buf buf;
87   netwib_string pc;
88   netwib_uint32 varerrno, varherrno, vargetlasterror;
89   netwib_char arr[1024];
90 
91   netwib_er(netwib_priv_err_syserrors(&varerrno, &varherrno,
92                                       &vargetlasterror));
93 
94   netwib_er(netwib_buf_init_ext_arraysizeofempty(arr, &buf));
95   netwib_er(netwib_priv_err_append_err(error, varerrno, varherrno,
96                                      vargetlasterror,
97                                      NETWIB_ERR_ENCODETYPE_FULL, &buf));
98   netwib_er(netwib_buf_ref_string(&buf, &pc));
99   netwib_er(netwib_priv_notify_string(type, pc));
100   return(NETWIB_ERR_OK);
101 }
102 
103