- // Create a socket listening on specified port
- server = new wxSocketServer(addr, SCKIPC_FLAGS);
- server->SetEventHandler(*gs_handler, _SERVER_ONREQUEST_ID);
- server->SetClientData(this);
- server->SetNotify(wxSOCKET_CONNECTION_FLAG);
- server->Notify(TRUE);
+#ifdef __UNIX_LIKE__
+ mode_t umaskOld;
+ if ( addr->Type() == wxSockAddress::UNIX )
+ {
+ // ensure that the file doesn't exist as otherwise calling socket() would
+ // fail
+ int rc = remove(serverName);
+ if ( rc < 0 && errno != ENOENT )
+ {
+ delete addr;
+
+ return FALSE;
+ }
+
+ // also set the umask to prevent the others from reading our file
+ umaskOld = umask(077);
+ }
+ else
+ {
+ // unused anyhow but shut down the compiler warnings
+ umaskOld = 0;
+ }
+#endif // __UNIX_LIKE__
+
+ // Create a socket listening on the specified port
+ m_server = new wxSocketServer(*addr, SCKIPC_FLAGS);
+
+#ifdef __UNIX_LIKE__
+ if ( addr->Type() == wxSockAddress::UNIX )
+ {
+ // restore the umask
+ umask(umaskOld);
+
+ // save the file name to remove it later
+ m_filename = serverName;
+ }
+#endif // __UNIX_LIKE__
+
+ delete addr;
+
+ if (!m_server->Ok())
+ {
+ m_server->Destroy();
+ m_server = NULL;
+
+ return FALSE;
+ }
+
+ m_server->SetEventHandler(*gs_handler, _SERVER_ONREQUEST_ID);
+ m_server->SetClientData(this);
+ m_server->SetNotify(wxSOCKET_CONNECTION_FLAG);
+ m_server->Notify(TRUE);