Download Tactile Interrogator

"; } // remember in the main Prospects database function SaveAnswersInDB() { global $HumanName, $Email, $UnixType, $UnixOther; $Darwin_powerpc = ($UnixType == 'Darwin-powerpc') ? 1 : 0; $Linux_x86 = ($UnixType == 'Linux-x86' ) ? 1 : 0; $Linux_powerpc = ($UnixType == 'Linux-powerpc' ) ? 1 : 0; $SunOS_sparc = ($UnixType == 'SunOS-sparc' ) ? 1 : 0; $SunOS_x86 = ($UnixType == 'SunOS-x86' ) ? 1 : 0; mysql_connect("localhost", "tactile", "yaw tiye xibwa") or die("Cannot connect to database."); mysql_select_db("tactile"); // if mysql supported nested queries, I could have done this in one // query. But no, gotta wait till MySQL version 4.1 or later. $query = "select id from prospects where Email = '$Email' AND Status = 'a' "; //tprint("SAIDB-C: The query is '$query'"); $result = mysql_query($query); print mysql_error(); $n = mysql_affected_rows(); //tprint("SAIDB: my sql affected rows = $n"); if ($n) { // already listed! OR in whatever platforms $row = mysql_fetch_array($result); $givenID = $row['id']; //tprint("the given id is $givenID"); $query = "UPDATE prospects SET Darwin_powerpc = Darwin_powerpc + $Darwin_powerpc, Linux_x86 = Linux_x86 + $Linux_x86, Linux_powerpc = Linux_powerpc + $Linux_powerpc, SunOS_sparc = SunOS_sparc + $SunOS_sparc, SunOS_x86 = SunOS_x86 + $SunOS_x86, ModTime = current_timestamp where id = $givenID"; // note we ignore $HumanName and $UnixOther... whatever } else { // not yet listed. New record. $query = "INSERT INTO prospects (Name, Email, Darwin_powerpc, Linux_x86, Linux_powerpc, SunOS_sparc, SunOS_x86, Other_OS, EntryTime, ModTime) VALUES('$HumanName', '$Email', $Darwin_powerpc, $Linux_x86, $Linux_powerpc, $SunOS_sparc, $SunOS_x86, '$UnixOther', current_timestamp, current_timestamp)"; } //tprint("SAIDB: The query is '$query'"); $result = mysql_query($query); print mysql_error(); $n = mysql_affected_rows(); //tprint("SAIDB: my sql affected rows = $n"); if ($n == 1) { //tprint("SAIDB: oh my gosh it worked"); } else { //tprint('

didnt append.

