Merge branch 'obi/master' into experimental
[vuplus_dvbapp] / main / bsod.cpp
old mode 100755 (executable)
new mode 100644 (file)
index c036283..a119432
@@ -1,48 +1,52 @@
-#include <string.h>
-#include <signal.h>
-#include <asm/ptrace.h>
-
+#include <csignal>
+#include <fstream>
+#include <sstream>
 #include <lib/base/eenv.h>
 #include <lib/base/eerror.h>
-#include <lib/base/smartptr.h>
 #include <lib/base/nconfig.h>
-#include <lib/gdi/grc.h>
-#include <lib/gdi/gfbdc.h>
-#ifdef WITH_SDL
-#include <lib/gdi/sdl.h>
+#include <lib/gdi/gmaindc.h>
+
+#if defined(__MIPSEL__)
+#include <asm/ptrace.h>
+#else
+#warning "no oops support!"
+#define NO_OOPS_SUPPORT
 #endif
 
-#include "version.h"
+#include "xmlgenerator.h"
+#include "version_info.h"
 
 /************************************************/
 
 #define CRASH_EMAILADDR "crashlog@dream-multimedia-tv.de"
-#define STDBUFFER_SIZE 512
+#define INFOFILE "/maintainer.info"
+
 #define RINGBUFFER_SIZE 16384
 static char ringbuffer[RINGBUFFER_SIZE];
-static int ringbuffer_head;
+static unsigned int ringbuffer_head;
 
-static void addToLogbuffer(const char *data, int len)
+static void addToLogbuffer(const char *data, unsigned int len)
 {
        while (len)
        {
-               int remaining = RINGBUFFER_SIZE - ringbuffer_head;
-       
+               unsigned int remaining = RINGBUFFER_SIZE - ringbuffer_head;
+
                if (remaining > len)
                        remaining = len;
-       
+
                memcpy(ringbuffer + ringbuffer_head, data, remaining);
                len -= remaining;
                data += remaining;
                ringbuffer_head += remaining;
-               if (ringbuffer_head >= RINGBUFFER_SIZE)
+               ASSERT(ringbuffer_head <= RINGBUFFER_SIZE);
+               if (ringbuffer_head == RINGBUFFER_SIZE)
                        ringbuffer_head = 0;
        }
 }
 
-static std::string getLogBuffer()
+static const std::string getLogBuffer()
 {
-       int begin = ringbuffer_head;
+       unsigned int begin = ringbuffer_head;
        while (ringbuffer[begin] == 0)
        {
                ++begin;
@@ -51,12 +55,11 @@ static std::string getLogBuffer()
                if (begin == ringbuffer_head)
                        return "";
        }
+
        if (begin < ringbuffer_head)
                return std::string(ringbuffer + begin, ringbuffer_head - begin);
        else
-       {
                return std::string(ringbuffer + begin, RINGBUFFER_SIZE - begin) + std::string(ringbuffer, ringbuffer_head);
-       }
 }
 
 static void addToLogbuffer(int level, const std::string &log)
@@ -64,117 +67,67 @@ static void addToLogbuffer(int level, const std::string &log)
        addToLogbuffer(log.c_str(), log.size());
 }
 
-static std::string getConfigFileValue(const char *entry)
+static const std::string getConfigString(const std::string &key, const std::string &defaultValue)
 {
-       std::string configfile = eEnv::resolve("${sysconfdir}/enigma2/settings");
-       std::string configvalue;
-       if (entry)
-       {
-               ePythonConfigQuery::getConfigValue(entry, configvalue);
-               if (configvalue != "") //we get at least the default value if python is still alive
-               {
-                       return configvalue;
-               }
-               else // get value from enigma2 settings file
-               {
-                       FILE *f = fopen(configfile.c_str(), "r");
-                       if (!f)
-                       {
-                               return "Error";
-                       }
-                       while (1)
-                       {
-                               char line[1024];
-                               if (!fgets(line, 1024, f))
-                                       break;
-                               if (!strncmp(line, entry, strlen(entry) ))
-                               {
-                                       if (strlen(line) && line[strlen(line)-1] == '\r')
-                                               line[strlen(line)-1] = 0;
-                                       if (strlen(line) && line[strlen(line)-1] == '\n')
-                                               line[strlen(line)-1] = 0;
-                                       std::string tmp = line;
-                                       int posEqual = tmp.find("=", 0);
-                                       configvalue = tmp.substr(posEqual+1);
-                               }
-                       }
-                       fclose(f);
-                       return configvalue;
-               }
-       }
-}
+       std::string value;
 
