aboutsummaryrefslogtreecommitdiffstats
path: root/games/kaid/files/patch-KaiEngine.cc
blob: d8b23aa5a0cfcd43c65320b320dbf42df6c6e434 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--- KaiEngine.cc.orig   Wed Feb  9 19:26:59 2005
+++ KaiEngine.cc    Sat Mar  5 20:53:51 2005
@@ -14,9 +14,14 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
+#include <errno.h>
+#include <pwd.h>
+#ifdef PLATFORM_freebsd
+#    include <login_cap.h>
+#    include <netinet/in.h>
+#endif
 
-#ifdef PLATFORM_macosx_jaguar
-#    include <sys/socket.h>
+#ifdef PLATFORM_bsd
 #    include <netinet/in_systm.h>
 #    include <netinet/if_ether.h>
 #    include <netinet/ip.h>
@@ -80,6 +85,32 @@
 {
    m_bTerminate = false;
    m_cSniffer = new CPktSnifferThread (this, m_cConf);
+   // After we have the networking set up, we no longer need
+   // the privileges that we are started with.
+   if(! m_cConf->User.empty()) {
+       const struct passwd *pwd = getpwnam(m_cConf->User.c_str());
+       if(pwd == 0) {
+           string err = "Unknown switch-to User: ";
+           err += m_cConf->User;
+           debuglog("KAID",err);
+           throw ThreadException(ThreadException::errUnknown);
+       }
+#if defined(PLATFORM_freebsd)
+       login_cap_t *lc = login_getpwclass(pwd);
+       if(lc == 0 ||
+                   setusercontext(lc, pwd, pwd->pw_uid, LOGIN_SETALL) != 0) {
+#else
+       if(initgroups(m_cConf->User.c_str(), pwd->pw_gid) != 0 ||
+          setuid(pwd->pw_uid) != 0) {
+#endif
+           string err = "Unable to switch to User: ";
+           err += m_cConf->User;
+           err += ": ";
+           err += strerror(errno);
+           debuglog("KAID",err);
+           throw ThreadException(ThreadException::errUnknown);
+       }
+   }
    m_cTOrb = new COrbStreamThread (this, m_cConf);
    m_cUOrb = new COrbDgramThread (this, m_cConf);
    
@@ -142,9 +173,10 @@
    }
    catch(SocketException & excep)
    {
-   }
-   catch(...)
-   {
+       string err = "Failed to bind UI socket: ";
+       err += (const char *)excep;
+       debuglog("KAID",err);
+       throw ThreadException(ThreadException::errUnknown);
    }
    
    string mlm = "Manual";
@@ -1425,6 +1457,11 @@
    srcaddy = (struct ether_addr *) ep->ether_shost;
    dstaddy = (struct ether_addr *) ep->ether_dhost;
 
+#if defined(PLATFORM_bsd) && \
+    !(defined(PLATFORM_macosx_1) || defined(PLATFORM_macosx_jaguar))
+#define ether_addr_octet octet
+#endif
+
    // Get source MAC
    sprintf (aux, "%02X%02X%02X%02X%02X%02X",
         srcaddy->ether_addr_octet[0], srcaddy->ether_addr_octet[1],
@@ -1447,7 +1484,7 @@
                        sizeof (struct ether_header) +
                        ((my_ip->ip_hl) << 2));
    // Platform depend
-   #ifdef PLATFORM_macosx_jaguar
+   #ifdef PLATFORM_bsd
        srcport = ntohs (my_packetheader->uh_sport);
        dstport = ntohs (my_packetheader->uh_dport);
    #else
@@ -1745,10 +1782,12 @@
    // Set byte 0 of outgoing based on console
    if (console=="0050F2" || console=="000D3A") 
        Opcode = m_sCurrentArena.empty () ? 'X' : 'R'; // Box
-   if (console=="0009BF") 
+   else if (console=="0009BF") 
        Opcode = m_sCurrentArena.empty () ? 'Y' : 'S'; // Cube
-   if (console=="00041F" || console=="00014A") 
+   else if (console=="00041F" || console=="00014A") 
        Opcode = m_sCurrentArena.empty () ? 'p' : 'q'; // PS2 / PSP    
+   else
+       return;
        
    memcpy (newbuf + 2, packet, packet_size);
     newbuf[0] = Opcode;
@@ -2321,4 +2360,3 @@
    }
    m_bSeenAllDevices = !IsAnyDeviceMissing;
 }
-