* Added a proper CVS ID and Copyright disclaimer to every file. Other
[citadel.git] / ctdlphp / ctdlsession.php
1 <?PHP
2
3 // $Id$
4 //
5 // This gets called from within the header functions.  It establishes or
6 // connects to a PHP session, and then connects to Citadel if necessary.
7 //
8
9 function establish_citadel_session() {
10
11         global $session, $clientsocket;
12
13         session_start();
14
15         if ($_SESSION["ctdlsession"]) {
16                 $session = $_SESSION["ctdlsession"];
17         }
18         else {
19                 $session = "CtdlSession." . time() . rand(1000,9999) ;
20                 $_SESSION["ctdlsession"] = $session;
21         }
22
23         // See if there's a Citadel connection proxy open for this session.
24         // The name of the socket is identical to the name of the
25         // session, and it's found in the /tmp directory.
26
27         $sockname = "/tmp/" . $session . ".socket" ;
28
29         $clientsocket = fsockopen($sockname, 0, $errno, $errstr, 5);
30         if (!$clientsocket) {
31                 // It ain't there, dude.  Open up the proxy. (C version)
32                 //$cmd = "./sessionproxy " . $sockname ;
33                 //exec($cmd);
34
35                 // It ain't there, dude.  Open up the proxy.  (PHP version)
36                 $cmd = "./sessionproxy.php " . $sockname .
37                         " </dev/null >/dev/null 2>&1 " .
38                         " 3>&1 4>&1 5>&1 6>&1 7>&1 8>&1 & " ;
39                 exec($cmd);
40                 sleep(2);
41
42                 // Ok, now try again.
43                 $clientsocket = fsockopen($sockname, 0, $errno, $errstr, 5);
44
45                 // Try to log the user back in.
46                 if ($clientsocket) {
47
48
49                         if ($_SESSION["username"]) {
50                                 login_existing_user(
51                                         $_SESSION["username"],
52                                         $_SESSION["password"]
53                                 );
54                         }
55                 }
56         }
57
58         if ($clientsocket) {
59                 if (!$_SESSION["serv_humannode"]) {
60                         ctdl_get_serv_info();
61                 }
62         }
63         else {
64                 echo "ERROR: no Citadel socket!<BR>\n";
65                 flush();
66         }
67         
68 }
69
70
71 //
72 // Clear out both our Citadel session and our PHP session.  We're done.
73 //
74 function ctdl_end_session() {
75         global $clientsocket, $session;
76
77         // Tell the Citadel server to terminate our connection.
78         // (The extra newlines force it to see that the Citadel session
79         // ended, and the proxy will quit.)
80         //
81         fwrite($clientsocket, "QUIT\n\n\n\n\n\n\n\n\n\n\n");
82         $response = fgets($clientsocket, 4096);         // IGnore response
83         fclose($clientsocket);
84         unset($clientsocket);
85
86         // Now clear our PHP session.
87         $_SESSION = array();
88         session_write_close();
89 }
90
91 ?>