-static std::string getFileContent(const char *file)
-{
-       std::string filecontent;
+       ePythonConfigQuery::getConfigValue(key.c_str(), value);
+       //we get at least the default value if python is still alive
+       if (!value.empty())
+               return value;
 
-       if (file)
-       {
-               FILE *f = fopen(file, "r");
-               if (!f)
-               {
-                       return "Error";
-               }
-               while (1)
-               {
-                       char line[1024];
-                       if (!fgets(line, 1024, f))
+       value = defaultValue;
+
+       // get value from enigma2 settings file
+       std::ifstream in(eEnv::resolve("${sysconfdir}/enigma2/settings").c_str());
+       if (in.good()) {
+               do {
+                       std::string line;
+                       std::getline(in, line);
+                       size_t size = key.size();
+                       if (!key.compare(0, size, line) && line[size] == '=') {
+                               value = line.substr(size + 1);
                                break;
-                       std::string tmp = line;
-                       std::string password;
-                       int pwdpos = tmp.find(".password=", 0);
-                       if( pwdpos != std::string::npos)
-                       {
-                               filecontent += tmp.substr(0,pwdpos +10);
-                               for ( int pos = pwdpos +10; pos < tmp.length()-1; ++pos )
-                               {
-                                       filecontent += "X";
-                               }
-                               filecontent += "\n";
-                       }
-                       else {
-                               filecontent += line;
                        }
-               }
-               fclose(f);
+               } while (in.good());
+               in.close();
        }
-       return filecontent;
-}
 
-static std::string execCommand(std::string cmd) {
-       FILE* pipe = popen(cmd.c_str(), "r");
-       if (!pipe)
-               return "Error";
-       char buffer[STDBUFFER_SIZE];
-       std::string result = "";
-       while(!feof(pipe))
-       {
-               if(!fgets(buffer,STDBUFFER_SIZE, pipe))
-                       break;
-               result += buffer;
-       }
-       pclose(pipe);
-       return result;
+       return value;
 }
 
-#define INFOFILE "/maintainer.info"
+static bool getConfigBool(const std::string &key, bool defaultValue)
+{
+       std::string value = getConfigString(key, defaultValue ? "true" : "false");
+       const char *cvalue = value.c_str();
+
+       if (!strcasecmp(cvalue, "true"))
+               return true;
+       if (!strcasecmp(cvalue, "false"))
+               return false;
+
+       return defaultValue;
+}
 
 void bsodFatal(const char *component)
 {
-       char logfile[128];
-       sprintf(logfile, "/media/hdd/enigma2_crash_%u.log", (unsigned int)time(0));
-       FILE *f = fopen(logfile, "wb");
+       std::ostringstream os;
+       os << time(0);
+
+       std::string logfile("/media/hdd/enigma2_crash_" + os.str() + ".log");
+
+       FILE *f = fopen(logfile.c_str(), "wb");
        
        std::string lines = getLogBuffer();
        
                /* find python-tracebacks, and extract "  File "-strings */
        size_t start = 0;
        
-       char crash_emailaddr[256] = CRASH_EMAILADDR;
-       char crash_component[256] = "enigma2";
+       std::string crash_emailaddr = CRASH_EMAILADDR;
+       std::string crash_component = "enigma2";
 
        if (component)
-               snprintf(crash_component, 256, component);
+               crash_component = component;
        else
        {
                while ((start = lines.find("\n  File \"", start)) != std::string::npos)
@@ -191,21 +144,12 @@ void bsodFatal(const char *component)
 
                        if (end == std::string::npos)
                                break;
-                       if (end - start >= (256 - strlen(INFOFILE)))
-                               continue;
-                       char filename[256];
-                       snprintf(filename, 256, "%s%s", lines.substr(start, end - start).c_str(), INFOFILE);
-                       FILE *cf = fopen(filename, "r");
-                       if (cf)
-                       {
-                               fgets(crash_emailaddr, sizeof crash_emailaddr, cf);
-                               if (*crash_emailaddr && crash_emailaddr[strlen(crash_emailaddr)-1] == '\n')
-                                       crash_emailaddr[strlen(crash_emailaddr)-1] = 0;
-
-                               fgets(crash_component, sizeof crash_component, cf);
-                               if (*crash_component && crash_component[strlen(crash_component)-1] == '\n')
-                                       crash_component[strlen(crash_component)-1] = 0;
-                               fclose(cf);
+
+                       std::string filename(lines.substr(start, end - start) + INFOFILE);
+                       std::ifstream in(filename.c_str());
+                       if (in.good()) {
+                               std::getline(in, crash_emailaddr) && std::getline(in, crash_component);
+                               in.close();
                        }
                }
        }
@@ -213,207 +157,109 @@ void bsodFatal(const char *component)
        if (f)
        {
                time_t t = time(0);
-               char crashtime[STDBUFFER_SIZE];
-               sprintf(crashtime, "%s",ctime(&t));
-               if (strlen(crashtime) && crashtime[strlen(crashtime)-1] == '\n')
-                               crashtime[strlen(crashtime)-1] = 0;
-               fprintf(f, "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n<opendreambox>\n");
-               fprintf(f, "\t<enigma2>\n");
-               fprintf(f, "\t\t<crashdate>%s</crashdate>\n", crashtime);
-#ifdef ENIGMA2_CHECKOUT_TAG
-               fprintf(f, "\t\t<checkouttag>" ENIGMA2_CHECKOUT_TAG "</checkouttag>\n");
-#else
-               fprintf(f, "\t\t<compiledate>" __DATE__ "</compiledate>\n");
-#endif
-#ifdef ENIGMA2_CHECKOUT_ROOT
-               fprintf(f, "\t\t<checkoutroot>" ENIGMA2_CHECKOUT_ROOT "</checkoutroot>\n");
-#endif
-               fprintf(f, "\t\t<contactemail>%s</contactemail>\n", crash_emailaddr);
-               fprintf(f, "\t\t<!-- Please email this crashlog to above address -->\n");
-               std::string activeSkin = getConfigFileValue("config.skin.primary_skin");
-               if (activeSkin != "Error")
-               {
-                       if (activeSkin == "")
-                               activeSkin = "Default Skin";
-                       fprintf(f, "\t\t<skin>%s</skin>\n", activeSkin.c_str());
-               }
-               fprintf(f, "\t</enigma2>\n");
+               struct tm tm;
+               char tm_str[32];
 
-               fprintf(f, "\t<image>\n");
-               std::string model = getFileContent("/proc/stb/info/model");
-               if (model != "Error")
-               {
-                       char modelname[STDBUFFER_SIZE];
-                       sprintf(modelname, "%s",model.c_str());
-                       if (strlen(modelname) && modelname[strlen(modelname)-1] == '\n')
-                               modelname[strlen(modelname)-1] = 0;
-                       fprintf(f, "\t\t<dreamboxmodel>%s</dreamboxmodel>\n", modelname);
-               }
-               std::string kernel = getFileContent("/proc/cmdline");
-               if (kernel != "Error")
-               {
-                       char kernelcmd[STDBUFFER_SIZE];
-                       sprintf(kernelcmd, "%s",kernel.c_str());
-                       if (strlen(kernelcmd) && kernelcmd[strlen(kernelcmd)-1] == '\n')
-                               kernelcmd[strlen(kernelcmd)-1] = 0;
-                       fprintf(f, "\t\t<kernelcmdline>%s</kernelcmdline>\n", kernelcmd);
-               }
-               std::string sendAnonCrashlog = getConfigFileValue("config.plugins.crashlogautosubmit.sendAnonCrashlog");
-               if (sendAnonCrashlog == "False" || sendAnonCrashlog == "false") // defaults to true... default anonymized crashlogs
-               {
-                       std::string ca = getFileContent("/proc/stb/info/ca");
-                       if (ca != "Error")
-                       {
-                               char dreamboxca[STDBUFFER_SIZE];
-                               sprintf(dreamboxca, "%s",ca.c_str());
-                               if (strlen(dreamboxca) && dreamboxca[strlen(dreamboxca)-1] == '\n')
-                                       dreamboxca[strlen(dreamboxca)-1] = 0;
-                               fprintf(f, "\t\t<dreamboxca>\n\t\t<![CDATA[\n%s\n\t\t]]>\n\t\t</dreamboxca>\n", dreamboxca);
-                       }
-                       std::string settings = getFileContent(eEnv::resolve("${sysconfdir}/enigma2/settings").c_str());
-                       if (settings != "Error")
-                       {
-                               fprintf(f, "\t\t<enigma2settings>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</enigma2settings>\n", settings.c_str());
-                       }
-               }
-               std::string addNetwork = getConfigFileValue("config.plugins.crashlogautosubmit.addNetwork");
-               if (addNetwork == "True" || addNetwork == "true")
-               {
-                       std::string nwinterfaces = getFileContent("/etc/network/interfaces");
-                       if (nwinterfaces != "Error")
-                       {
-                               fprintf(f, "\t\t<networkinterfaces>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</networkinterfaces>\n", nwinterfaces.c_str());
-                       }
-                       std::string dns = getFileContent("/etc/resolv.conf");
-                       if (dns != "Error")
-                       {
-                               fprintf(f, "\t\t<dns>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</dns>\n", dns.c_str());
-                       }
-                       std::string defaultgw = getFileContent("/etc/default_gw");
-                       if (defaultgw != "Error")
-                       {
-                               char gateway[STDBUFFER_SIZE];
-                               sprintf(gateway, "%s",defaultgw.c_str());
-                               if (strlen(gateway) && gateway[strlen(gateway)-1] == '\n')
-                                       gateway[strlen(gateway)-1] = 0;
-                               fprintf(f, "\t\t<defaultgateway>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</defaultgateway>\n", gateway);
-                       }
-               }
-               std::string addWlan = getConfigFileValue("config.plugins.crashlogautosubmit.addWlan");
-               if (addWlan == "True" || addWlan == "true")
-               {
-                       std::string wpasupplicant = getFileContent("/etc/wpa_supplicant.conf");
-                       if (wpasupplicant != "Error")
-                       {
-                               fprintf(f, "\t\t<wpasupplicant>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</wpasupplicant>\n", wpasupplicant.c_str());
-                       }
-               }
-               std::string imageversion = getFileContent("/etc/image-version");
-               if (imageversion != "Error")
-               {
-                       fprintf(f, "\t\t<imageversion>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</imageversion>\n", imageversion.c_str());
+               localtime_r(&t, &tm);
+               strftime(tm_str, sizeof(tm_str), "%a %b %_d %T %Y", &tm);
+
+               XmlGenerator xml(f);
+
+               xml.open("opendreambox");
+
+               xml.open("enigma2");
+               xml.string("crashdate", tm_str);
+               xml.string("compiledate", __DATE__);
+               xml.string("contactemail", crash_emailaddr);
+               xml.comment("Please email this crashlog to above address");
+
+               xml.string("skin", getConfigString("config.skin.primary_skin", "Default Skin"));
+               xml.string("sourcedate", enigma2_date);
+               xml.string("branch", enigma2_branch);
+               xml.string("rev", enigma2_rev);
+               xml.string("version", PACKAGE_VERSION);
+               xml.close();
+
+               xml.open("image");
+               xml.stringFromFile("dreamboxmodel", "/proc/stb/info/model");
+               xml.stringFromFile("kernelcmdline", "/proc/cmdline");
+               xml.stringFromFile("nimsockets", "/proc/bus/nim_sockets");
+               if (!getConfigBool("config.plugins.crashlogautosubmit.sendAnonCrashlog", true)) {
+                       xml.cDataFromFile("dreamboxca", "/proc/stb/info/ca");
+                       xml.cDataFromFile("enigma2settings", eEnv::resolve("${sysconfdir}/enigma2/settings"), ".password=");
                }
-               std::string imageissue = getFileContent("/etc/issue.net");
-               if (imageissue != "Error")
-               {
-                       fprintf(f, "\t\t<imageissue>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</imageissue>\n", imageissue.c_str());
+               if (getConfigBool("config.plugins.crashlogautosubmit.addNetwork", false)) {
+                       xml.cDataFromFile("networkinterfaces", "/etc/network/interfaces");
+                       xml.cDataFromFile("dns", "/etc/resolv.conf");
+                       xml.cDataFromFile("defaultgateway", "/etc/default_gw");
                }
-               fprintf(f, "\t</image>\n");
-
-               fprintf(f, "\t<software>\n");
-               std::string installedplugins = execCommand("ipkg list_installed | grep enigma2");
-               fprintf(f, "\t\t<enigma2software>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</enigma2software>\n", installedplugins.c_str());
-               std::string dreambox = execCommand("ipkg list_installed | grep dream");
-               fprintf(f, "\t\t<dreamboxsoftware>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</dreamboxsoftware>\n", dreambox.c_str());
-               std::string gstreamer = execCommand("ipkg list_installed | grep gst");
-               fprintf(f, "\t\t<gstreamersoftware>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</gstreamersoftware>\n", gstreamer.c_str());
-               fprintf(f, "\t</software>\n");
-
-               fprintf(f, "\t<crashlogs>\n");
-               std::string buffer = getLogBuffer();
-               fprintf(f, "\t\t<enigma2crashlog>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</enigma2crashlog>\n", buffer.c_str());
-               std::string pythonmd5 = execCommand("find " + eEnv::resolve("${libdir}/enigma2/python/") + " -name \"*.py\" | xargs md5sum");
-               fprintf(f, "\t\t<pythonMD5sum>\n\t\t<![CDATA[\n%s\t\t]]>\n\t\t</pythonMD5sum>\n", pythonmd5.c_str());
-               fprintf(f, "\t</crashlogs>\n");
-
-               fprintf(f, "\n</opendreambox>\n");
+               if (getConfigBool("config.plugins.crashlogautosubmit.addWlan", false))
+                       xml.cDataFromFile("wpasupplicant", "/etc/wpa_supplicant.conf");
+               xml.cDataFromFile("imageversion", "/etc/image-version");
+               xml.cDataFromFile("imageissue", "/etc/issue.net");
+               xml.close();
+
+               xml.open("software");
+               xml.cDataFromCmd("enigma2software", "opkg list_installed | grep enigma2");
+               xml.cDataFromCmd("dreamboxsoftware", "opkg list_installed | grep dream");
+               xml.cDataFromCmd("gstreamersoftware", "opkg list_installed | grep gst");
+               xml.close();
+
+               xml.open("crashlogs");
+               xml.cDataFromString("enigma2crashlog", getLogBuffer());
+               xml.cDataFromCmd("pythonMD5sum", "find " + eEnv::resolve("${libdir}/enigma2/python/") + " -name \"*.py\" | xargs md5sum");
+               xml.close();
+
+               xml.close();
+
                fclose(f);
-               
        }
-       
-#ifdef WITH_SDL
-       ePtr<gSDLDC> my_dc;
-       gSDLDC::getInstance(my_dc);
-#else
-       ePtr<gFBDC> my_dc;
-       gFBDC::getInstance(my_dc);
-#endif
-       
-       {
-               gPainter p(my_dc);
-               p.resetOffset();
-               p.resetClip(eRect(ePoint(0, 0), my_dc->size()));
-#ifdef ENIGMA2_CHECKOUT_TAG
-               if (ENIGMA2_CHECKOUT_TAG[0] == 'T') /* tagged checkout (release) */
-                       p.setBackgroundColor(gRGB(0x0000C0));
-               else if (ENIGMA2_CHECKOUT_TAG[0] == 'D') /* dated checkout (daily experimental build) */
-               {
-                       srand(time(0));
-                       int r = rand();
-                       unsigned int col = 0;
-                       if (r & 1)
-                               col |= 0x800000;
-                       if (r & 2)
-                               col |= 0x008000;
-                       if (r & 4)
-                               col |= 0x0000c0;
-                       p.setBackgroundColor(gRGB(col));
-               }
-#else
-                       p.setBackgroundColor(gRGB(0x008000));
-#endif
 
-               p.setForegroundColor(gRGB(0xFFFFFF));
-       
-               ePtr<gFont> font = new gFont("Regular", 20);
-               p.setFont(font);
-               p.clear();
-       
-               eRect usable_area = eRect(100, 70, my_dc->size().width() - 150, 100);
-               
-               char text[512];
-               snprintf(text, 512, "We are really sorry. Your Dreambox encountered "
-                       "a software problem, and needs to be restarted. "
-                       "Please send the logfile created in /hdd/ to %s.\n"
-                       "Your Dreambox restarts in 10 seconds!\n"
-                       "Component: %s",
-                       crash_emailaddr, crash_component);
-       
-               p.renderText(usable_area, text, gPainter::RT_WRAP|gPainter::RT_HALIGN_LEFT);
-       
-               usable_area = eRect(100, 170, my_dc->size().width() - 180, my_dc->size().height() - 20);
+       ePtr<gMainDC> my_dc;
+       gMainDC::getInstance(my_dc);
        
-               int i;
+       gPainter p(my_dc);
+       p.resetOffset();
+       p.resetClip(eRect(ePoint(0, 0), my_dc->size()));
+       p.setBackgroundColor(gRGB(0x008000));
+       p.setForegroundColor(gRGB(0xFFFFFF));
+
+       ePtr<gFont> font = new gFont("Regular", 20);
+       p.setFont(font);
+       p.clear();
+
+       eRect usable_area = eRect(100, 70, my_dc->size().width() - 150, 100);
        
-               size_t start = std::string::npos + 1;
-               for (i=0; i<20; ++i)
+       std::string text("We are really sorry. Your Dreambox encountered "
+               "a software problem, and needs to be restarted. "
+               "Please send the logfile created in /hdd/ to " + crash_emailaddr + ".\n"
+               "Your Dreambox restarts in 10 seconds!\n"
+               "Component: " + crash_component);
+
+       p.renderText(usable_area, text.c_str(), gPainter::RT_WRAP|gPainter::RT_HALIGN_LEFT);
+
+       usable_area = eRect(100, 170, my_dc->size().width() - 180, my_dc->size().height() - 20);
+
+       int i;
+
+       start = std::string::npos + 1;
+       for (i=0; i<20; ++i)
+       {
+               start = lines.rfind('\n', start - 1);
+               if (start == std::string::npos)
                {
-                       start = lines.rfind('\n', start - 1);
-                       if (start == std::string::npos)
-                       {
-                               start = 0;
-                               break;
-                       }
+                       start = 0;
+                       break;
                }
-       
-               font = new gFont("Regular", 14);
-               p.setFont(font);
-       
-               p.renderText(usable_area, 
-                       lines.substr(start), gPainter::RT_HALIGN_LEFT);
-               sleep(10);
        }
 
+       font = new gFont("Regular", 14);
+       p.setFont(font);
+
+       p.renderText(usable_area, 
+               lines.substr(start), gPainter::RT_HALIGN_LEFT);
+       sleep(10);
+
        raise(SIGKILL);
 }
 
@@ -440,16 +286,13 @@ void oops(const mcontext_t &context, int dumpcode)
                eDebug(" (end)");
        }
 }
-#else
-#warning "no oops support!"
-#define NO_OOPS_SUPPORT
 #endif
 
 void handleFatalSignal(int signum, siginfo_t *si, void *ctx)
 {
+#ifndef NO_OOPS_SUPPORT
        ucontext_t *uc = (ucontext_t*)ctx;
 
-#ifndef NO_OOPS_SUPPORT
        oops(uc->uc_mcontext, signum == SIGSEGV || signum == SIGABRT);
 #endif
        eDebug("-------");
@@ -459,7 +302,6 @@ void handleFatalSignal(int signum, siginfo_t *si, void *ctx)
 void bsodCatchSignals()
 {
        struct sigaction act;
-       act.sa_handler = SIG_DFL;
        act.sa_sigaction = handleFatalSignal;
        act.sa_flags = SA_RESTART | SA_SIGINFO;
        if (sigemptyset(&act.sa_mask) == -1)