<?
/*
// session.inc : session management à la PHP4 for PHP3 using files
//
// emulates the PHP4 session management by providing
// session_start(), session_register(), session_unregister() and session cookies
// 
//     require ("session.inc");
//     session_name("application_id"); // optional, default is PHPSESSID
//     session_start();
//
// should be the first lines of your pages
// if you want the cookies to work properly
//
// Danny Heijl
// Danny.Heijl@cevi.be, aug 1999
//
// version history :
//
// v1.02 dh nov 16, 1999 : * fixed race condition when loading multiple frames from the
//                           same page simultaneously all using sessions
//                         * proper support for session names with session_name()
*/


class session {
	
  function session() {

    $this->sessid = '';
    $this->sdata  = array();
    $this->sfile = '';
    $this->cookie = '';
    $this->client = getenv('REMOTE_ADDR');
    $this->name = "PHPSESSID";
    
    $this->sessid = $this->name . date("YmdHis") . "_" . str_replace(".", "_", $this->client); 
    $this->sfile = "/tmp/phpsession/" . $this->sessid;
    $this->cookie = $this->sessid;
    register_shutdown_function("session_save");
  }

}


function session_name($newname) {
  global $session;

  $oldname = $session->name;
  $session->name = $newname;
  $session->sessid = $newname . date("YmdHis") . "_" . str_replace(".", "_", $session->client); 
  $session->sfile = "/tmp/phpsession/" . $session->sessid;
  $session->cookie = $session->sessid;
  return $oldname;
}

function session_start() {
  global $session;
  global $HTTP_COOKIE_VARS;
  
  $php_sessid = $HTTP_COOKIE_VARS[$session->name];
  if (! isset($php_sessid)) {
    $php_sessid = $session->cookie;
    setcookie($session->name, $session->cookie, '', "/"); 
    // echo "DEBUG : setcookie : " . $session->cookie . "\n<br>";
    return;
  } else {
    // echo "DEBUG : received cookie = $php_sessid\n<br>";
    $session->cookie = $php_sessid;
    $session->sessid = $php_sessid;
    $session->sfile = "/tmp/phpsession/" . $php_sessid;
  }
  @$fp = fopen($session->sfile, "r");
  if (! $fp) {
    setcookie($session->name, $session->cookie, '', "/");
    // echo "DEBUG session.inc : no session file but cookie set: $php_sessid \n<br>";
    return;
  }
  flock($fp, 1); // get shared lock and wait
  $line = trim(fgets($fp, 2048));
  if ($line != $php_sessid) {
    fclose($fp);
    setcookie($session->name, $sphp_sessid, '', "/");
    // echo "DEBUG : no/wrong cookie in session file : " . $line . "|" ..
    //       $session->cookie . "\n<br>";
    // echo "DEBUG : setcookie : " . $session->cookie . "\n<br>";
    return;
  } else
    // echo "DEBUG : valid cookie in session file : " . $line . "\n<br>";
    $session->cookie = $php_sessid;
    while ($line = fgets($fp, 2048)) {
    list($name, $svar) = explode("=", $line);
    $GLOBALS[$name] = unserialize($svar);
    $session->sdata[$name] = $name;
  }
  fclose($fp);
}


function session_register($var) {
  global $session;
  // echo "DEBUG : session_register : " . $var . "=" . $GLOBALS[$var] .. "\n<br>";
  $session->sdata[$var] = $var;
}

function session_unregister($var) {
  global $session;
  unset ($session->sdata[$var]);
}

function session_destroy() {
  global $session;
  
  @unlink($session->sfile);
  unset($session->sdata);
  //setcookie($session->name, '', time() - 36000, "/"); 
}

function session_save() {
  global $session;
  
  if (! is_array($session->sdata)) return;
  if (file_exists($session->sfile)) {
    $fp = fopen($session->sfile, "r+");
  } else {  
    $fp = fopen($session->sfile, "w");
  }
  flock($fp, 2); // exclusive lock and wait
  fputs($fp, trim($session->cookie) . "\n");
  $i = 0;
  reset($session->sdata);
  while ($i++ < count($session->sdata)) {
    $var = key($session->sdata);   
    $data = $GLOBALS[$var];
    $svar = serialize($data);
    fputs($fp,$var . "=" . $svar . "\n");
    next($session->sdata);
  }
  fclose($fp);
}

$session = new session();
  
?>