'); } } // because I'm chicken, remember Also in this file. function SaveAnswersInFile() { global $HumanName, $Email, $UnixType; $rightNow = strftime('%Y/%m/%d %H:%M:%S', time()); //tprint("SavingAnsInFile, at time $rightNow"); $fd = fopen("/home/tactile/pros/downloaders.txt", "a"); fputs($fd, "$HumanName\t$Email\t$UnixType\t$UnixOther\t$rightNow\n"); fclose($fd); } // make up the 'security' string - the random hash that keeps the real // download directory hidden. function MakeSecStr() { global $secStr; $secStr = `dd if=/dev/urandom bs=1 count=128 | tr -dc '0-9a-zA-Z.' `; tprint("NEW NEW sec str $secStr"); return; //$fd = fopen("/dev/urandom", "r"); //$randBytes = fread($fd, 21); //fclose($fd); // convert it to some characters //$secStr = bin2hex($randBytes); // translate SOME of the digits into some letters that look more than hex //$secStr = strtr($secStr, // substr("0123456789", rand(0, 4), 5), // substr("ArtyuJKLQWoERTimSDUIOPZplFGxvHYkjnXCVhgszBNqMw", rand(0, 45), 5)); // strip out all chars except for letters digits and dot //$secStr = preg_replace("[^a-zA-Z0-9.]", "", $randBytes); //tprint("NEW sec str $secStr"); } function MakeSymlink() { global $secStr, $UnixType; // that's: i keep the files HIDDEN bellcharacter space $targ = "../iktfH\7 /latest/$UnixType"; $linkFile = "/home/tactile/public_html/dl/$secStr"; if (!symlink($targ, $linkFile)) { tprint("error, symlink [$targ], [$linkFile] failed"); } //clearstatcache(); //tprint("then clean up day-old symlinks. "); // then clean up day-old symlinks. Note old symlinks will still // be around if nobody downloads a day later. $dayAgo = time() - 3600*24; //$dayAgo = time() - 3600; $matches = glob('/home/tactile/public_html/dl/*'); //print_r($matches); //tprint("

"); if (is_array($matches)) { //tprint("got some matches i guess"); foreach ($matches as $filename) { // must use lstat() - filemtime() returns mtime for the target!! $wholeStat = lstat($filename); // only symlinks. if (($wholeStat['mode'] & 0170000) == 0120000) { // only old ones $modTime = $wholeStat['mtime']; //tprint("checking out file [$filename] $modTime $hoursAgo $dayAgo"); if ($modTime < $dayAgo) { $hoursAgo = round((time() - $modTime) / 3600.); tprint("Guess I should delete [$filename] cuz its $hoursAgo hrs old"); if (!unlink($filename)) tprint("could not unlink delete file [$filename]"); } } } } //tprint("done with day-old symlinks. "); } function SendEmail() { global $HumanName, $Email, $UnixType; global $secStr; //tprint "sec str $secStr "; $dlMegs = filesize("/home/tactile/public_html/dl/$secStr/") / (1024.*1024.); $dlSize = sprintf("%4.1f megabytes", $dlMegs); tprint("the dlmegs is [$dlMegs] but the dlsize is [$dlSize]"); //$lsl = file_get_contents("/home/tactile/public_html/dl/$secStr/tintzip.lsl"); $vb = strip_tags(file_get_contents("/home/tactile/public_html/dl/$secStr/versbanner.txt")); $md5 = file_get_contents("/home/tactile/public_html/dl/$secStr/tint.md5"); if ($md5) $md5 = "MD5 digest: " . $md5; $body = " Thank you for trying Tactile Interrogator! To complete the download, double click on this url:$secStr/ Just unzip it and run the program! Your download is $dlSize. $md5 $vb Documentation: for a quick tour or for more options see MacOS X: look under the Help menu for local help. Tech Support: Buy a License Key: To get in touch with us for any other reason: Now's a good time to tell us what you want in the next version. Send us an email when you get a chance: "; tprint("sendin to $Email "); // this is really tricky to get the mail() function to work. // got it to work with NO headers...From: $res = mail($Email, "Download Tactile Interrogator", $body, "From: Tactile Interrogator Download \r\n" . "Reply-To:\r\n" . "X-Mailer: PHP/" . phpversion()); tprint("result of mail: [$res]"); //phpinfo(); print "Thank you $HumanName, an email is being sent to "; print "$Email telling you where to download the software.

"; //phpinfo(); } // DEFUNCT this was used when download was direct from web page function IncludeInMsg() { global $HumanName, $Email, $UnixType; #global $secStr; #MakeSecStr(); print "


  Thank you for trying out Tactile Interrogator.


Click Here to Download



Have fun!


  "; } if ($PleaseDownload) { tprint("some answers "); if ($UnixType == "other-other") { SaveAnswersInFile(); SaveAnswersInDB(); print "Unfortunately, we don't have a port for that platform. "; print "Your choice has been registered, however. "; print "Interrogator is very portable to Unix machines "; print "so there's hope. You can always prod us by sending "; print "email to

"; print "You might want to download another version.

"; $NoSuchPlatform = 1; } // should be some good answers, make sure $len = strlen($Email); if ($len) { $atPos = strpos($Email, '@'); $dotPos = strpos($Email, '.', $atPos); //tprint("dotpos $dotPos atpos $atPos len $len "); if (!$atPos || !$dotPos || $atPos < 2 || $atPos > $len-2) $EmailError = "We need a REAL email address. " . "'$Email' isn't good enough."; } //if (!$HumanName) // $HumanNameError = "Please enter a real name"; //tprint("ner[$HumanNameError] eer[$EmailError]"); //tprint(""); $GoodAnswers = !$HumanNameError && !$EmailError && !$NoSuchPlatform; } if ($GoodAnswers) { tprint("good answers "); SaveAnswersInFile(); SaveAnswersInDB(); //global $secStr; // decide on the security string MakeSecStr(); MakeSymlink(); // cant get this to rowk SendEmail(); //IncludeInMsg(); } else { // else continue with the rest of the form tprint("bad answers"); ?>

To download the software, please enter your name and email.

Name: $HumanNameError"; ?>

$EmailError"; else print ""; ?>

We will send you, by email, the URL to download.

Yes, you are being added to our mailing list. You can always remove yourself from our mailing list, just click on Mailing List on the side here. But stay on the list! When we cook up a new rev, we will send you an email so you can download it.

We do not sell our email lists and we do not spam you. (Over the course of 2004, we sent a total of 9 emails to the members on our list.)

What platform do you want to run Interrogator on?
  if a request for other, enter here:


Versions Available         Changes in Recent Versions

System Requirements:
Macintosh version: Mac OS X.2     more info
Linux version: 2.4, libc 6     more info
Solaris version: 8, 9     more info

Installation Instructions:
Just unzip the downloaded zip file and run it!
More installation information for Mac or for Linux & Solaris .

Firewire Compatible optimized for multiple processors Rendezvous Mac OS Linux is a registered trademark of Linus Torvalds.
Solaris is a registered trademark of Sun Microsystems, Inc.
Mac, the MacOS logo images, MacOS, MacOS X and Macintosh are registered trademarks of Apple Computer, Inc., registered in the U.S. and other countries. The 'Built for Mac OS X' graphic is a trademark of Apple Computer, Inc., used under license.

Problems with this form? Send email to: