-DirectoryIndex index.html
+DirectoryIndex Index.html.pl
AddType text/html .shtml
AddHandler server-parsed .shtml
IndexOptions NameWidth=*
AddType application/x-rpm .rpm
AddType application/x-nokia-9000-communicator-add-on-software .aos
-php_flag short_open_tag off
-php_flag magic_quotes_gpc off
-php_flag magic_quotes_runtime off
+<IfModule mod_php4.c>
+ php_flag short_open_tag off
+ php_flag magic_quotes_gpc off
+ php_flag magic_quotes_runtime off
+</IfModule>
<Files "kocky">
RewriteEngine on
RewriteEngine on
RewriteRule ^(/home/short/www/www.jankratochvil.net/)?sw/*(.*)$ http://www.jankratochvil.net/project/ [R=301] [L]
</Files>
+<Files "projects">
+ RewriteEngine on
+ RewriteRule ^(/home/short/www/www.jankratochvil.net/)?projects/*(.*)$ http://www.jankratochvil.net/project/$2 [R=301] [L]
+</Files>
+
+<IfDefine SSL>
+ <Files "*.pl">
+ RewriteEngine on
+ RewriteRule ^.*?/www[.]jankratochvil[.]net/(.*)$ http://localhost:7680/$1 [P]
+ </Files>
+</IfDefine>
+<IfDefine !SSL>
+ Options +ExecCGI
+</IfDefine>
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Contact page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package Contact;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+use vars qw($VERSION $CVS_ID);
+$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>"Contact",
+ "section"=>"Contact",
+ "head_css"=>"
+table.contact td { vertical-align: top; }
+table.contact { border-collapse: collapse; border-style: solid; border-width: 1px; margin: 8px; }
+table.contact A[href] { text-decoration: inherit; /* revoke underline */ }
+",
+ );
+My::Web->heading();
+
+
+my $mailme=(map({ a_href("mailto:$_",$_); } 'web@jankratochvil.net'))[0];
+
+print <<"HERE";
+<table width="100%" style="border-style: none;"><tr><td align="center"><table class="contact">
+<tr><td class="tab-head">Name </td><td>Jan Kratochvil</td></tr>
+<tr><td class="tab-head">e-mail </td><td>$mailme</td></tr>
+<tr><td class="tab-head">WWW </td><td>@{[ a_href('http://www.jankratochvil.net/') ]}</td></tr>
+<tr><td class="tab-head">OpenPGP </td><td style="font-family: monospace;">@{[ a_href '/pgp-JanKratochvil.txt',''
+ .'pub 1024D/44FC7632 2002-10-07 Jan Kratochvil <pgp-44FC7632@jankratochvil.net><br />'
+ .'sub 2048g/D9F5F44B 2002-10-07 [expires 2004-10-06]' ]}</span></td></tr>
+</table></td></tr></table>
+
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Homepage',
+ "no_job"=>1,
+ );
+My::Web->heading();
+
+
+print <<"HERE";
+<h1>Jan Kratochvil Homepage</h1>
+<hr />
+
+<p>Why did you come here? Shhh...Don't say anything – I'll guess.</p>
+
+<p>Some paper...no, not a paper...a file...maybe even a folder. It is
+so close you can almost touch it, but yet it is unreachable. It lies
+behind glass...perhaps you can see it...but you cannot touch it.</p>
+
+<p>For years, you have dreamed of being able to write to your NTFS partition
+from the safety of your favorite OS GNU/Linux. Well, the day of reckoning is at
+hand! Those nights lying awake feeling foolish for having that extra VFAT
+partition just to exchange files between GNU/Linux and MS-Windows are over!</p>
+
+<table border="0" style="margin: 4ex; padding: 2ex; background: #552222; font-size: larger;">
+ <tr><td>
+ <b>A programmer for hire:</b>
+ <span style="color: #ffaaaa;">
+ I am looking for new challenges.
+ If you find the software here useful, please
+ @{[ a_href $W->{"resume_url"},'consider me' ]}
+ for your next software project and
+ @{[ a_href 'Contact.html.pl','get in touch' ]}.
+ </span>
+ </td></tr>
+</table>
+
+
+<h2>Introducing the <i>Captive NTFS Filesystem</i> for GNU/Linux</h2>
+
+<p>The @{[ a_href '/project/captive/','Captive NTFS' ]} filesystem is an
+installable filesystem for GNU/Linux, which allows read/write access to NTFS
+partitions created by Microsoft Windows NT, 200x or XP. You can download it
+@{[ a_href '/project/captive/','here' ]}.</p>
+
+HERE
+
+Wrequire "project::captive::ListItem";
+my %captive_ListItem=( @project::captive::ListItem::ListItem );
+print $captive_ListItem{"description"};
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Mailman page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package Mailman;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+use vars qw($VERSION $CVS_ID);
+$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+use URI::Escape;
+require LWP::Simple;
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>"Mailman Interface",
+ "no_job"=>1,
+ "args_check"=>{
+ "email"=>'',
+ "pw"=>'',
+ "pw-conf"=>'',
+ "list"=>['^[-\w]+$'],
+ "back"=>'',
+ },
+ );
+My::Web->heading();
+
+
+for my $list (@{$W->{"args"}{"list"}}) {
+ print "<h1>List <i>$list</i></h1><blockquote>\n";
+ my $url_base=&{$W->{"mailman_url_sub"}}()."/subscribe/$list";
+ my $t=LWP::Simple::get("$url_base?"
+ .join('&',
+ "list=$list",
+ map({ $_."=".uri_escape($W->{"args"}{$_}); } qw(email pw pw-conf))));
+ $t=($t=~m#^.*<body\b[^>]*>(.*?)</body>#is)[0];
+ $t=~s#(href=")(../[^"]*)(")#$1$url_base/$2$3#gi;
+ print $t;
+ print "</blockquote>\n";
+ }
+
+if ($W->{"args"}{"back"}) {
+ print '<h1>'.a_href($W->{"args"}{"back"},'Back to the original page').'</h1>'."\n";
+ }
+
+
+My::Web->footer();
# Generally better behaviour but it requires GNU make. Harmless otherwise.
.DELETE_ON_ERROR:
-%.html: %.html.pl $(top_srcdir)/My/Web.pm $(top_srcdir)/WebConfig.pm
- perl -I$(top_srcdir) >$@ $<
-
%.ppm: %.fig Makefile
- fig2dev -L ppm -S4 -b10 $< $@
+ fig2dev -L ppm -S4 -m1.75 -b10 $< | pnmgamma 0.4 >$@
%.gif: %.ppm
- ppmtogif -sort $< >$@
+ ppmquant -quiet 256 $< | ppmtogif -quiet -sort >$@
+
+# Prevent: make: Circular %.ppm <- %.gif dependency dropped.
+#%.ppm: %.gif
+# giftopnm $< >$@
+
+%.png: %.ppm
+ pnmtopng $< >$@
+
+%.ppm: %.png
+ pngtopnm $< >$@
+
+%.png: %.dia $(top_srcdir)/dia-w.sh
+ $(top_srcdir)/dia-w.sh --nosplash --export $@ $<
include $(top_srcdir)/Makefile-head.am
AUTOMAKE_OPTIONS=foreign
-SUBDIRS=macros project
+SUBDIRS=macros My resume etmms project
## to automatically rebuild aclocal.m4 if any of the macros in
## `macros/' change
@MAINT@include macros/macros.dep
Makefile-head.am \
autogen.pl \
.vimrc \
- ChangeLog
+ ChangeLog \
+ dia-w.sh.in
MAINTAINERCLEANFILES+= \
ChangeLog
CLEANFILES+= \
- ChangeLog.bak
+ ChangeLog.bak \
+ dia-w.sh
if MAINTAINER_MODE
ChangeLog:
endif
EXTRA_DIST+= \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl \
+ WebConfig.pm \
+ Redirect.pl \
+ have_js.js.pl \
+ robots.txt \
+ SendMsg.pl \
+ Contact.html.pl \
+ Mailman.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# URL redirector of &My::Web::a_href Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package Redirect;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+use Apache::Constants qw(MOVED);
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "header_only"=>1,
+ "args_check"=>{
+ "location"=>'^\w+://',
+ },
+ );
+$W->{"r"}->status(MOVED);
+$W->{"r"}->header_out("Location"=>$W->{"args"}{"location"});
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Quick Send Message
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package SendMsg;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+use Apache::Constants qw(HTTP_NO_CONTENT);
+require Mail::Send;
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "header_only"=>1,
+ "args_check"=>{
+ "msgscript"=>'', # If 'text/javascript' is supported.
+ "msghtml"=>'', # No 'text/javascript' available.
+ },
+ );
+my $msg=$W->{"args"}{"msghtml"} || $W->{"args"}{"msgscript"};
+if ($msg) {
+
+ my $subject=$msg.' @'.$W->{"r"}->uri();
+ print STDERR "Message: $subject\n";
+
+ my $send=Mail::Send->new();
+ $send->to(split /,/,$W->{"SendMsg_to"});
+ $send->subject($subject);
+ my $fh=$send->open();
+ print $fh "$subject\n\n";
+ for (sort keys %ENV) {
+ print $fh $_."=".$ENV{$_}."\n";
+ }
+ $fh->close(); # send it here
+
+ }
+$W->{"r"}->status(HTTP_NO_CONTENT);
package WebConfig;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION);
+use vars qw($VERSION $CVS_ID);
$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
use strict;
use warnings;
@ISA=qw(Exporter);
@EXPORT=qw(%WebConfig);
+use My::Web;
+require CGI;
+
+
+my $resume_url="/resume/Resume-JanKratochvil.html.pl/Resume-JanKratochvil.html";
+
our %WebConfig=(
"admin_mail"=>'web-www.jankratochvil.net@jankratochvil.net',
- "viewcvs"=>map({ (!$_ ? $_ : s#^/#http://cvs.jankratochvil.net/viewcvs/energie/#); } $ENV{"SCRIPT_NAME"}),
+ "SendMsg_to"=>'web-www.jankratochvil.net@jankratochvil.net',
+ "cvs_id_author"=>sub {
+ my($name)=@_;
+ return My::Web::a_href("http://www.jankratochvil.net/","Jan Kratochvil") if 0
+ || $name eq "short"
+ || $name eq "lace";
+ return CGI::escapeHTML($name);
+ },
+ "viewcvs"=>"http://cvs.jankratochvil.net/viewcvs/www/www.jankratochvil.net/",
"title_prefix"=>"Jan Kratochvil",
+ "project_viewcvs"=>"http://cvs.jankratochvil.net/viewcvs/",
+ "pserver"=>':pserver:pserver:@cvs.jankratochvil.net',
+ "pserver_path"=>"/cvs",
+ "resume_url"=>$resume_url,
+ "web_hostname_sub"=>sub () { return "www.jankratochvil.net"; }, # $My::Web::W->{"r"}->hostname()
+ "mailman_url_sub" =>sub () { return "http://".&{$My::Web::W->{"web_hostname_sub"}}."/mailman/"; },
+ "pipermail_url_sub"=>sub () { return "http://".&{$My::Web::W->{"web_hostname_sub"}}."/pipermail/"; },
+ "heading"=>sub () {
+ print '<table border="0" align="center" style="font-size: larger;">'."\n";
+ print '<col width="20%">'."\n";
+ print '<col width="50%">'."\n";
+ print '<col width="20%">'."\n";
+ print '<tr>'."\n";
+ print '<td>'."\n";
+ print '<table border="1" align="left"'
+ .' style="border-collapse: collapse; border-style: solid; border-width: 2px;">'."\n";
+ print '<tr>'."\n";
+ print '<td style="padding: 5px; font-weight: bold;">'."\n";
+ print My::Web::a_href('http://www.jankratochvil.net/','Jan Kratochvil',
+ "attr"=>'style="text-decoration: inherit; /* revoke underline */;"');
+ print '</td>'."\n";
+ print '</tr>'."\n";
+ print '</table>';
+ print '</td>'."\n";
+ print '<td>'."\n";
+ print '<table border="1" align="center"'
+ .' style="border-collapse: collapse; border-style: solid; border-width: 2px;">'."\n";
+ print '<tr>'."\n";
+ my @sections=(
+ "/project/"=>"Projects",
+ "http://cvs.jankratochvil.net/"=>"CVS",
+# "/News.html.pl"=>"News",
+ $resume_url=>"Resume",
+ "/Contact.html.pl"=>"Contact",
+ );
+ while (@sections) {
+ my $section_path=shift @sections;
+ my $section_name=shift @sections;
+ print '<td style="padding: 5px;">';
+ print(($My::Web::W->{"section"} || "") eq $section_name ? "<b>$section_name</b>"
+ : My::Web::a_href($section_path,$section_name,
+ "attr"=>'style="text-decoration: inherit; /* revoke underline */;"'));
+ print "</td>\n";
+ }
+ print '</tr>'."\n";
+ print '</table>'."\n";
+ print '</td>'."\n";
+ print '</tr>'."\n";
+ print '</table>'."\n";
+ print My::Web::vskip("1ex") if !$My::Web::W->{"WebConfig::heading_novskip"};
+ },
+ "footing"=>sub () {
+# print "<h1>footing</h1>\n";
+ },
+ "footing_delimit"=>sub () {
+ return if $My::Web::W->{"no_job"};
+ print <<"HERE";
+<table border="0" style="margin: 4ex; padding: 2ex; background: #552222;">
+ <tr><td>
+ <b>A programmer for hire:</b>
+ <span style="color: #ffaaaa;">
+ I am looking for new challenges.
+ If you find the software here useful, please
+ @{[ My::Web::a_href($My::Web::W->{"resume_url"},'consider me') ]}
+ for your next software project.
+ </span>
+ </td></tr>
+</table>
+HERE
+ },
);
1;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
use strict;
use warnings;
use Carp qw(cluck confess);
+die if $ENV{"SERVER_SOFTWARE"}; # SECURITY: CGI misuse!
+
AutoGen->run(
"name"=>"www.jankratochvil.net",
"COPYRIGHT_HOLDER"=>'Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>',
"ARGV"=>\@ARGV,
"clean"=>[qw(
+ .xvpics
./ChangeLog.bak
./INSTALL
+ ./dia-w.sh
./project/Nokia61/Nokia61
./project/Nokia61/Nokia61_23.cache
+ ./project/line9k/line9k.png
./project/line9k/line9k.gif
- *.html
+ ./project/captive/doc/fig/*.png
+ ./project/captive/doc/fig/*.gif
+ ./project/captive/doc/dia/*.dia~
+ ./project/captive/doc/*.gif
+ ./project/captive/*.gif
+ ./project/PortDiag/*.gif
+ ./project/CasioA/*.gif
+ ./project/LaserGame/*.gif
+ ./project/Islet/*.gif
+ ./project/surprise/*.gif
+ ./My/*.gif
+ ./project/int13sniff/*.gif
+ ./resume/*.gif
+ ./etmms/*.dia~
+ ./project/TraceFS/*.gif
+ ./project/pgsqlsubstr/*.gif
+ ./project/winvnc/*.gif
+ ./project/TraceFS/*.gif
+ ./project/pgsqlsubstr/*.gif
+ ./project/winvnc/*.gif
+ ./project/xbill/*.gif
+ ./project/etherealmmse/*.gif
+ ./project/etherealwsp/*.gif
+ ./project/gladewsrc/*.gif
+ ./project/muttsort/*.gif
+ ./project/redirector_ad/*.gif
+ ./project/FordFulk/*.gif
+ ./project/Heat/*.gif
)],
);
AM_INIT_AUTOMAKE(www.jankratochvil.net,1.0cvs)
AM_MAINTAINER_MODE
+AC_PATH_PROG(PATH_XVNC,Xvnc)
+AC_PATH_PROG(PATH_BC,bc)
+AC_PATH_PROG(PATH_DIA,dia)
+
dnl "Makefile" output files MUST have pathnames incl./excl. "./" prefix as specified!
AC_OUTPUT([
Makefile
+./dia-w.sh
./macros/Makefile
+./My/Makefile
+./resume/Makefile
+./etmms/Makefile
./project/Makefile
./project/step/Makefile
-./project/icp/Makefile
+./project/Islet/Makefile
./project/FordFulk/Makefile
./project/Heat/Makefile
./project/kix/Makefile
./project/cvsutil/Makefile
./project/cvsbranchdiff/Makefile
./project/ppp9k/Makefile
-./project/LaceMail/Makefile
+./project/PerlMail/Makefile
./project/line9k/Makefile
+./project/captive/Makefile
+./project/captive/apiref/Makefile
+./project/captive/doc/Makefile
+./project/captive/doc/fig/Makefile
+./project/captive/doc/dia/Makefile
+./project/PortDiag/Makefile
+./project/CasioA/Makefile
+./project/LaserGame/Makefile
+./project/ShortRel/Makefile
+./project/TraceFS/Makefile
+./project/AutoGen/Makefile
+./project/gsmperl/Makefile
+./project/332/Makefile
+./project/lynxilla/Makefile
+./project/wayback/Makefile
+./project/kewensis/Makefile
+./project/QueryDev/Makefile
+./project/SClock/Makefile
+./project/ResRAM/Makefile
+./project/ssht/Makefile
+./project/postget/Makefile
+./project/middleman/Makefile
+./project/phphash/Makefile
+./project/energie/Makefile
+./project/MyWeb/Makefile
+./project/pgsqlsubstr/Makefile
+./project/int13sniff/Makefile
+./project/libtool/Makefile
+./project/muttsort/Makefile
+./project/gladewsrc/Makefile
+./project/etherealmmse/Makefile
+./project/etherealwsp/Makefile
+./project/libxml2reader/Makefile
])
echo done.
--- /dev/null
+#! /bin/bash
+# $Id$
+# Try to run "dia" with '-e' option, Xvnc wrapping if needed.
+# Copyright (C) 2000,2003 Jan Kratochvil <project-macros@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+empty=
+if test "x@PATH_XVNC@" != "x@PATH_XVNC$empty@"
+then
+ PATH_XVNC="@PATH_XVNC@"
+fi
+if test "x@PATH_BC@" != "x@PATH_BC$empty@"
+then
+ PATH_BC="@PATH_BC@"
+fi
+if test "x@PATH_DIA@" != "x@PATH_DIA$empty@"
+then
+ PATH_DIA="@PATH_DIA@"
+else
+ PATH_DIA=dia
+fi
+
+unset xpid
+if test "x$PATH_XVNC" != "x"
+then
+ xport=$[($$%4096)+2000]
+ notdone=true
+ run=true
+ while $notdone
+ do
+ if test -r /proc/net/tcp -a "x$PATH_BC" != "x"
+ then
+ loop=true
+ while $loop
+ do
+ hex="`echo "obase=16;$[$xport+5900]"|$PATH_BC`"
+ if grep -q ":`echo "000$hex"|tail -c5` " /proc/net/tcp
+ then
+ if $run
+ then
+ xport=$[$xport+1]
+ else
+ notdone=false
+ loop=false
+ fi
+ else
+ if $run
+ then
+ loop=false
+ else
+ echo -n .
+ sleep 1
+ fi
+ fi
+ done
+ else
+ notdone=$run
+ fi
+ if $run
+ then
+ export DISPLAY=":$xport"
+ $PATH_XVNC $DISPLAY & xpid=$!
+ run=false
+ fi
+ done
+else
+ if test "x$DISPLAY" = "x"
+ then
+ export DISPLAY=":0"
+ fi
+fi
+
+$PATH_DIA --disable-crash-dialog "$@";r=$?
+
+if test "x$xpid" != "x"
+then
+ kill $xpid
+fi
+
+exit $r
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Contact page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package Contact;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+use vars qw($VERSION $CVS_ID);
+$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+Wrequire 'My::Project';
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>"MMS Center Debugging",
+ );
+My::Web->heading();
+
+
+sub project ($)
+{
+my($name)=@_;
+
+ my %name_item=( My::Project->one_item_list_read($name) );
+ return a_href "/project/$name/",$name_item{"name"}.': '.$name_item{"summary"};
+};
+
+
+print <<"HERE";
+<h1>MMS Center Debugging</h1>
+
+<p>Here you can find description of very simple but technically interesting hack.
+You can provide your own MMS Center (MMS=Multimedia Messaging Service) in GSM
+network instead of the operator's one.</p>
+
+<p>There is only a limitation of a bearer data service - MMS is usually run
+over GPRS (General Packet Radio Service) channels while you cannot behave as
+GPRS callee in GSM network. Fortunately MMS can be run also over CSD (Circuit
+Switched Data - up to 14400bps) or HSCSD (High Speed CSD - up to 57600bps)
+services. GPRS is usually known as always-online while CSD/HSCSD you must dial
+some destination number. GPRS vs. CSD have usually also different GSM operator
+tariffication but it should not matter much for the short data messages.</p>
+
+<p>I did not provite a completely mine MMS center. I was involved in pilot MMS
+Center project where some compatibility issues of MMS message format between
+MMS phone and MMS center had to be solved. As I did not have technical access
+to the MMS center itself I setup two mobile phones
+(@{[ a_href 'http://www.nokia.com/','Nokia' ]} @{[ a_href 'http://www.communicator.org/','Communicator' ]}s)
+to setup sniffing tunnel. One of the phones were setup in answer mode to
+simulate the MMS center while the other one called to the real official (and
+buggy) MMS center accessible as regular service provided by the GSM operator.</p>
+
+@{[ centerimg 'gate','MMS Sniffing Diagram' ]}
+@{[ vskip "2ex" ]}
+@{[ centerimg 'triple.jpeg','MMS Sniffing Mobiles Setup' ]}
+
+<dl>
+ <dt>Answer side <i>pppd(8)</i> command</dt>
+ <dd><pre>
+pppd /dev/ttyS5 19200 modem lock crtscts connect "chat -vf /etc/ppp/answer-T68i.chat" @{[ "\\" ]}
+ noauth debug nodefaultroute 192.168.192.67:192.168.192.68 default-asyncmap
+ </pre></dd>
+ <dt>Answer side <i>/etc/ppp/answer-T68i.chat</i> file</dt>
+ <dd><pre>
+TIMEOUT 3 "" "ATZ" "OK-ATZ-OK" "" ABORT "BUSY" ABORT "NO CARRIER"
+ABORT "NO DIAL TONE" ABORT "ERROR" ABORT "VOICE" REPORT CONNECT ""
+ATL2 OK-ATL2-OK
+AT+CBST=7,0,1;+DS=3,0,1300,32;+CR=1;+DR=1 OK
+""
+TIMEOUT 300
+@{[ 'RING \d\d\d\d\d\dATA' ]}
+CONNECT "" ^M ""
+ </pre></dd>
+
+ <dt>Dial side <i>pppd(8)</i> command</dt>
+ <dd><pre>
+pppd /dev/ttyS4 19200 modem lock nocrtscts xonxoff connect "chat -vf /etc/ppp/mmsgate.chat" @{[ "\\" ]}
+ noauth debug nodefaultroute
+ </pre></dd>
+ <dt>Answer side <i>/etc/ppp/mmsgate.chat</i> file</dt>
+ <dd><pre>
+TIMEOUT 3 "" "ATZ" "OK-ATZ-OK" "" ABORT "BUSY" ABORT "NO CARRIER"
+ABORT "NO DIAL TONE" ABORT "ERROR" ABORT "VOICE" REPORT CONNECT ""
+#AT+CBST=7,0,1;+DS=3,0,1300,32;+CR=1;+DR=1 OK
+ATD+420602900666
+TIMEOUT 90 CONNECT "" ^M ""
+ </pre></dd>
+</dl>
+
+<p>Some decoded data illustration</p>
+<pre>
+MMS Message Encapsulation
+ Message-Type: m-retrieve-conf (0x84)
+ Transaction-ID: PVve-6DaCUEAAC5qAAAAAQAAAEoAAAAA
+ MMS-Version: 1.0
+ Date: Aug 15, 2002 19:25:20.000000000
+ From: +4206CENSORED/TYPE=PLMN
+ Subject: testidD
+ To: +4206CENSORED/TYPE=PLMN
+ Message-Class: Informational (0x82)
+ Delivery-Report: No (0x81)
+ Content Type: application/vnd.wap.multipart.related (0x33)
+ Type: application/smil
+ Start: AAAA
+ Multipart body
+ Part: 1
+ Content Type: application/smil
+ Charset: us-ascii (0x0003)
+ Headers
+ Content-Location: AAAA
+ Data in this part
+ Part: 2
+ Content Type: image/gif (0x1d)
+ Headers
+ Content-Location: postcard.gif
+ Data in this part
+</pre>
+
+<p>@{[ a_href 'http://www.sonyericsson.com/T68i/','Sony Ericsson T68i' ]}
+MMS definition file URL decoded out of the data stream above:
+@{[ a_href 'http://wap.sonyericssonmobile.com/UAprof/T68R201.xml' ]}</p>
+
+
+<h2>Completed Subtasks</h2>
+<ul>
+ <li style="font-size: larger;">@{[ project 'etherealmmse' ]}</li>
+ <li style="font-size: larger;">@{[ project 'etherealwsp' ]}</li>
+</ul>
+
+
+
+
+
+
+
+
+
+
+
+
+
+HERE
+
+
+My::Web->footer();
--- /dev/null
+# $Id$
+# automake source for the Makefile of etmms/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+=
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+ <dia:diagramdata>
+ <dia:attribute name="background">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="paper">
+ <dia:composite type="paper">
+ <dia:attribute name="name">
+ <dia:string>#A4#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="tmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="bmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="lmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="rmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="is_portrait">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="scaling">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="fitto">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="grid">
+ <dia:composite type="grid">
+ <dia:attribute name="width_x">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="width_y">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_x">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_y">
+ <dia:int val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="guides">
+ <dia:composite type="guides">
+ <dia:attribute name="hguides"/>
+ <dia:attribute name="vguides"/>
+ </dia:composite>
+ </dia:attribute>
+ </dia:diagramdata>
+ <dia:layer name="Background" visible="true">
+ <dia:object type="Standard - Box" version="0" id="O0">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-52,-17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-52.5,-17.5;98.5,79.5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-52,-17"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="150"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="96"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O1">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-20,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-20.15,21.85;16.15,46.15"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-20,22"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="36"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O2">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-10,-13"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-10.25,-13.25;42.25,13.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-10,-13"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="52"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="26"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O3">
+ <dia:attribute name="obj_pos">
+ <dia:point val="16,-7"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.315,-11.05;34.365,-5.9"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GNU/Linux PC#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="16,-7"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O4">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-7.742,8.55;3.792,11.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#pppd(8)#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-2,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O5">
+ <dia:attribute name="obj_pos">
+ <dia:point val="34,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="28.258,8.55;39.792,11.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#pppd(8)#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="34,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O6">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-1,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-1,17.35;4.462,19.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#serial#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-1,19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O7">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,24"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.125,12.875;-1.875,24.125"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-2,24"/>
+ <dia:point val="-2,13"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.25"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="35,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="35,17.4;40.412,19.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#serial#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="35,19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O9">
+ <dia:attribute name="obj_pos">
+ <dia:point val="34,24"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="33.875,12.875;34.125,24.125"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="34,24"/>
+ <dia:point val="34,13"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.25"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O10">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-48,65"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-48.25,64.75;-15.75,75.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-48,65"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="32"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="10"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O11">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-32,68"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-47.642,65.6;-16.358,74.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Sony Ericsson T68i
+MMS Phone
+CSD MMS Dial Mode#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-32,68"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O12">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,42"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-19.4735,39.55;15.5235,42.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Simulated MMS Center#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-2,42"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="64,-3"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="63.75,-3.25;94.25,5.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="64,-3"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="30"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O14">
+ <dia:attribute name="obj_pos">
+ <dia:point val="79,1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="64.348,-1.4;93.652,4.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Real GSM Operator
+MMS Center#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="79,1"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:group>
+ <dia:object type="Standard - BezierLine" version="0" id="O15">
+ <dia:attribute name="obj_pos">
+ <dia:point val="54,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="53.7879,22.1904;57.8096,26.2121"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="54,23"/>
+ <dia:point val="56,21"/>
+ <dia:point val="59,24"/>
+ <dia:point val="57,26"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - BezierLine" version="0" id="O16">
+ <dia:attribute name="obj_pos">
+ <dia:point val="55,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="54.792,20.2024;59.7976,25.208"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="55,21"/>
+ <dia:point val="58,19"/>
+ <dia:point val="61,22"/>
+ <dia:point val="59,25"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - BezierLine" version="0" id="O17">
+ <dia:attribute name="obj_pos">
+ <dia:point val="56,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="55.7879,17.925;62.075,24.2121"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="56,19"/>
+ <dia:point val="59,16"/>
+ <dia:point val="64,21"/>
+ <dia:point val="61,24"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - BezierLine" version="0" id="O18">
+ <dia:attribute name="obj_pos">
+ <dia:point val="62,14"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="61.7879,13.1904;65.8096,17.2121"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="62,14"/>
+ <dia:point val="64,12"/>
+ <dia:point val="67,15"/>
+ <dia:point val="65,17"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - BezierLine" version="0" id="O19">
+ <dia:attribute name="obj_pos">
+ <dia:point val="63,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="62.792,11.2024;67.7976,16.208"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="63,12"/>
+ <dia:point val="66,10"/>
+ <dia:point val="69,13"/>
+ <dia:point val="67,16"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - BezierLine" version="0" id="O20">
+ <dia:attribute name="obj_pos">
+ <dia:point val="64,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="63.7879,8.92495;70.075,15.2121"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="64,10"/>
+ <dia:point val="67,7"/>
+ <dia:point val="72,12"/>
+ <dia:point val="69,15"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - BezierLine" version="0" id="O21">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-27,60"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-27.2121,59.1904;-23.1904,63.2121"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="-27,60"/>
+ <dia:point val="-25,58"/>
+ <dia:point val="-22,61"/>
+ <dia:point val="-24,63"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - BezierLine" version="0" id="O22">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-26,58"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-26.208,57.2024;-21.2024,62.208"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="-26,58"/>
+ <dia:point val="-23,56"/>
+ <dia:point val="-20,59"/>
+ <dia:point val="-22,62"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - BezierLine" version="0" id="O23">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-25,56"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-25.2121,54.925;-18.925,61.2121"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="-25,56"/>
+ <dia:point val="-22,53"/>
+ <dia:point val="-17,58"/>
+ <dia:point val="-20,61"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - BezierLine" version="0" id="O24">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-21,53"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-21.2121,52.1904;-17.1904,56.2121"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="-21,53"/>
+ <dia:point val="-19,51"/>
+ <dia:point val="-16,54"/>
+ <dia:point val="-18,56"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - BezierLine" version="0" id="O25">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-20,51"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-20.208,50.2024;-15.2024,55.208"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="-20,51"/>
+ <dia:point val="-17,49"/>
+ <dia:point val="-14,52"/>
+ <dia:point val="-16,55"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - BezierLine" version="0" id="O26">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-19,49"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-19.2121,47.925;-12.925,54.2121"/>
+ </dia:attribute>
+ <dia:attribute name="bez_points">
+ <dia:point val="-19,49"/>
+ <dia:point val="-16,46"/>
+ <dia:point val="-11,51"/>
+ <dia:point val="-14,54"/>
+ </dia:attribute>
+ <dia:attribute name="corner_types">
+ <dia:enum val="0"/>
+ <dia:enum val="0"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O27">
+ <dia:attribute name="obj_pos">
+ <dia:point val="16,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="9.862,3.55;22.188,9.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Ethereal
+sniff#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="16,6"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O28">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-3.6,-3.15;35.6,8.15"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="-2,8"/>
+ <dia:point val="-2,-3"/>
+ <dia:point val="34,-3"/>
+ <dia:point val="34,8"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O29">
+ <dia:attribute name="obj_pos">
+ <dia:point val="16,-3"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="14.4,-3.15;17.6,3.15"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="16,-3"/>
+ <dia:point val="16,3"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O30">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-18,24"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-18.25,23.75;14.25,34.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-18,24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="32"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="10"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O31">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,27"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-18.3355,24.55;14.2855,33.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Nokia Communicator
+Modem
+ATA (answer mode)#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-2,27"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O32">
+ <dia:attribute name="obj_pos">
+ <dia:point val="18,24"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.75,23.75;50.25,34.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="18,24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="32"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="10"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O33">
+ <dia:attribute name="obj_pos">
+ <dia:point val="34,27"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.6645,24.55;50.2855,33.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Nokia Communicator
+Modem
+ATD (dial mode)#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="34,27"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ </dia:layer>
+</dia:diagram>
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# JavaScript detection scriptlet Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package have_js;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Homepage of Jan Kratochvil',
+ );
+# Do not: My::Web->heading();
+$W->{"r"}->send_http_header("text/javascript");
+
+# Prevent redirection of some top (referring) foreign webpage as it
+# may not pass "have_js=1" to us anyway. (for example Google cache)
+print ""
+ .'if (0'."\n"
+ ."\t\t".'|| window.location.hostname=="'.$W->{"r"}->hostname().'" && window.location.port== 80'."\n"
+ ."\t\t".'|| window.location.hostname=="'.'localhost' .'" && window.location.port==7680)'."\n";
+print <<'HERE';
+ {
+ var searchN=window.location.search;
+ if (searchN=="" || searchN=="?")
+ searchN="?";
+ else
+ searchN+="&";
+ searchN+="have_js=1";
+
+ window.location.href
+ =window.location.protocol+"//"
+ +window.location.hostname
+ +(window.location.port==80 ? "" : ":"+window.location.port)
+ +window.location.pathname
+ +window.location.hash
+ +searchN;
+ }
+HERE
+
+# Do not: My::Web->footer();
--- /dev/null
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.1 (GNU/Linux)
+
+mQGiBD2h6DgRBADenq5efAujJXIdXgnaKsdjNs7Ld1O5YoCE9lTzGHKw0o8uaaal
+/IuNi2qSG8zRnXMEEvQpPbnLiq3Na/oUMSBXJuSM68dNeTyGKEsBs/zmCFqtv+oD
+T4R6Ux3q7zDGSkcpa5mbUuW22HNLbhpSv2LWUg/DMRjMeFL3rKvqIcv3zwCgrthY
+rrGehDsrcD3Dsp+OGoj3EQkD/i3IEFozsCXpdnY96S/JVyTN6mhxW3NzhXzHgG+y
+oX82PBWPt4JOEVTAlpzHpUK10Agvei8d3YojtnEGy4TgiWZB5gQMpYsNINAP7UW8
+0tvblUX2dZEDNimJ68kTOFOFfu2hIDBSKplGSCqYmNJIB4Jojz+6sgRg6eB6o79N
+uaxLA/4tEQUBkpl469AORAodkzNlVTxpwYTpa4YzoeAwa1h5ZKAuWbaKujSfdGpF
+kKOvKsp/i1C1eIKvH1iiGGizhlMGRjHOrPDBHGbQnB/ACDJJ36GxwgPDZS+sLC/T
+8sK4NI6L0z2qgy7/ypqF6fEpoL64vFvvJKnKv8V/wQsbqr83uLQvSmFuIEtyYXRv
+Y2h2aWwgPHBncC00NEZDNzYzMkBqYW5rcmF0b2NodmlsLm5ldD6IXQQTEQIAHQUC
+PaHpWgUJA8JnAAULBwoDBAMVAwIDFgIBAheAAAoJEMw+/LlE/HYysgsAoJCW/9BV
+VqfrfmoD+YktgNbgZjvsAJ9G6JoUgZyM8QHLtcUZOtsNKNTa5IhGBBARAgAGBQI9
+pDS7AAoJECCEtPrx50OBNRwAn0C3TyT4BBqX6yteUDczKMuD0CK1AJ44lw8ht+YZ
+6wPE82sPpwvIrJImb7kCDQQ9oeiPEAgAsMFBmBCGfPrA4HI5R45QkNYvI6ldjsDV
+8jbQ9A37VmnvApsox421pbcerGYlJMZx6BgMCILoJgiih84VQMwARWRdraeTu2Kt
+lrnJQmxxRf9eq4fiDFEwMjKvT7JPtEpC4jR6UBQ3BZAfo/buMmePlKisaMXw2tqL
+BwaIgwzDm1qm+kjwdvfOEjbNlG0VGDjuT2lDs0LfiHdIE/S0c5tys94ecsJu1sfq
+19Lv1BYDEs/oSLqCW1rxeUYYsgSQ8cwbK5JYYgLFPNx+oIB/vDH1kn6srdcOunMe
+zprQuLnPWCS91KZ09aaSnuYsf/72JYHaIxflygtCExMu5i8zax2eFwADBwf/RXLm
+50lIQ3JLUvL3q3KTQkX70/1Xb1pJ6ypT0TUNwH7BChpZWpBBI9VYiLoG5sQ235KK
+JcO1Fq1zTW2Mb1TlXcIZ52raPsZvVBN9cY+vot/Zug3FNZq7Y5GUQt6DCOB2ZwRE
+jQOc+T78w71kgnZ/xBDNal8GhLfjo/gRVcO7XpuSEy0/Jh9m7Bkj6BCwFNqkx85o
+RAIzLeOQVjiSBFOjwYvE5NULbtY1CYU7SHpiSSAnDTL1k8u2zxi8XcNIO7h6e3jE
+WylQbT9Bxp/D5ocD1vSyViBfW6DRQ5eUu3taqPfI9Xgxg/F6pQBQQ8yKkV6eFhPF
+73xpOc2gNJswlsCx44hMBBgRAgAMBQI9oeiPBQkDwmcAAAoJEMw+/LlE/HYyoU0A
+oJzhwVIejRBppzWYb1dwDQBScO0AAJ4iHaUVFxv8w7Hq94x8w+AJupB1Zw==
+=xebT
+-----END PGP PUBLIC KEY BLOCK-----
+++ /dev/null
-Options +ExecCGI
-DirectoryIndex list.cgi.pl index.html
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::332'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::332::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::332::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::332::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>Project was destined as the kernel for GPS-tracking device.
+Used Motorola 68332 computer features 1.25MB of RAM and 512KB of FlashEPROM.
+Included build script with custom GCC target for AmigaOS.</p>
+<p>Fortunately Pavel Troller already disassembled the kernel core in the past
+and this project could be based on his reverse engineered sources.</p>
+<p>@{[ a_href "/project/332/332-noexec.tar.gz",'Downloadable sources' ]} archive unfortunately
+legally cannot contain the real code of the ported AmigaOS kernel core as
+@{[ a_href 'http://amigaworld.net/modules/newbb/viewtopic.php?forum=2&topic_id=224','it is copyrighted.' ]}.
+You should send me a mail with md5sum(1)s of AmigaOS kernel including
+statement you are the legal owner to let me send you the missing patched
+AmigaOS kernel core disassembled sources.</p>
+<p>The provided kernel lists the following features:</p>
+<ul>
+ <li>memory management</li>
+ <li>system objects lists operations</li>
+ <li>multitasking</li>
+ <li>intertask messaging</li>
+ <li>device drivers communication</li>
+ <li>locking/synchronization</li>
+ <li>system libraries management</li>
+ <li>server side for remote serial port debuggin</li>
+</ul>
+
+@{[ centerimg
+ ["332-front-board-small.jpeg","Custom Board (front)","a_href_img"=>"332-front-board.jpeg"],
+ ["332-back-board-small.jpeg" ,"Custom Board (back)" ,"a_href_img"=>"332-back-board.jpeg"]
+ ]}
+@{[ centerimg "332-front-CPU.jpeg" ,"68332 CPU Board Detail" ]}
+HERE
+
+
+My::Web->footer();
#! /usr/bin/perl
#
# $Id$
-# Main page Perl template.
+# Definition of 'My::Project::332' for list.cgi.pl
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::332::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
use My::Web;
-use Carp qw(cluck confess);
-My::Web->init(
- "title"=>'Homepage of Jan Kratochvil alias Lace',
- );
-My::Web->heading();
-
-print <<'HERE';
-<h1>Jan Kratochvil</h1>
-<hr />
-
-<h2><a href="project/">Software projects</a></h2>
-<blockquote>
-<p>List of my software projects</p>
-</blockquote>
-
-<h2><a href="http://cvs.jankratochvil.net/">ViewCVS of my CVS repository</a></h2>
-<blockquote>
-<p>My public CVSROOT; Accessible storage of all of my projects, config files, webs and more.</p>
-</blockquote>
-
-<h2>Contact</h2>
-<blockquote>
-<p>e-mail: <a href="mailto:web-www.jankratochvil.net@jankratochvil.net">web-www.jankratochvil.net@jankratochvil.net</a></p>
-</blockquote>
-
+our @ListItem=(
+ "name"=>"332",
+ "platform"=>"unixdevel",
+ "priority"=>630,
+ "icon"=>"332-front-icon.jpeg",
+ # FIXME: Relative 'download':
+ "download-sources without patched core"=>"/project/332/332-noexec.tar.gz",
+ "summary"=>"AmigaOS kernel port to embedded Motorola 68332",
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "sponsorship"=>@{[ a_href('http://www.geoinvest.cz/','Geoinvest') ]},
+ "language"=>"680x0 asm, C",
+ "description"=><<"HERE",
+<p>Core of the AmigaOS kernel (exec.library) ported to embedded Motorola 68332 computer.
+Reusable as OS for your embedded device suitable for developers with AmigaOS experience.</p>
HERE
+ );
-My::Web->footer();
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/332/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::AutoGen'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::AutoGen::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::AutoGen::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::AutoGen::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::AutoGen' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::AutoGen::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"AutoGen",
+ "platform"=>"unixdevel",
+ "priority"=>540,
+ "cvs"=>"macros",
+ "link-Documentation"=>'/project/Pod2Html.html.pl?cvs=macros/AutoGen.pm',
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "link-Source file"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/macros/AutoGen.pm?rev=HEAD",
+ "summary"=>"autogen.sh while supporting CVS/.rpm/.deb",
+ "license"=>"GPL",
+ "maintenance"=>"active",
+ "language"=>"Perl",
+ "description"=><<"HERE",
+<p>Projects usually have their <strong>autogen.sh</strong> script files to run
+<strong>autoconf</strong>(1), <strong>automake</strong>(1) and similiar tools.
+This project has some additional features:</p>
+<ul>
+ <li>
+ Clean the checkout directory without <strong>Makefile</strong>s for
+ 'make clean'.
+ </li>
+ <li>
+ Maintain <strong>.cvsignore</strong> files containing the files being
+ cleaned.
+ </li>
+ <li>
+ Single-command package building of
+ <strong>.rpm</strong>/<strong>.deb</strong> out of CVS checkout.
+ </li>
+ <li>
+ Support: <strong>gettext</strong>, <strong>glib-gettext</strong>,
+ <strong>libtool</strong>, <strong>autoconf</strong>,
+ <strong>automake</strong>.
+ </li>
+</ul>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/AutoGen/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+;DEBUG equ 1
+
+;TODO:
+; TRANSMIT/K/M & AppMessage w/arg>1
+
+ include "ssmac.h"
+
+BaudRateBase equ 1200
+Def_BaudRateN equ 3
+Def_BaudRate equ BaudRateBase<<Def_BaudRateN
+Def_Micros equ 0 ;1000
+SerBufSiz equ 1024
+LineBufSiz equ 1024
+AppBufSiz equ 256
+ASCII_ACK equ 6
+ASCII_EOT equ 4
+ASCII_CR equ 13
+ASCII_LF equ 10
+Char_Term equ '^' ;Termination
+Char_TermRepl equ '?' ;How to replace Char_Term during recv
+Char_CasCR equ $E4 ;<-/
+Char_CasSep equ $F3 ;/#|
+MUIMaster_MVer equ 14
+MUITags equ $80420000
+PackMenuHots equ 7
+FirstMenuCode equ 6
+SerErrTabSize equ 13 ;*4
+
+ start
+
+ dbuf Buttons,0
+ dv.l TransmitButton
+ dv.l ReceiveButton
+ dv.l SettingsButton
+ dv.l QuitButton
+ dv.l AbortButton
+ dv.l SaveButton
+ dv.l UseButton
+ dv.l RestoreButton
+ dv.l CloseButton
+ dv.l StatBar0
+ dv.l StatBarNum0
+ dv.l StatBar1
+ dv.l StatBarNum1
+ dv.l StatBar2
+ dv.l StatBarNum2
+ dv.l StatBar3
+ dv.l StatBarNum3
+ dv.l StatBar4
+ dv.l StatBarNum4
+ dv.l StatBar5
+ dv.l StatBarNum5
+ dbuf.l PartCounts,6
+ dbuf Bitmaps,6*(bm_SIZEOF-7*4)
+ dbuf.l SerErrMem,SerErrTabSize
+ dv.l SerialTrk
+ dv.l SerialIO
+ dv.l TimerTrk
+ dv.l CurLine
+ dv.l TxFileSize
+ dv.l ErrPtr
+ dv.l muimasterbase
+ dv.l MUIWaitMask
+ dv.l BaudRateSlider
+ dv.l BaudRateClass
+ dv.l MenuStrip
+ dv.l TransmitMItem
+ dv.l ReceiveMItem
+ dv.l ConfigMItem
+ dv.l StatBarText
+ dv.l StatBarBMap
+ dv.l TransmitFName
+ dbuf WOpenHook,h_SIZEOF
+ dbuf AppObjHook,h_SIZEOF
+ dbuf SerBuf,SerBufSiz ;A!
+ dbuf LineBuf,LineBufSiz ;A!
+ dbuf AppDropBuf,AppBufSiz
+ dv.w GaugeSet
+ dbuf.w MenusHots,PackMenuHots
+ dv.b CurPart
+ dv.b SerByte
+ dv.b TimerPend
+ dv.b FallOut
+ dv.b Inside
+ dv.b InAbort
+ dv.b GotCmdArgs
+
+ moveq #Def_Micros,d1
+ get.l Arg_MicroWait,d0
+ beq.s NoMicros
+ move.l d0,a0
+ move.l (a0),d1
+NoMicros put.l d1,Arg_MicroWait
+ dtl <serial.device>,a0
+ get.l Arg_Device,d0
+ beq.s NoDevice
+ move.l d0,a0
+ move.l (a0),a0
+NoDevice put.l a0,Arg_Device
+ moveq #0,d1
+ get.l Arg_DevUnit,d0
+ beq.s NoDevUnit
+ move.l d0,a0
+ move.l (a0),d1
+NoDevUnit put.l d1,Arg_DevUnit
+ move.l #Def_BaudRate,d1
+ get.l Arg_Baud,d0
+ beq.s NoBaud
+ move.l d0,a0
+ move.l (a0),d1
+NoBaud put.l d1,Arg_Baud
+
+ lea SerErrTab(pc),a0
+ move.l a0,a2
+ geta SerErrMem,a1
+LoopSerErr move.b -(a0),1(a1)
+ beq.s DoneSerErr
+ moveq #0,d0
+ move.b -(a0),d0
+ move.b d0,3(a1)
+ addq #4,a1
+ subq.b #1,d0
+LoopSerErr2 move.l a2,(a1)+
+SkipSerErr tst.b (a2)+
+ bne.s SkipSerErr
+ dbra d0,LoopSerErr2
+ bra.s LoopSerErr
+
+DoneSerErr get.l Arg_To,d0
+ vor.l Arg_From,d0
+ snev GotCmdArgs
+ tstv.l Arg_MUI
+ bne.s DoMUI
+ tst.l d0
+ bne ProcessCmdArgs
+DoMUI dtl <muimaster.library>,a0
+ moveq #MUIMaster_MVer,d0
+ call TrackLibrary
+ put.l d0,muimasterbase
+ move.l d0,a6
+ bset.b #svfb_errorreq,sv_flags+3(v)
+
+ dtl <_Transmit>,a2
+ dt <_Receive>
+ dt <_Settings>
+ dt <_Quit>
+ dt <_Abort>
+ dt <_Save>
+ dt <_Use>
+ dt <_Restore>
+ dt <_Close>
+ geta Buttons,a3
+ moveq #8,d2
+LoopMakeObj push a2
+ move.l sp,a0
+ moveq #MUIO_Button,d0
+ call muimaster,MUI_MakeObjectA
+ addq #4,sp
+ move.l d0,(a3)+
+ bne.s GenTButton
+MUIDosError dtl <MUI error>,a0
+SSDosError jump ss,DosError
+
+GenTButton tst.b (a2)+
+ bne.s GenTButton
+ move.l d0,a0
+ move.w #MUIA_CycleChain-MUITags,d0
+ moveq #TRUE,d1
+ bsr SetAttr
+ dbra d2,LoopMakeObj
+
+ move.w #MUIA_InputMode-MUITags,d0
+ moveq #MUIV_InputMode_Toggle,d1
+ get.l SettingsButton,a0
+ bsr SetAttr
+ move.w #MUIA_Weight-MUITags,d0
+ moveq #0,d1
+ get.l AbortButton,a0
+ bsr SetAttr
+
+ move.w #MUIA_Popstring_Toggle-MUITags,d0
+ moveq #1,d1
+ get.l TransmitButton,a0
+ bsr SetAttr
+ move.w #MUIA_Popstring_Toggle-MUITags,d0
+ moveq #1,d1
+ get.l ReceiveButton,a0
+ bsr SetAttr
+
+ moveq #(6*32*16/8)>>2,d0
+ rol.l #2,d0
+ moveq #MEMF_PUBLIC!MEMF_CHIP,d1
+ call ss,TrackAllocMem
+ move.l d0,a6
+
+ lea CasioIcons(pc),a2
+ lea PartTab(pc),a4
+ geta Bitmaps,a3
+ geta StatBar0,a1
+ moveq #5,d7
+SkipZeroPart tst.b (a4)+
+ beq.s SkipZeroPart
+ lea -1(a4),a0
+ put.l a0,StatBarText
+ put.l a3,StatBarBMap
+ move.l #$00040010,(a3)+ ;bm_BytesPerRow+bm_Rows
+ move.l #$00010000,(a3)+ ;bm_Flags+bm_Depth+bm_Pad
+ move.l a6,(a3)+ ;bm_Planes[0]
+ moveq #15,d0
+GenIconLine move.w (a2)+,d1
+ moveq #15,d2
+GenIconPix move.w d1,d4
+ roxr.w #1,d4
+ roxr.l #1,d3
+ roxr.w #1,d1
+ roxr.l #1,d3
+ dbra d2,GenIconPix
+ move.l d3,(a6)+
+ dbra d0,GenIconLine
+ mpush a1-a3/a6
+ lea MUI_StatBar(pc),a3
+ bsr GenerateMUI
+ mpop a1-a3/a6
+ move.l d0,(a1)+ ;StatBar
+ get.l StatBarNumber,(a1)+ ;StatBarNum
+SkipPartPart tst.b (a4)+
+ bne.s SkipPartPart
+ dbra d7,SkipZeroPart
+
+ move.l #gnm_SIZEOF*PackMenuNum+1,d0
+ move.l d0,d2
+ call ss,IPAlloc
+ clr.l -(sp)
+ push d0
+ move.l d0,a3
+ add.l d0,d2
+ subq.l #1,d2
+ lea PackMenus(pc),a2
+ geta MenusHots,a4
+ moveq #FirstMenuCode,d3
+NextMenuField addq.b #NM_ITEM,(a3)
+NextMenuTag move.b (a2)+,d0
+ beq.s GotMenuTitle
+ bpl.s GotMenuHot
+ addq.b #1,d0
+ bne.s NotMenuSepar
+ subq.l #-NM_BARLABEL,gnm_Label(a3)
+ bra.s NextMenuRecord
+
+NotMenuSepar move.w #CHECKIT!MENUTOGGLE,gnm_Flags(a3)
+ bra.s NextMenuTag
+
+GotMenuTitle subq.b #NM_ITEM-NM_TITLE,(a3)
+GotMenuHot subq.b #2,d0
+ bmi.s NotMenuHot
+ move.b d0,(a4)
+ move.l a4,gnm_CommKey(a3)
+ addq #2,a4
+NotMenuHot move.l a2,gnm_Label(a3)
+ToEndLabel tst.b (a2)+
+ bne.s ToEndLabel
+ move.l d3,gnm_UserData(a3)
+ addq.l #1,d3
+NextMenuRecord lea gnm_SIZEOF(a3),a3
+ cmp.l a3,d2
+ bne.s NextMenuField
+ move.l sp,a0
+ moveq #MUIO_MenustripNM,d0
+ call muimaster,MUI_MakeObjectA
+ put.l d0,MenuStrip
+ beq MUIDosError
+ addq #8,sp
+ pea (FirstMenuCode+1).w
+ push #MUIM_FindUData
+ move.l d0,a2
+ bsr DoMethod
+ put.l d0,TransmitMItem
+ addq.l #1,4(sp) ;2
+ bsr DoMethod
+ put.l d0,ReceiveMItem
+ beq MUIDosError
+ addq.l #6,4(sp) ;8
+ bsr DoMethod
+ put.l d0,ConfigMItem
+ beq MUIDosError
+ addq #8,sp
+
+ get.l sv_thistask,a0
+ move.l v,TC_Userdata(a0)
+ sub.l a0,a0
+ gett STR_Slider,a1
+ sub.l a2,a2
+ moveq #6,d0
+ lea BaudRateFunc(pc),a3
+ call muimaster,MUI_CreateCustomClass
+ put.l d0,BaudRateClass
+ beq MUIDosError
+ move.l d0,a0
+ move.l mcc_Class(a0),a0
+ clr.l -(sp)
+ push sp ;TRUE
+ push #MUIA_CycleChain
+ pea Def_BaudRateN.w
+ push #MUIA_Numeric_Max
+ pea Def_BaudRateN.w
+ push #MUIA_Numeric_Value
+ pea 3.w
+ push #MUIA_ExportID
+ sub.l a1,a1
+ move.l sp,a2
+ call intuition,NewObjectA
+ lea 4*8+4(sp),sp
+ put.l d0,BaudRateSlider
+ beq MUIDosError
+
+ lea MUI_Applic(pc),a3
+ bsr GenerateMUI
+
+ lea MUI_Notific(pc),a3
+ bsr SetNotify
+
+ push TriggerValPtr(pc) ;28
+ vpush MainWin ;24
+ push #MUIM_Popstring_Open ;20
+ pea 1.w ;16
+ vpush TransmitAsl ;12
+ pea (FirstMenuCode+1).w ;8
+ push #MUIA_Application_MenuAction ;4
+ push #MUIM_Notify ;0
+ bsr DoMethodAppl
+ addq.l #1,8(sp) ;2
+ get.l ReceiveAsl,12(sp)
+ bsr DoMethod
+ addq.l #2,8(sp) ;4
+ get.l ApplObj,12(sp)
+ addq.l #1,16(sp) ;->2
+ move.w #MUIM_Application_AboutMUI-MUITags,22(sp)
+ bsr DoMethod
+ addq.l #5,8(sp) ;9
+ moveq #MUIV_Application_Load_ENVARC,d0
+ move.l d0,24(sp)
+ move.w #MUIM_Application_Load-MUITags,22(sp)
+ bsr DoMethod
+ addq.l #1,8(sp) ;10
+ move.w #MUIM_Application_OpenConfigWindow-MUITags,22(sp)
+ clr.l 24(sp)
+ bsr DoMethod
+ move.w #MUIA_Window_Open-MUITags,6(sp)
+ move.l EveryTimePtr(pc),8(sp)
+ move.w #MUIM_CallHook-MUITags,22(sp)
+ geta WOpenHook,a0
+ lea WinOpenHook(pc),a1
+ move.l a1,h_Entry(a0)
+ move.l v,h_Data(a0)
+ move.l a0,24(sp)
+ get.l MainWin,a2
+ bsr DoMethod
+ move.w #MUIA_AppMessage-MUITags,6(sp)
+ move.l a2,12(sp)
+ addq.l #1,16(sp) ;->3
+ geta AppObjHook,a0
+ lea AppDropHook(pc),a1
+ move.l a1,h_Entry(a0)
+ move.l v,h_Data(a0)
+ move.l a0,24(sp)
+ bsr DoMethod
+ lea 8*4(sp),sp
+
+ bsr ActRestore
+
+ move.w #MUIA_Window_Open-MUITags,d0
+ moveq #TRUE,d1
+ get.l MainWin,a0
+ bsr SetAttr
+ move.w #MUIA_Window_Open-MUITags,d0
+ get.l MainWin,a0
+ bsr GetAttr
+ beq MUIDosError
+
+ bsr ProcessCmdArgs
+ tstv.b GotCmdArgs
+ bne Return8
+
+LoopNewInput bsr.s DoMUIPoll
+ get.l MUIWaitMask,d0
+ beq.s LoopNewInput
+ bsr.s MUIPollEnd
+ bra.s LoopNewInput
+
+MUIPollEnd bset.l #SIGBREAKB_CTRL_C,d0
+ call exec,Wait
+ put.l d0,MUIWaitMask
+ btst.l #SIGBREAKB_CTRL_C,d0
+ beq Return8
+BreakOut moveq #err_break,d0
+SSReportError jump ss,ReportError
+
+DoMUIPoll call ss,TestBreak
+ push a2
+ vpea MUIWaitMask
+ push #MUIM_Application_NewInput
+ bsr DoMethodAppl
+ addq #8,sp
+ pop a2
+ addq.l #1,d0
+ beq EXIT ;MUIV_Application_ReturnID_Quit
+ subq.l #2,d0
+ bmi Return8
+ moveq #8,d1
+ cmp.l d0,d1
+ bcs Return8
+ cmp.w #5,d0
+ bcc.s CallAct
+ tstv.b Inside
+ bne.s Return8
+CallAct add.l d0,d0
+ lea ButtonAct(pc),a0
+ add.w (a0,d0.w),a0
+ jmp (a0)
+
+ButtonAct dc.w ActTransmit-ButtonAct ;0
+ dc.w ActReceive-ButtonAct ;1
+ dc.w ActSave-ButtonAct ;2
+ dc.w ActUse-ButtonAct ;3
+ dc.w ActRestore-ButtonAct ;4
+ dc.w ActAbort-ButtonAct ;5
+ dc.w Return8-ButtonAct ;6
+ dc.w Return8-ButtonAct ;7
+ dc.w ActAbout-ButtonAct ;8
+
+ActAbout moveq #TRUE,d1
+ bsr.s ApplicSleep
+ dtl.lc <Casio-A version 1.0 - The communication>,a0
+ dt.lc <software for Casio organizers series SF-Ax0>
+ dt.lc <© 1996 Short Software ',60,'short@k332.feld.cvut.cz',62,'>
+ dt.lc <This software is FreeWare.>
+ dt.lc <>
+ dt.lc <Thanks to Pavouk ',60,'pavouk@k332.feld.cvut.cz',62,'>
+ dt.lc <for testing, icons and hardware support.>
+ dt.lc <>
+ dt.lc <This is a MUI-Application,
+ dt <see "Project/About MUI..." for more.>
+ push a2
+ dtl <Okay>,a2
+ call ss,SimpleRequest
+ pop a2
+ moveq #FALSE,d1
+ApplicSleep move.w #MUIA_Application_Sleep-MUITags,d0
+ get.l ApplObj,a0
+ bra SetAttr
+
+ActUse push #MUIV_Application_Save_ENV
+ bra.s ActUseCont
+
+ActSave push #MUIV_Application_Save_ENVARC
+ActUseCont push #MUIM_Application_Save
+ bsr DoMethodAppl
+ addq #8,sp
+ move.w #MUIA_Window_Open-MUITags,d0
+ moveq #FALSE,d1
+ get.l ConfigWin,a0
+ bra SetAttr
+
+ActRestore push #MUIV_Application_Load_ENV
+ push #MUIM_Application_Load
+ bsr DoMethodAppl
+ addq #8,sp
+Return8 rts
+
+ActTransmit get.l Arg_From,d0
+ bne TrasmitClear
+ get.l TransmitText,a0
+ bsr GetAttrStr
+ bra DoTransmit
+
+ActReceive get.l ReceiveText,a0
+ bsr GetAttrStr
+ bra DoReceive
+
+ActAbort stv InAbort
+Return10 rts
+
+ChangeState0 tstv.l muimasterbase
+ beq.s Return10
+ moveq #0,d2
+;---------------
+ChangeState clr.l -(sp)
+ vpush ConfigGroup
+ vpush ReceiveButton
+ vpush TransmitButton
+ push d2
+ push #MUIA_Disabled
+ push #MUIM_MultiSet
+ bsr DoMethodAppl
+ lea 7*4(sp),sp
+ move.w #MUIA_Menuitem_Enabled-MUITags,d0
+ bchg.l #0,d2
+ move.l d2,d1
+ get.l TransmitMItem,a0
+ bsr.s SetAttr
+ move.w #MUIA_Menuitem_Enabled-MUITags,d0
+ move.l d2,d1
+ get.l ReceiveMItem,a0
+ bsr.s SetAttr
+ move.w #MUIA_Disabled-MUITags,d0
+ move.l d2,d1
+ get.l GaugeGroup,a0
+SetAttr clr.l -(sp)
+ push d1
+ move.w d0,-(sp)
+ move.w #MUITags>>16,-(sp)
+ move.l sp,a1
+ call intuition,SetAttrsA
+ lea 12(sp),sp
+ rts
+;---------------
+ProcessCmdArgs get.l Arg_To,d0
+ beq.s NoArgTo
+ bsr.s DoReceive
+ clrv.l Arg_To
+NoArgTo get.l Arg_From,d0
+ beq.s Return13
+TrasmitClear bsr.s DoTransmit
+ clrv.l Arg_From
+Return13 rts
+
+DoTransmit pea CallTransmit(pc)
+ moveq #1,d1
+ bra.s CallRoutine
+
+DoReceive pea CallReceive(pc)
+ moveq #2,d1
+CallRoutine put.b d1,Inside
+ push d0
+
+ tstv.l muimasterbase
+ beq.s SkipPrepCfg
+ moveq #1,d2
+ bsr ChangeState
+ get.l DeviceString,a0
+ bsr GetAttrStr
+ put.l d0,Arg_Device
+ move.w #MUIA_Numeric_Value-MUITags,d0
+ get.l UnitNumber,a0
+ bsr GetAttr
+ put.l d0,Arg_DevUnit
+ move.w #MUIA_Numeric_Value-MUITags,d0
+ get.l BaudRateSlider,a0
+ bsr GetAttr
+ moveq #1200>>4,d1
+ addq.l #4,d0
+ lsl.l d0,d1
+ put.l d1,Arg_Baud
+ move.w #MUIA_Numeric_Value-MUITags,d0
+ get.l MicroSecSlider,a0
+ bsr GetAttr
+ put.l d0,Arg_MicroWait
+
+ get.b Inside,d0
+ subq.b #1,d0
+ dtl <Transmitting... %ld%% done>,a0
+ beq.s SkipRecvInfo
+ dtl <Receiving... %ld%% done>,a0
+SkipRecvInfo move.l a0,d1
+ move.w #MUIA_Gauge_InfoText-MUITags,d0
+ get.l ProgressGauge,a0
+ bsr SetAttr
+ moveq #0,d0
+ bsr DoSetGauge
+ moveq #5,d2
+ vlea PartCounts+6*4,a2
+ move.l (v),a6
+ClearCounts clr.l -(a2)
+ move.l a2,a1
+ bsr.s SetNumber
+ dbra d2,ClearCounts
+SkipPrepCfg pop a1
+ pop a0
+ push a1
+ moveq #0,d0
+ clrv.b InAbort
+ call ss,CallBlock
+ get.b Inside,d0
+ bmi.s AskDelete
+ subq.b #2,d0
+ beq.s DoDelete
+ bra.s WasTransmit
+
+AskDelete dtl.lc <Data file "%s" hasn''t been received correctly.>,a0
+ dt <Do you want to delete this corrupted file?>
+ move.l sp,a1
+ dtl <Yes, I''ll retry.|No, leave it!>,a2
+ call ss,SimpleRequest
+ tst.l d0
+ beq.s WasTransmit
+DoDelete move.l (sp),d1
+ call dos,DeleteFile
+WasTransmit addq #4,sp
+ clrv.b Inside
+ tstv.b FallOut
+ beq ChangeState0
+EXIT stv FallOut
+SSExitCleanup jump ss,ExitCleanup
+
+AddPartCount moveq #0,d0
+ get.b CurPart,d0
+ beq.s IsZeroPart
+ subq.b #2,d0
+IsZeroPart lsl.l #2,d0
+ lea PartCounts(v,d0.w),a1
+ addq.l #1,(a1)
+SetNumber push a2
+ lea -12(sp),sp
+ move.l sp,a2
+ push a1
+ dt PercLUT,<%lu>
+ gett PercLUT,a0
+ call ss,FormatStr
+ pop a1
+ move.l sp,d1
+ geta PartCounts,a0
+ sub.l a0,a1
+ add.l a1,a1
+ geta StatBarNum0,a0
+ move.l (a0,a1),a0
+ move.w #MUIA_Text_Contents-MUITags,d0
+ bsr SetAttr
+ lea 12(sp),sp
+ pop a2
+ move.l (v),a6
+ rts
+
+CallReceive move.l a1,a0
+ moveq #OPEN_NEW+OPEN_LINEBUF,d0
+ moveq #0,d1
+ call TrackOpenBuf
+ move.l d0,a3
+ stv CurPart
+ bsr SerialInit
+ put.b #ASCII_ACK,SerByte
+WaitSig1 bsr GetSerByte
+ cmp.b #ASCII_CR,d0
+ bne.s WaitSig1
+ bsr GetSerByte
+ cmp.b #ASCII_LF,d0
+ bne.s WaitSig1
+ stv.b Inside
+NextRcvPacket tstv.l muimasterbase
+ beq.s NotUpdGauge
+ get.b CurPart,d0
+ bmi.s NotUpdGauge
+ bne.s NotZeroPart
+ moveq #2,d0
+NotZeroPart subq.l #1,d0
+ moveq #100,d1
+ mulu.w d1,d0
+ moveq #7,d1
+ divu.w d1,d0
+ bsr.s ChkSetGauge
+NotUpdGauge bsr SendItNow
+ bsr GetSerByte
+ cmp.b #ASCII_EOT,d0
+ bne.s NotEndTrans
+ put.b d0,Inside
+FullGaugeRet moveq #100,d0
+ChkSetGauge vcmp.w GaugeSet,d0
+ bls Return7
+DoSetGauge tstv.l muimasterbase
+ beq Return7
+ put.w d0,GaugeSet
+ ext.l d0
+ move.l d0,d1
+ move.w #MUIA_Gauge_Current-MUITags,d0
+ get.l ProgressGauge,a0
+ bra SetAttr
+
+NotEndTrans cmp.b #2,d0
+ beq.s GotValidPkt
+ dtl <Packet type ID: $02/$04 is $%02x>,a0
+ move.w d0,-(sp)
+ExitErrorA1 move.l sp,a1
+ExitError jump ExitError
+
+GotValidPkt bsr GetSerByte
+ move.b d0,d7
+ vcmp.b CurPart,d0
+ beq.s IsCurPart
+ put.b d0,CurPart
+ cmp.b #8,d0
+ bcs.s SmallPartN
+BadPartN dtl <Unknown packet part #: $%02x>,a0
+ moveq #0,d0
+ get.b CurPart,d0
+ move.w d0,-(sp)
+ bra.s ExitErrorA1
+
+SmallPartN lea PartTab(pc),a4
+LoopPart subq.b #1,d0
+ bcs.s DoneParts
+ScanPart tst.b (a4)+
+ bne.s ScanPart
+ bra.s LoopPart
+
+DoneParts tst.b (a4)
+ beq.s BadPartN
+ dtl <',Char_Term,Char_Term,Char_Term,'>,a0
+ call BPuts
+ move.l a4,a0
+ call BPutsNL
+ bra.s NoFirstRec
+
+IsCurPart cmp.b #7,d7
+ beq.s NoFirstRec
+ dtl <',Char_Term,Char_Term,'>,a0
+ call BPutsNL
+NoFirstRec bsr GetSerByte
+ add.b d0,d7
+ move.b d0,d2
+ bsr GetSerByte
+ add.b d0,d7
+ rol.w #8,d0
+ move.b d2,d0
+ cmp.w #SerBufSiz-1,d0
+ bcs.s OkaySize
+ dtl <Packet too long: size=%u, max=%u>,a0
+ move.w #SerBufSiz-1,-(sp)
+ExitErrorD0W move.w d0,-(sp)
+ bra.s ExitErrorA1
+
+OkaySize geta SerBuf,a4
+ clr.b (a4,d0.l)
+ move.w d0,d2
+ move.w d0,d3
+ bsr SerReceiveX
+ bsr GetSerByte
+ move.l a4,a0
+NextXSumChar add.b d0,d7
+ move.b (a0)+,d0
+ dbra d2,NextXSumChar
+ tst.b d7
+ beq.s GoodXSum
+ dtl <Packet checksum bad - sum:$00 is $%02x>,a0
+ move.w d7,-(sp)
+ clr.b (sp)
+ bra ExitErrorA1
+
+GoodXSum bsr AddPartCount
+ st d4
+ get.b CurPart,d0
+ beq BefRecScan
+ cmp.b #7,d0 ;CALENDAR
+ beq.s DoCalendar
+ cmp.b #$F8,(a4)+
+ beq.s AfterF8
+ dtl <Packet data start magic @4:$F8 is $%02x>,a0
+ moveq #0,d0
+ move.b -(a4),d0
+ bra.s ExitErrorD0W
+
+DoCalendar cmp.w #6,d3
+ beq.s GoodCalLen
+ dtl <Calendar data length:6 is %u>,a0
+ move.w d3,-(sp)
+ bra ExitErrorA1
+
+GoodCalLen move.w (a4)+,d0
+ bsr.s PrintDate
+ moveq #':',d0
+ call BPutByte
+ moveq #3,d0
+ReadLELong move.b (a4)+,d2
+ ror.l #8,d2
+ dbra d0,ReadLELong
+ clr.w -(sp)
+NextDate addq.w #1,(sp)
+ ror.l #1,d2
+ bcc.s NotMarked
+ dtl < %02u>,a0
+ move.l sp,a1
+ call BPrintf
+NotMarked cmp.w #31,(sp)
+ bne.s NextDate
+ addq #2,sp
+ bra DoneThisRec
+
+PrintDate move.w d0,d1
+ and.w #$000F,d1
+ move.w d1,-(sp)
+ lsr.w #4,d0
+ add.w #$1900,d0
+ btst.l #8,d0
+ bne.s Not2000
+ add.w #$2000-$1A00,d0
+Not2000 move.w d0,-(sp)
+ dtl <%x-%02u>,a0
+ move.l sp,a1
+ call BPrintf
+ addq #4,sp
+Return7 rts
+
+AfterF8 cmp.b #5,d0 ;SCHEDULE
+ bne BefRecScan
+ cmp.b #12,d3
+ bcc.s LongSchedDat
+ dtl <Schedule data too short: size=%u, min=12>,a0
+ move.w d3,-(sp)
+ bra ExitErrorA1
+
+LongSchedDat moveq #0,d0
+ move.b 10(a4),d0
+ move.w d0,-(sp)
+ move.b 8(a4),d0
+ move.w d0,-(sp)
+ move.b 3(a4),d0
+ cmp.b #$F3,d0
+ bne.s BadSchDat
+ cmp.l #$00F30000,(sp)
+ beq.s GoodSched
+BadSchDat move.w d0,-(sp)
+ dtl <Bad schedule data - @8:$F3 is $%02x, @13:$F3 is $%02x, @15:$00 is $%02x>,a0
+ bra ExitErrorA1
+
+GoodSched addq #4,sp
+ move.w 1(a4),d0
+ rol.w #8,d0
+ bsr.s PrintDate
+ moveq #0,d0
+ move.b 4(a4),d0
+ move.w d0,-(sp)
+ move.b 5(a4),d0
+ move.w d0,-(sp)
+ move.b (a4),d0
+ move.w d0,-(sp)
+ dtl <-%02x: %02x:%02x>,a0
+ move.l sp,a1
+ call BPrintf
+ addq #6,sp
+ moveq #0,d0
+ move.b 7(a4),d0
+ cmp.b #$30,d0
+ beq.s NoEndTime
+ moveq #0,d1
+ move.b 6(a4),d1
+ move.w d1,-(sp)
+ move.w d0,-(sp)
+ dtl <-%02x:%02x>,a0
+ move.l sp,a1
+ call BPrintf
+ addq #4,sp
+ moveq #0,d0
+NoEndTime move.b 9(a4),d0
+ beq.s NoSchedImg
+ move.w d0,-(sp)
+ dtl.c < >,a0
+ dt PercUT,<%u>
+ move.l sp,a1
+ call BPrintf
+ addq #2,sp
+NoSchedImg moveq #10,d0
+ call BPutChar
+ lea 11(a4),a4
+
+BefRecScan moveq #0,d2
+MainRecScan move.b (a4)+,d0
+ beq.s DoneThisRec
+ cmp.b #Char_Term,d0
+ bne.s NotCharTerm
+ moveq #Char_TermRepl,d0
+ bra.s NotCharE4
+
+NotCharTerm cmp.b #Char_CasSep,d0
+ bne.s NotCharF3
+ tst.b d4
+ bne.s LoopRecScan
+ bsr.s FlushRecScan
+ moveq #Char_Term,d0
+ call BPutByte
+ bra.s DoCharNL
+
+NotCharF3 cmp.b #Char_CasCR,d0
+ bne.s NotCharE4
+DoCharNL addq.l #1,d2
+ bra.s LoopRecScan
+
+NotCharE4 move.w d0,-(sp)
+ bsr.s FlushRecScan
+ move.w (sp)+,d0
+ call BPutChar
+LoopRecScan clr.b d4
+ bra.s MainRecScan
+
+DoneThisRec moveq #10,d0
+ call BPutChar
+ bra NextRcvPacket
+
+FlushRecScan tst.l d2
+FlushRecScanX beq Return7
+ moveq #10,d0
+ call BPutChar
+ subq.l #1,d2
+ bra.s FlushRecScanX
+;***************
+CallTransmit put.l a1,TransmitFName
+ move.l a1,a0
+ moveq #OPEN_OLD,d0
+ moveq #0,d1
+ call TrackOpenBuf
+ push d0
+ tstv.l muimasterbase
+ beq.s EmptyFile
+ move.l d0,a0
+ move.l bh_handle(a0),d1
+ move.l d1,d4
+ moveq #0,d2
+ moveq #OFFSET_END,d3
+ call dos,Seek
+ moveq #OFFSET_BEGINNING,d3
+ move.l d4,d1
+ call Seek
+ put.l d0,TxFileSize
+ bne.s EmptyFile
+ addqv.l #1,TxFileSize
+EmptyFile bsr SerialInit
+ move.l (sp),a2
+ call BFlush
+ put.l sp,ErrPtr
+ moveq #0,d6
+ stv CurPart
+ move.w #ASCII_CR<<8!ASCII_LF,-(sp)
+ move.l sp,a0
+ moveq #2,d0
+ bsr DoSendBuf
+ addq #2,sp
+ bsr WaitAck
+NextLine addqv.l #1,CurLine
+ geta LineBuf,a3
+ move.l a3,a0
+ move.l #LineBufSiz,d0
+ call BGets
+ subq.l #1,d0
+ beq.s StringOK
+ bsr FlushRec
+ addq #4,sp
+ moveq #ASCII_EOT,d0
+ bsr DoSendByte
+ bra FullGaugeRet
+
+StringOK cmp.w #Char_Term<<8!Char_Term,(a3)
+ bne NotSpec
+ bsr FlushRec
+ addq #2,a3
+ tst.b (a3)
+ beq.s NextLine
+ cmp.b #Char_Term,(a3)+
+ beq.s ReadPartID
+DoInvUse dt InvUseT,<Invalid use of ''',Char_Term,'''%s>
+ tpea InvUseT
+ bra.s ErrDesc
+
+ReadPartID lea PartTab(pc),a4
+ clrv.b CurPart
+ moveq #0,d2
+LoopRdPartN move.l a3,a0
+ move.l a4,a1
+ call utility,Stricmp
+ move.l (v),a6
+ beq.s NextLine
+ScanRdPartN tst.b (a4)+
+ bne.s ScanRdPartN
+ addqv.b #1,CurPart
+ cmpv.b #8,CurPart
+ bne.s LoopRdPartN
+DoUnkPID dt UnkPIDT,<Unknown part ID%s>,a0
+ tpea UnkPIDT
+ErrDesc geta LineBuf,a0
+ push a0
+LenLine tst.b (a0)+
+ bne.s LenLine
+ sub.l (sp),a0
+ vpush CurLine
+ get.l TransmitFName,a2
+ push a2
+LenFName tst.b (a2)+
+ bne.s LenFName
+ sub.l (sp),a2
+ add.l a2,a0
+ lea 64(a0),a0
+ move.l a0,d0
+ call IPAlloc
+ move.l d0,a2
+ dtl < in "%s", line %lu: "%s">,a0
+ move.l sp,a1
+ call FormatStr
+ lea 12(sp),sp
+ pop a0
+ get.l ErrPtr,a1
+ move.l a2,(a1)
+ bra ExitErrorA1
+
+NotSpec move.l d6,a0
+ tst.l d6
+ bne AlreadyBeginX
+ moveq #0,d4
+ geta SerBuf,a0
+ move.b #2,(a0)+
+ get.b CurPart,d0
+ bmi.s DoUnkPID
+ move.b d0,(a0)+
+ clr.w (a0)+ ;Length 2 B filled L8R
+ cmp.b #7,d0
+ beq WrCalendar
+ tst.b d0
+ beq AlreadyBegin
+ move.b #$F8,(a0)+
+ move.b #Char_CasSep,(a0)+
+ cmp.b #5,d0
+ bne AlreadyBegin
+WrSchedule moveq #'-',d3
+ bsr ParseYear
+ move.w -(a4),d0
+ rol.w #8,d0
+ move.w d0,(a4)+
+ bsr SchedStrStr
+ cmp.l #32,d0
+ bcc BadSched
+ tst.l d0
+ beq BadSched
+ bsr ConvByteBCD
+ move.b d0,-3(a4)
+ move.w #Char_CasSep<<8,(a4)+
+ bsr SchReadHour
+ move.b d0,(a4)+
+ move.l a4,a0
+LoopSch2Col move.b (a3)+,d0
+ move.b d0,(a4)+
+ beq.s TermSch2ColX
+ cmp.b #' ',d0
+ beq.s TermSch2Col
+ cmp.b #'-',d0
+ bne.s LoopSch2Col
+TermSch2ColX subq #1,a3
+TermSch2Col bsr StrStrToLA4
+ cmp.l #60,d0
+ bcc.s BadSched
+ bsr ConvByteBCD
+ move.b d0,-2(a4)
+ clr.b (a4)+
+ move.l #$30F30000,(a4)+
+ move.l a4,a0
+SkipSchSpc move.b (a3)+,d0
+ beq.s DoneSchParse
+ cmp.b #' ',d0
+ beq.s SkipSchSpc
+ cmp.b #'-',d0
+ bne.s NoEndSchTim
+ bsr.s SchReadHour
+ move.b d0,-4(a4)
+ move.l a4,a0
+LoopSch3Col move.b (a3)+,d0
+ move.b d0,(a4)+
+ beq.s TermSch3Col
+ cmp.b #' ',d0
+ bne.s LoopSch3Col
+TermSch3Col bsr StrStrToLA4
+ cmp.l #60,d0
+ bcc.s BadSched
+ bsr.s ConvByteBCD
+ move.b d0,-5(a4)
+NoEndSchTim move.l a4,a0
+LoopSch4Col move.b (a3)+,d0
+ move.b d0,(a4)+
+ beq.s TermSch4Col
+ cmp.b #' ',d0
+ bne.s LoopSch4Col
+TermSch4Col bsr StrStrToLA4
+ move.l d0,d1
+ lsr.l #8,d1
+ bne.s BadSched
+ move.b d0,-2(a4)
+ subq #1,a3
+LoopSch5Col move.b (a3)+,d0
+ beq.s DoneSchParse
+ cmp.b #' ',d0
+ beq.s LoopSch5Col
+BadSched get.l ErrPtr,sp
+ dt BadSchedT,<Schedule format bad - req. "YEAR-MN-DY: HS:MS[-HE:ME] [ICON]"%s>
+ tpea BadSchedT
+ bra ErrDesc
+
+DoneSchParse move.l a4,d6
+ bra NextLine
+
+SchReadHour bsr SchedStrStr
+ cmp.l #24,d0
+ bcc.s BadSched
+ConvByteBCD divu.w #10,d0
+ move.w d0,d1
+ swap d0
+ rol.b #4,d1
+ or.b d1,d0
+ rts
+
+ParseYear move.l a0,a4
+LoopYrMin move.b (a3)+,d0
+ beq.s BadYear
+ move.b d0,(a4)+
+ cmp.b #'-',d0
+ bne.s LoopYrMin
+ bsr StrStrToLA4
+ cmp.l #2100,d0
+ bcs.s SmallYrYear
+BadYear dt BadYearT,<Year/Month format bad - req. "YEAR-MN"%s>
+ tpea BadYearT
+ bra ErrDesc
+
+SmallYrYear cmp.w #1901,d0
+ bcs.s BadYear
+ move.l d0,d2
+ move.l a4,a0
+LoopYrCol move.b (a3)+,d0
+ beq.s BadYear
+ move.b d0,(a4)+
+ cmp.b d3,d0
+ bne.s LoopYrCol
+ bsr StrStrToLA4
+ cmp.l #13,d0
+ bcc.s BadYear
+ tst.l d0
+ beq.s BadYear
+ sub.w #1900,d2
+ moveq #10,d1
+ divu.w d1,d2
+ swap d2
+ rol.b #4,d2
+ or.b d2,d0
+ move.b d0,1(a4)
+ clr.w d2
+ swap d2
+ divu.w d1,d2
+ swap d2
+ move.b d2,d0
+ swap d2
+ rol.b #4,d2
+ or.b d2,d0
+ move.b d0,(a4)
+ addq #2,a4
+Return2 rts
+
+WrCalendar moveq #':',d3
+ bsr.s ParseYear
+ moveq #0,d2
+NextCalenDay move.l a4,a0
+SkipSpcCalen move.b (a3)+,d0
+ beq.s SendCalend
+ cmp.b #' ',d0
+ beq.s SkipSpcCalen
+ bra.s SkipZeroCalI
+
+SkipZeroCal move.b (a3)+,d0
+SkipZeroCalI cmp.b #'0',d0
+ beq.s SkipZeroCal
+CopyDayNum move.b d0,(a4)+
+ move.b (a3),d0
+ beq.s DoneDayNum
+ addq #1,a3
+ cmp.b #' ',d0
+ bne.s CopyDayNum
+DoneDayNum clr.b (a4)
+ move.l a0,a4
+ call StrToL
+ subq.l #1,d0
+ bmi.s BadCalend
+ bset.l d0,d2
+ cmp.l #31,d0
+ bcs.s NextCalenDay
+BadCalend dt CalBadT,<Calendar format bad - req. "...: D1 D2 ... Dn"%s>
+ tpea CalBadT
+ bra ErrDesc
+
+SchedStrStr move.l a4,a0
+LoopSchCol move.b (a3)+,d0
+ beq BadSched
+ move.b d0,(a4)+
+ cmp.b #':',d0
+ bne.s LoopSchCol
+StrStrToLA4 clr.b -(a4)
+ move.l a0,a4
+ moveq #0,d0
+StrStrToL move.b (a0)+,d0
+ beq.s Return2
+ cmp.b #' ',d0
+ beq.s StrStrToL
+ cmp.b #'0',d0
+ beq.s StrStrToL
+ subq #1,a0
+ jump StrToL
+
+SendCalend moveq #3,d0
+WrCalenLong move.b d2,(a4)+
+ ror.l #8,d2
+ dbra d0,WrCalenLong
+ move.l a4,d6
+ bsr.s FlushRec
+ bra NextLine
+
+AlreadyBeginX moveq #Char_CasCR-$100,d0
+ bclr.l #0,d4
+ bne.s PutToBuf
+AlreadyBegin move.b (a3)+,d0
+ bne.s NotNL
+ addq.l #1,d4
+ move.l a0,d6
+ bra NextLine
+
+NotNL cmp.b #Char_Term,d0
+ bne.s PutToBuf
+ tst.b (a3)
+ bne DoInvUse
+ moveq #-1,d4
+ moveq #Char_CasSep-$100,d0
+PutToBuf geta SerBuf+SerBufSiz-1,a1
+ cmp.l a1,a0
+ bcs.s GoodPktLen
+ move.w #SerBufSiz,-(sp)
+ dt PktDatLT,<Packet data too long - max=%u%s>
+ tpea PktDatLT
+ bra ErrDesc
+
+GoodPktLen move.b d0,(a0)+
+ bra.s AlreadyBegin
+
+FlushRec tst.l d6
+ beq.s Return3
+ tstv.l muimasterbase
+ beq.s NoMUITxProg
+ call BTell
+ moveq #100,d1
+ call utility,UMult32
+ get.l TxFileSize,d1
+ call utility,UDivMod32
+ bsr DoSetGauge
+ bsr AddPartCount
+NoMUITxProg move.l d6,d0
+ geta SerBuf+4,a0
+ sub.l a0,d0
+ ror.w #8,d0
+ put.w d0,SerBuf+2
+ ror.w #8,d0
+ addq.l #5,d0
+ move.l d6,a1
+ subq #4,a0
+ lea 1(a0),a1
+ move.w d0,d1
+ subq.w #4,d1
+ move.b (a1)+,d2
+TxXSum add.b (a1)+,d2
+ dbra d1,TxXSum
+ neg d2
+ move.b d2,(a1)
+ moveq #0,d6
+ pea WaitAck(pc)
+
+DoSendBuf subq.w #1,d0
+ bmi.s Return3
+LoopSendB push d0
+ move.b (a0)+,d0
+ push a0
+ bsr.s DoSendByte
+ pop a0
+ pop d0
+ dbra d0,LoopSendB
+Return3 rts
+
+DoSendByte put.b d0,SerByte
+ get.l TimerTrk,a1
+ move.l trk_data(a1),a0
+ get.l Arg_MicroWait,IOTV_TIME+TV_MICRO(a0)
+ beq.s SendItNow
+ clr.l IOTV_TIME+TV_SECS(a0)
+ dtl <TR_ADDREQUEST>,a0
+ call ss,ChkDoIO
+SendItNow get.l SerialIO,a0
+ geta SerByte,a1
+ move.l a1,IO_DATA(a0)
+ moveq #1,d0
+ move.l d0,IO_LENGTH(a0)
+ move.w #CMD_WRITE,IO_COMMAND(a0)
+ dtl <CMD_WRITE>,a0
+ get.l SerialTrk,a1
+ jump ss,ChkDoIO
+;***************
+WaitAck bsr.s GetSerByte
+ cmp.b #ASCII_ACK,d0
+ beq.s Return1
+ addq #2,sp
+ move.w d0,(sp)
+ dtl <Casio memory exhausted - got $%02x (ACK=$06)%s>,a0
+ cmp.b #5,d0
+ beq.s MemoryErr
+ dtl <Casio remote abort - got $%02x (ACK=$06)%s>,a0
+ cmp.b #ASCII_EOT,d0
+ beq.s MemoryErr
+ dtl <Expected ACK - $06, got $%02x%s>,a0
+MemoryErr push a0
+ bra ErrDesc
+
+;---------------
+GetSerByte moveq #1,d0
+ subq #2,sp
+ move.l sp,a0
+ bsr.s SerReceive
+ moveq #0,d0
+ move.b (sp)+,d0
+Return1 rts
+;---------------
+SerReceiveX move.l a4,a0
+SerReceive get.l SerialIO,a1
+ move.l a0,IO_DATA(a1)
+ move.w #CMD_READ,IO_COMMAND(a1)
+ move.l d0,IO_LENGTH(a1)
+ move.l MN_REPLYPORT(a1),a0
+ move.b MP_SIGBIT(a0),d5
+ call exec,SendIO
+LoopSerInput tstv.l muimasterbase
+ beq.s SkipAbort
+ bsr DoMUIPoll
+ tstv.b InAbort
+ beq.s SkipAbort
+ pea SSExitCleanup(pc)
+ put.b #ASCII_EOT,SerByte
+ bra SendItNow
+
+SkipAbort get.l SerialIO,a1
+ call exec,CheckIO
+ tst.l d0
+ bne.s DoneReadIO
+ tstv.l muimasterbase
+ beq.s ForceMUIPoll
+ get.l MUIWaitMask,d0
+ beq.s LoopSerInput
+ForceMUIPoll bset.l d5,d0
+ bsr MUIPollEnd
+ bra.s LoopSerInput
+
+DoneReadIO get.l SerialIO,a1
+ call exec,WaitIO
+ move.l (v),a6
+ProcSerErr ext.w d0
+ beq.s Return1
+ geta SerErrMem,a0
+;Stolen from SSLib.asm
+10$ move.w d0,d1
+ sub.w (a0)+,d1
+ bcs.s 11$
+ move.w (a0)+,d2
+ beq.s 0$
+ cmp.w d2,d1
+ bcc.s 12$
+ lsl.w #2,d1
+ move.l 0(a0,d1.w),d2
+ moveq #err_iofail2,d0
+ bra.s 01$
+
+11$ move.w (a0)+,d2
+12$ lsl.w #2,d2
+ add.l d2,a0
+ bra.s 10$
+
+0$ moveq #err_iofail,d0
+ get.l Arg_Device,d2
+01$ dtl <CMD_READ>,a1
+ jump ReportError
+;---------------
+SerialInit dt TimerDev,<timer.device>
+ gett TimerDev,a0
+ moveq #IOTV_SIZE,d0
+ move.l d0,a1
+ moveq #UNIT_MICROHZ,d0
+ moveq #0,d1
+ sub.l a2,a2
+ call ss,TrackDevice
+ put.l d1,TimerTrk
+ move.w #TR_ADDREQUEST,IO_COMMAND(a1)
+
+ get.l Arg_Device,a0
+ get.l Arg_DevUnit,d0
+ moveq #IOEXTSER_SIZE,d1
+ move.l d1,a1
+ moveq #0,d1
+ geta SerErrMem,a2
+ call TrackDevice
+ put.l d1,SerialTrk
+ put.l a1,SerialIO
+ move.w #SDCMD_SETPARAMS,IO_COMMAND(a1)
+ get.l Arg_Baud,IO_BAUD(a1)
+ move.l #$08080100!SERF_XDISABLED!SERF_RAD_BOOGIE,IO_READLEN(a1)
+ ;io_ReadLen,io_WriteLen,io_StopBits,io_SerFlags
+ dtl <SDCMD_SETPARAMS>,a0
+ move.l d1,a1
+ jump ChkDoIO
+;---------------
+GenerateMUI gett __BaseText,a2
+ get.l muimasterbase,a6
+ moveq #0,d2
+ bra.s .loopnext
+
+BuildMUILoop equ *
+.loop push d2
+.loop2 move.l #MUITags,d2
+ move.w (a3)+,d2
+ beq.s .end
+ moveq #-1,d0
+ cmp.w d0,d2
+ bne.s .loopnext
+ move.l #ASL_TB,d2
+ move.w (a3)+,d2
+.loopnext moveq #0,d3
+ move.w (a3)+,d3
+ bmi.s .subobj
+ bclr #14,d3
+ bne.s .numb
+ add.l a2,d3 ; String
+ push d3
+ bra.s .loop
+
+.numb cmp.w #$2000,d3 ; Number
+ beq.s .long
+ bcs.s .plus
+ or.l #$FFFFE000,d3
+.plus push d3
+ bra.s .loop
+.long push (a3)+
+ bra.s .loop
+
+.subobj bclr #15,d3
+ bclr #14,d3
+ bne.s .var
+ add.l a2,d3
+ link a4,#0
+ push d3
+ move.w (a3)+,-(sp)
+ push d2
+ clr.l -(sp)
+ bra.s .loop2
+
+.var move.l (a5,d3.w),-(sp)
+ bra.s .loop
+
+.end move.l -4(a4),a0
+ move.l sp,a1
+ call MUI_NewObject
+ tst.l d0
+ beq MUIDosError
+
+ move.w -6(a4),d3
+ move.l d0,(a5,d3.w)
+ move.l -10(a4),d2
+ unlk a4
+ tst.w d2
+ beq.s Return6
+ push d0
+ bra BuildMUILoop
+;---------------
+DoMethodAppl get.l ApplObj,a2
+DoMethod lea 4(sp),a1
+ move.l -4(a2),a0
+DoMethodEntry move.l h_Entry(a0),a6
+ jmp (a6)
+;---------------
+GetAttrStr move.w #MUIA_String_Contents-MUITags,d0
+GetAttr move.l #MUITags,d1
+ move.w d0,d1
+ move.l d1,d0
+ clr.l -(sp)
+ move.l sp,a1
+ call intuition,GetAttr
+ pop d0
+Return6 rts
+;---------------
+;-1=Done,-2=TriggerValue,-3=ReturnID_Quit,-4=ID 1
+SetNotify move.l sp,d2
+ move.w (a3)+,d0
+ bpl.s FilledLongD0E
+ move.w d0,d1
+ addq.w #1,d1
+ beq.s Return6
+ move.l #MUIV_TriggerValue,d0
+TriggerValPtr equ *-4
+ addq.w #1,d1
+ beq.s FilledLongD0
+ push #MUIV_Application_ReturnID_Quit
+ addq.w #1,d1
+ beq.s RetQuitID
+ neg.w d1
+ ext.l d1
+ move.l d1,(sp)
+RetQuitID push #MUIM_Application_ReturnID
+ pea 2.w
+ vpush ApplObj
+ bra.s DoneRetID
+
+FilledLongD0E ext.l d0
+FilledLongD0 push d0
+ move.w (a3)+,-(sp)
+ move.w #MUITags>>16,-(sp)
+ push #MUIM_Set
+ pea 3.w
+ move.w (a3)+,d0
+ move.l (v,d0.w),d0
+ push d0
+DoneRetID move.w (a3)+,d0
+ ext.l d0
+ push d0
+ addq.l #1,d0
+ bne.s NotEveryTime
+ move.l #MUIV_EveryTime,(sp)
+EveryTimePtr equ *-4
+NotEveryTime move.w (a3)+,-(sp)
+ move.w #MUITags>>16,-(sp)
+ push #MUIM_Notify
+ move.w (a3)+,d0
+ move.l (v,d0.w),a2
+ bsr DoMethod
+ move.l d2,sp
+ bra.s SetNotify
+;---------------
+BaudRateFunc cmp.l #MUIM_Numeric_Stringify,(a1)
+ beq.s GotNumString
+ move.l cl_Super(a0),a0
+ bra DoMethodEntry
+
+GotNumString move.w cl_InstOffset(a0),d0
+ mpush a2/a5/a6
+ add.w d0,a2
+ move.l 4(a1),d0 ;offsetof(struct MUIP_Numeric_Stringify,value)
+ moveq #1200>>4,d1
+ addq.l #4,d0
+ lsl.l d0,d1
+ push d1
+ move.l 4.w,a0
+ move.l ThisTask(a0),a0
+ move.l TC_Userdata(a0),v
+ move.l sp,a1
+ gett PercLUT,a0
+ call ss,FormatStr
+ addq #4,sp
+ move.l a2,d0
+ mpop a2/a5/a6
+ rts
+;---------------
+WinOpenHook mpush a5/a6
+ move.l h_Data(a0),v
+ move.w #MUIA_Window_Window-MUITags,d0
+ get.l MainWin,a0
+ bsr GetAttr
+ get.l sv_thistask,a0
+ move.l d0,pr_WindowPtr(a0)
+ mpop a5/a6
+ rts
+;---------------
+AppDropHook mpush d2/d3/a2/a5/a6
+ move.l h_Data(a0),v
+ move.l (a1),a1
+ move.l am_NumArgs(a1),d0
+ beq.s DoneDropHook
+ subq.l #1,d0
+ beq.s OneDropHook
+BeepDropHook sub.l a0,a0
+ call intuition,DisplayBeep
+ bra.s DoneDropHook
+
+OneDropHook tstv.b Inside
+ bne.s BeepDropHook
+ move.l am_ArgList(a1),a0
+ move.l (a0)+,d1 ;wa_Lock
+ push (a0) ;wa_Name
+ geta AppDropBuf,a2
+ move.l a2,d2
+ move.l #AppBufSiz,d3
+ call dos,NameFromLock
+ pop d2
+ tst.l d0
+ beq.s BeepDropHook
+ move.l a2,d1
+ call AddPart
+ tst.l d0
+ beq.s BeepDropHook
+ put.l a2,Arg_From
+ moveq #1,d0
+ push d0
+ push #MUIM_Application_ReturnID
+ bsr DoMethodAppl
+ addq #8,sp
+ move.w #MUIA_Application_Iconified-MUITags,d0
+ moveq #0,d1
+ get.l ApplObj,a0
+ bsr SetAttr
+DoneDropHook mpop d2/d3/a2/a5/a6
+ rts
+;---------------
+Cleanup get.l muimasterbase,a6
+ get.l ApplObj,d0
+ beq.s NoApplObj
+ move.l d0,a0
+ clrv.l ApplObj
+ call MUI_DisposeObject
+NoApplObj get.l BaudRateClass,d0
+ beq Return6
+ move.l d0,a0
+ clrv.l BaudRateClass
+ jump MUI_DeleteCustomClass
+;---------------
+ dc.b 0,1,15,3,11,3,4,1,1
+SerErrTab dc.b 'DevBusy',0
+ dc.b 'BufErr',0
+ dc.b 'InvParam',0
+ dc.b 'LineErr',0
+ dc.b 'TimerErr',0
+ dc.b 'BufOverflow',0
+ dc.b 'NoDSR',0
+ dc.b 'DetectedBreak',0
+;!!! SerErrTabSize on begin - keep fresh
+;---------------
+PackMenus dc.b 0,'Project',0 ;0
+ dc.b 'T'+2,'Transmit...',0 ;1
+ dc.b 'R'+2,'Receive...',0 ;2
+ dc.b -1
+ dc.b '?'+2,'About...',0 ;3
+ dc.b 1,'About MUI...',0 ;4
+ dc.b -1
+ dc.b 'H'+2,'Hide',0 ;5
+ dc.b 'Q'+2,'Quit',0 ;6
+ dc.b 0,'Configuration',0 ;7
+ dc.b -2,'C'+2,'Settings',0 ;8
+ dc.b 1,'Restore last saved',0 ;9
+ dc.b -1
+ dc.b 'M'+2,'MUI...',0 ;10
+PackMenuNum equ 14
+;!!! PackMenuHots on begin - keep fresh
+;---------------
+PartTab dc.b 'ProtID',0 ;0
+ dc.b 0 ;1
+ dc.b 0 ;2
+ dc.b 'Phone-B',0 ;3
+ dc.b 'Phone-P',0 ;4
+ dc.b 'Schedule',0 ;5
+ dc.b 'Memo',0 ;6
+ dc.b 'Calendar',0 ;7
+ even
+;---------------
+MTag macro
+ ifge \1-MUITags
+ dc.w \1-MUITags
+ else
+ dc.w -1,\1-ASL_TB
+ endc
+ endm
+
+MOffs macro
+ dc.w \1+\2-__BaseText
+ endm
+
+MObj macro
+ ifne \1
+ MTag \1
+ endc
+ ifnd STREX_\2
+STREX_\2 set 1
+ dt STR_\2,<\2.mui>
+ endc
+ MOffs $8000,STR_\2
+ ifgt NARG-2
+ dc.w \3
+ dv.l \3
+ elseif
+ dc.w __Trash
+ endc
+ endm
+
+MText macro
+ MTag \1
+ dt STR_\@a,<\2>
+ MOffs 0,STR_\@a
+ endm
+
+MNum macro
+ MTag \1
+ ifge \2-$2000
+ dc.w $6000
+ dc.l \2
+ elseif
+ ifle \2+$2000
+ dc.w $6000
+ dc.l \2
+ elseif
+ dc.w $4000+(\2&$3FFF)
+ endc
+ endc
+ endm
+
+MVar macro
+ MTag \1
+ ifd \2
+ ifge \2-$4000
+ fail
+ endc
+ endc
+ dc.w \2+$C000
+ endm
+
+MEnd macro
+ dc.w 0
+ endm
+
+Notify macro
+ ifeq NARG-4
+ ifc 'Quit','\4'
+ dc.w -3
+ else
+ dc.w -(\4)-4
+ endc
+ else
+ ifc 'TriggerValue','\6'
+ dc.w -2
+ else
+ dc.w \6
+ endc
+ dc.w MUIA_\5-MUITags,\4
+ endc
+ ifc 'EveryTime','\3'
+ dc.w -1
+ else
+ dc.w \3
+ endc
+ dc.w MUIA_\2-MUITags,\1
+ endm
+
+ dv.l __Trash
+ dt.c __BaseText,<>
+;---------------
+MUI_Applic
+ MObj 0,Application,ApplObj
+ MText MUIA_Application_Title,<Casio-A>
+ MText MUIA_Application_Version,<$VER: Casio-A 1.0 (31.8.96)>
+ MText MUIA_Application_Copyright,<© 1996 Short Software>
+ MText MUIA_Application_Author,<Jan Kratochvil>
+ MText MUIA_Application_Description,<Comm. tool for Casio series A organizers>
+ MText MUIA_Application_Base,<Casio-A>
+ MVar MUIA_Application_Menustrip,MenuStrip
+ MObj MUIA_Application_Window,Window,MainWin
+ MText MUIA_Window_Title,<Casio-A Communicator>
+ MNum MUIA_Window_ID,'MAIN'
+ MNum MUIA_Window_AppWindow,TRUE
+ MObj MUIA_Window_RootObject,Group
+ MObj MUIA_Group_Child,Group,GaugeGroup
+ MNum MUIA_Group_Horiz,TRUE
+ MNum MUIA_Frame,MUIV_Frame_Button
+ MNum MUIA_Disabled,TRUE
+ MVar MUIA_Group_Child,AbortButton
+ MObj MUIA_Group_Child,Gauge,ProgressGauge
+ MNum MUIA_Gauge_Horiz,TRUE
+ MText MUIA_Gauge_InfoText,<%ld%%>
+ MNum MUIA_Frame,MUIV_Frame_Gauge
+ MEnd
+ MEnd
+ MObj MUIA_Group_Child,Rectangle
+ MEnd
+ MObj MUIA_Group_Child,Group
+ MNum MUIA_Group_Columns,2
+ MNum MUIA_Frame,MUIV_Frame_Text
+ MVar MUIA_Group_Child,QuitButton
+ MVar MUIA_Group_Child,SettingsButton
+ MObj MUIA_Group_Child,Popasl,ReceiveAsl
+ MVar MUIA_Popstring_Button,ReceiveButton
+ MObj MUIA_Popstring_String,String,ReceiveText
+ MNum MUIA_ExportID,6
+ MNum MUIA_ShowMe,FALSE
+ MEnd
+ MText ASLFR_TitleText,<Receive from Casio to file...>
+ MNum ASLFR_DoSaveMode,TRUE
+ MNum ASLFR_RejectIcons,TRUE
+ MEnd
+ MObj MUIA_Group_Child,Popasl,TransmitAsl
+ MVar MUIA_Popstring_Button,TransmitButton
+ MObj MUIA_Popstring_String,String,TransmitText
+ MNum MUIA_ExportID,5
+ MNum MUIA_ShowMe,FALSE
+ MEnd
+ MText ASLFR_TitleText,<Files for transmit to Casio...>
+ MNum ASLFR_RejectIcons,TRUE
+ MEnd
+ MEnd
+ MObj MUIA_Group_Child,Rectangle
+ MEnd
+ MObj MUIA_Group_Child,Group
+ MNum MUIA_Group_Columns,2
+ MNum MUIA_Frame,MUIV_Frame_Group
+ MText MUIA_FrameTitle,<Casio Modes>
+ MVar MUIA_Group_Child,StatBar5
+ MVar MUIA_Group_Child,StatBar2
+ MVar MUIA_Group_Child,StatBar4
+ MVar MUIA_Group_Child,StatBar1
+ MVar MUIA_Group_Child,StatBar3
+ MVar MUIA_Group_Child,StatBar0
+ MEnd
+ MEnd
+ MEnd
+ MVar MUIA_Application_DropObject,MainWin
+ MObj MUIA_Application_Window,Window,ConfigWin
+ MText MUIA_Window_Title,<Casio-A Settings>
+ MNum MUIA_Window_ID,'SETT'
+ MObj MUIA_Window_RootObject,Group,ConfigGroup
+ MObj MUIA_Group_Child,Group
+ MNum MUIA_Group_Horiz,TRUE
+ MVar MUIA_Group_Child,CloseButton
+ MVar MUIA_Group_Child,RestoreButton
+ MVar MUIA_Group_Child,UseButton
+ MVar MUIA_Group_Child,SaveButton
+ MEnd
+ MObj MUIA_Group_Child,Group,MicroSecSlider
+ MNum MUIA_Group_Columns,2
+ MNum MUIA_Frame,MUIV_Frame_Button
+ MObj MUIA_Group_Child,Slider
+ MNum MUIA_Numeric_Min,0
+ MNum MUIA_Numeric_Max,1000
+ MNum MUIA_Numeric_Value,Def_Micros
+ MNum MUIA_ExportID,4
+ MNum MUIA_CycleChain,TRUE
+ MEnd
+ MObj MUIA_Group_Child,Text
+ MText MUIA_Text_Contents,<',27,'rDelay [MicroSec]>
+ MNum MUIA_HorizWeight,0
+ MEnd
+ MVar MUIA_Group_Child,BaudRateSlider
+ MObj MUIA_Group_Child,Text
+ MText MUIA_Text_Contents,<',27,'rBaud rate>
+ MNum MUIA_HorizWeight,0
+ MEnd
+ MObj MUIA_Group_Child,String,UnitNumber
+ MText MUIA_String_Accept,<0123456789>
+ MNum MUIA_Frame,MUIV_Frame_String
+ MVar MUIA_String_Integer,Arg_DevUnit
+ MNum MUIA_ExportID,2
+ MNum MUIA_CycleChain,TRUE
+ MEnd
+ MObj MUIA_Group_Child,Text
+ MText MUIA_Text_Contents,<',27,'rDevice unit>
+ MNum MUIA_HorizWeight,0
+ MEnd
+ MObj MUIA_Group_Child,String,DeviceString
+ MNum MUIA_Frame,MUIV_Frame_String
+ MVar MUIA_String_Contents,Arg_Device
+ MNum MUIA_ExportID,1
+ MNum MUIA_CycleChain,TRUE
+ MEnd
+ MObj MUIA_Group_Child,Text
+ MText MUIA_Text_Contents,<',27,'rDevice>
+ MNum MUIA_HorizWeight,0
+ MEnd
+ MEnd
+ MEnd
+ MEnd
+ MEnd
+
+MUI_StatBar
+ MObj 0,Group
+ MNum MUIA_Group_Horiz,TRUE
+ MNum MUIA_Frame,MUIV_Frame_Text
+ MObj MUIA_Group_Child,Rectangle
+ MNum MUIA_FixWidth,1
+ MEnd
+ MObj MUIA_Group_Child,Text,StatBarNumber
+ MText MUIA_Text_Contents,< 0>
+ MText MUIA_Text_PreParse,<',27,'r',27,'8>
+ MEnd
+ MObj MUIA_Group_Child,Text
+ MVar MUIA_Text_Contents,StatBarText
+ MNum MUIA_Text_SetMax,TRUE
+ MEnd
+ MObj MUIA_Group_Child,Rectangle
+ MNum MUIA_Rectangle_VBar,TRUE
+ MNum MUIA_FixWidth,1
+ MEnd
+ MObj MUIA_Group_Child,Bitmap
+ MVar MUIA_Bitmap_Bitmap,StatBarBMap
+ MNum MUIA_Bitmap_Width,32
+ MNum MUIA_Bitmap_Height,16
+ MNum MUIA_Bitmap_Precision,PRECISION_ICON
+ MNum MUIA_Frame,MUIV_Frame_None
+ MNum MUIA_FixWidth,32
+ MNum MUIA_FixHeight,16
+ MEnd
+ MEnd
+
+MUI_Notific
+ Notify SettingsButton,Selected,EveryTime,ConfigWin,Window_Open,TriggerValue
+ Notify ConfigWin,Window_Open,EveryTime,SettingsButton,Selected,TriggerValue
+ Notify ConfigWin,Window_Open,EveryTime,ConfigMItem,Menuitem_Checked,TriggerValue
+ Notify ConfigWin,Window_CloseRequest,TRUE,ConfigWin,Window_Open,FALSE
+ Notify CloseButton,Pressed,FALSE,ConfigWin,Window_Open,FALSE
+ Notify MainWin,Window_CloseRequest,TRUE,Quit
+ Notify TransmitText,String_Acknowledge,EveryTime,0
+ Notify ReceiveText,String_Acknowledge,EveryTime,1
+ Notify QuitButton,Pressed,FALSE,Quit
+ Notify SaveButton,Pressed,FALSE,2
+ Notify UseButton,Pressed,FALSE,3
+ Notify RestoreButton,Pressed,FALSE,4
+ Notify AbortButton,Pressed,FALSE,5
+ Notify ApplObj,Application_MenuAction,FirstMenuCode+5,ApplObj,Application_Iconified,TRUE
+ Notify ApplObj,Application_MenuAction,FirstMenuCode+6,Quit
+ Notify ConfigMItem,Menuitem_Checked,EveryTime,ConfigWin,Window_Open,TriggerValue
+ dc.w -1
+;---------------
+CasioIcons incbin "Casio-A.gfx"
+;---------------
+ tags
+ template <TO=RECEIVE/K,FROM=TRANSMIT/K,DEVICE/K,DEVUNIT/K/N,BAUD/K/N,MICROWAIT/K/N,MUI/S>
+ dv.l Arg_To
+ dv.l Arg_From
+ dv.l Arg_Device
+ dv.l Arg_DevUnit
+ dv.l Arg_Baud
+ dv.l Arg_MicroWait
+ dv.l Arg_MUI
+ defvar <Casio-A>
+ diserr 1<<err_number
+ exitrout Cleanup
+ finish
+
+ end
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::CasioA'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::CasioA::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::CasioA::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::CasioA::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+@{[ centerimg "Casio-A","Casio-A Snapshot" ]}
+@{[ vskip "1ex" ]}
+@{[ centerimg "CasioSchema","Casio-A Interface Scheme" ]}
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::CasioA' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::CasioA::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"Casio-A",
+ "platform"=>"amiga",
+ "priority"=>450,
+ "icon"=>"Casio-A-icon",
+ "download"=>"Casio-A.lha",
+ "link-source file"=>"Casio-A.asm",
+ "summary"=>"Casio SF-A10 diary backup",
+ "license"=>"PD",
+ "maintenance"=>"obsolete-Casio SF-A10 diary and AmigaOS are no longer being used.",
+ "language"=>"680x0 asm",
+ "description"=><<"HERE",
+<p>Casio-A is a software for backup/restore of Casio SF-A10 personal digital
+diary. Its development involved reverse-engineering the Casio communication
+protocol by sniffing serial communication of the vendor's MS-DOS backup tool.</p>
+<p>Hardware issues, Casio SF-A10, electronic scheme and images by the courtesy of
+@{[ a_href 'http://www.pavouk.org/','Pavel "Pavouk" Ruzicka' ]}.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/CasioA/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl \
+ Casio-A.png
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# URL redirector of &My::Web::a_href Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::ChangeLog;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+use Apache::Constants qw(MOVED);
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "header_only"=>1,
+ "args_check"=>{
+ "cvs"=>'^[\w\d][\w\d/.]*$',
+ },
+ );
+
+$W->{"r"}->send_http_header("text/plain");
+local *F;
+open F,""
+ ."cvs -n -q -d ".$W->{"pserver"}.":".$W->{"pserver_path"}." rlog ".$W->{"args"}{"cvs"}
+ ." |perl -p -e 's#^RCS file: ".$W->{"pserver_path"}.'/(.*?)(?:/Attic/|/)?([^/]*),v$#$&\nWorking file: $1/$2#;'."'"
+ ." |cvs2cl --stdin --stdout --window 3600 --separate-header --no-wrap --usermap ".top_dir_disk()."/cvs2cl-usermap"
+ ." |";
+print while <F>;
+close F;
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::FordFulk::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::FordFulk::ListItem;
+Wuse 'My::Project';
+Wuse 'project::FordFulk::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::FordFulk::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::FordFulk::ListItem::ListItem,
);
-print <<'HERE';
+
+print <<"HERE";
<iframe src="FordFulk/" width="90%" height="500" />
<a href="FordFulk/">Program on-line</a>.
</iframe>
+
+@{[ vskip "3ex" ]}
+
+@{[ centerimg "FordFulk","Applet Screenshot" ]}
HERE
+
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::FordFulk;
+package project::FordFulk::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Ford-Fulkenson Algorithm Demonstration",
- "priority"=>5,
+
+our @ListItem=(
+ "name"=>"FordFulk",
+ "platform"=>"web",
+ "priority"=>230,
+ "icon"=>"FordFulk-icon",
"download"=>"FordFulk/FordFulk.zip",
- "summary"=>"Web applet",
+ "summary"=>"Ford-Fulkenson algorithm web applet",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"Java 1.0.2",
- "description"=>""
- .'<p>Java applet to demonstrate the internals of Ford-Fulkenson network algorithm.</p>'
+ "description"=><<"HERE",
+<p>Java applet to demonstrate the internals of Ford-Fulkenson network algorithm.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::Heat::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::Heat::ListItem;
+Wuse 'My::Project';
+Wuse 'project::Heat::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::Heat::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::Heat::ListItem::ListItem,
);
-print <<'HERE';
+
+print <<"HERE";
<iframe src="Heat/" width="90%" height="500" />
<a href="Heat/">Program on-line</a>.
</iframe>
+
+@{[ vskip "3ex" ]}
+
+@{[ centerimg "Heat","Applet Screenshot" ]}
HERE
+
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::Heat;
+package project::Heat::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Heat Distribution Simulation",
- "priority"=>5,
+
+our @ListItem=(
+ "name"=>"Heat",
+ "platform"=>"web",
+ "priority"=>220,
+ "icon"=>"Heat-icon",
"download"=>"Heat/Heat.zip",
- "summary"=>"Web applet",
+ "summary"=>"Heat distribution simulation web applet",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"Java 1.0.2",
- "description"=>""
- .'<p>Java applet to demonstrate distribution of heat in time.</p>'
+ "description"=><<"HERE",
+<p>Java applet to demonstrate distribution of heat in time.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# List of projects Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wrequire 'My::Project';
+
+
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Project List',
+ "section"=>"Projects",
+ "rel_up"=>top_dir(),
+ "rel_start"=>top_dir(),
+ "footer_ids"=>0,
+ );
+My::Web->heading();
+
+print My::Project->views("Detailed");
+print My::Project->platforms(undef());
+
+my %item=( My::Project::item_hash_read() );
+
+my @platforms=@My::Project::platforms;
+while (@platforms) {
+ my $platform_sym =shift @platforms;
+ my $platform_name=shift @platforms;
+ print '<a name="'.$platform_sym.'">';
+ print "<h2>$platform_name</h2>";
+ print '</a>'."\n";
+ my @projects=sort {
+ ($item{$b}{"priority"} <=> $item{$a}{"priority"})
+ or
+ (lc($item{$a}{"name"}) cmp lc($item{$b}{"name"}));
+ } map({ $item{$_}{"platform"} ne $platform_sym ? () : ($_); } keys(%item));
+ for my $project (@projects) {
+ my $t="";
+
+ $t.="<h3>".a_href("/project/$project/",$item{$project}{"name"}.": ".$item{$project}{"summary"})."</h3>\n";
+ $t.="<blockquote>\n";
+ $t.=$item{$project}{"description"};
+ $t.="</blockquote>\n";
+
+ if ($item{$project}{"icon"}) {
+ print rightimg $t,
+ "/project/$project/".$item{$project}{"icon"},$item{$project}{"name"}." Icon","a_href"=>"/project/$project/";
+ }
+ else {
+ print $t;
+ }
+ }
+ }
+
+
+My::Web->footer();
#! /usr/bin/perl
#
# $Id$
-# Main page of 'My::Project::icp'
+# Main page of 'My::Project::Islet'
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::Islet::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::icp::ListItem;
+Wuse 'My::Project';
+Wuse 'project::Islet::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::icp::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::Islet::ListItem::ListItem,
);
-print <<'HERE';
+
+print <<"HERE";
<iframe src="Islet/" width="90%" height="500" />
<a href="Islet/">Program on-line</a>.
</iframe>
+
+@{[ centerimg "Islet","Applet demo screen" ]}
HERE
-print '<table border="0"><tr><td align="center">'.My::Web::img("Islet.png","Applet demo screen").'</td></tr></table>'."\n";
My::Web->footer();
#! /usr/bin/perl
#
# $Id$
-# Definition of 'My::Project::icp' for list.cgi.pl
+# Definition of 'My::Project::Islet' for list.cgi.pl
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::icp;
+package project::Islet::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>'<a href="http://www.stv.cz/icp/">ICP 1998</a> Competition Software',
- "priority"=>5,
+
+our @ListItem=(
+ "name"=>"Islet",
+ "platform"=>"web",
+ "priority"=>210,
+ "icon"=>"Islet-icon",
"download"=>"Islet/Islet.zip",
- "summary"=>"Web game applet",
+ "summary"=>"Map fight web game applet",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"Java 1.1",
- "description"=>""
- .'<p>Simple game. Written for the purpose of'
- .' a <a href="http://www.stv.cz/icp/">programming competition</a>.</p>'
+ "description"=><<"HERE",
+<p>Java applet implementing a simple map fight game.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::LaserGame'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::LaserGame::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::LaserGame::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::LaserGame::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+@{[ centerimg "hw.jpeg","LaserGame Hardware" ]}
+@{[ vskip "1ex" ]}
+@{[ centerimg "LaserComm","LaserComm Utility" ]}
+HERE
+
+
+My::Web->footer();
--- /dev/null
+// 11.0592MHz=>921600 T0 clk=>112.5 ops=2.27`5s time
+// Code is big-endian!
+public BaudRate equ 2400 // Communication speed
+public StackSiz51 equ 24 // LaserGun stack size required
+ MagicRAMw equ 0x53AC // RAM-check
+ TestChar equ 't' // For Ph_Test
+
+MaxDecimal equ 99 // If dec>99
+BauDiv equ 28800/BaudRate // 3=9600, 6=4800, 12=2400 (PCON=0)
+
+/*
+Init display:
+Pn-Player ID
+Gx-Game mode: A=Anarchy, G=Green team, R=Red team
+Display:
+Lt-Loading
+Fn-Shot from friend detected
+En-Shot from enemy detected but already dead
+Sn-Shot down by enemy
+dt-Currently dead
+Left dot-reloading
+Right dot-dead
+*/
+
+/******************************/
+ seg data
+ org 0x00
+DataStart:
+ rb 4 // r0-r3
+#define DispL r4
+#define DispR r5
+#define Timer r6
+#define XMitPhase r7
+ // 0='s';1=PktType;2=SwConfigX;3=PktData;4=XSumH;5=XSumL;6='e'
+ rb 4
+
+TimPhase: rb 1 // Timer for current phase
+TimLED4: rb 1 // 4-LED period
+TimScroll: rb 1 // Scroll advance to next char
+
+ ScrollPtr: rb 1 // Scroll-text start rel. ScrBase
+ SeriCnt: rb 1 // Shots in current series
+ CAPktEnd: rb 1 // End of ConfigReq being answered (or 0)
+ WDogCnt: rb 1 // WatchDog timer count-down
+ Phase: rb 1 // Current phase # (see below)
+Ph_CfgDump equ 0 // Configuration to display dump [Phase1=sub-phase]
+Ph_Ammo equ 1 // Normal Ammo display
+Ph_Laser equ 2 // Laser on
+Ph_Delay equ 3 // Laser off, laser button disabled
+Ph_First equ 4 // Additional first-in-series delay
+ // Laser allowed boundary
+Ph_Reload equ 5 // Reload countdown period [Phase1=cdown]
+Ph_Dead equ 6 // Dead-state countdown period [Phase1=cdown]
+Ph_Test equ 7 // Test mode with transmit/receive of 'T'
+ Phase1: rb 1 // Sub-phase
+// Ph_CfgDump:
+CD_Bootup equ 0 // Right after boot-up
+CD_PNum equ 1 // Player no. (P#)
+CD_GMode equ 2 // Game mode (G#: Anarchy, Green, Red)
+CD_LEDs equ 3 // BBS_QuietL [Ld]
+CD_Sound equ 4 // BBS_QuietS [Sd]
+CD_WDogs equ 5 // WDogsCnt (dr, TU)
+CD_WDogsN equ 6 // {TU}
+CD_RSwChg equ 7 // RSwChgs (SC, TU)
+CD_RSwChgN equ 8 // {TU}
+CD_TotSh equ 9 // TotShotsW (FS, [TH], TU)
+CD_TotShM equ 10 // {[TH]}
+CD_TotShN equ 11 // {TU}
+CD_Grave0 equ 12 // GraveW #0 (d#, [TH], TU)
+CD_GraveL equ 60 // GraveW #++F(d#, [TH], TU)
+CD_Last equ 60
+// Ph_Reload: Reload cycles countdown
+// Ph_Dead: Dead cycles countdown
+
+ CurPktE: rb 1 // +1 of last L2 packet byte received
+ XMitNib: rb 1 // Transmit-remaining nibble (or 0)
+ PktNibble: rb 1 // Recevied L2 packet hex nibble
+ CurPktS: rb 1 // Addr of size of L2 packet being received
+ UserPktS: rb 1 // Addr of size of 1st L2 packet in user queue
+ TimedL: rb 1 // Left digit of TimedDisp
+ TimedR: rb 1 // Right digit of TimedDisp
+ ConvDecW1: // For use by ConvDecW
+ RxChkXSumW: rw 1 // Computed xsum of incoming L2 packet
+ XMitXSumW: rw 1 // XSum being computed during XMit
+ XMitType: rb 1 // Actual XMit L3 Pkt type - One of PktN_* below
+
+ClearTop:
+
+public TotShotsW: rw 1 // Fire statistics
+public RSwChgs: rb 1 // Run-Time switch configuration change #
+public WDogsCnt: rb 1 // # of gurus-WatchDog restarts since power-on
+
+public SwConfigXA equ $-DataStart // Address of SwConfigX
+ SwConfigX: rb 1 // Copy of SwitchP
+ SysFlagsX: rb 1 // [XMittedN|XMitByte|XMit1stNib|XMitHaveP|TimedDisp|XMitting|PktGotNib|PktRcvng]
+PktRcvng bit SysFlagsX.0 // Currently receiving packet (after 's')
+PktGotNib bit SysFlagsX.1 // Already got one hex nibble in PktNibble
+XMitting bit SysFlagsX.2 // Background packet transmit in progress
+TimedDisp bit SysFlagsX.3 // Generated 2-digit display override
+XMitHaveP bit SysFlagsX.4 // XMitNib is prepared and filled
+XMit1stNib bit SysFlagsX.5 // Transmit 1st nibble from XMitNib
+XMitByte bit SysFlagsX.6 // Transmitting byte instead of two nibbles
+XMittedN bit SysFlagsX.7 // Sth was already xmitted this round
+public UsrFlagsX: rb 1 // [RFU:2|FastFireRD|FullFireT|DisRSwChg|DispDotTR|DispDotRD|UnConfig]
+UnConfig bit UsrFlagsX.0 // Ignore all further configuration attempts
+DispDotRD bit UsrFlagsX.1 // Display LDot & RDot when [R]eload/[D]ead
+DispDotTR bit UsrFlagsX.2 // Display LDot & RDot when [T]ransmit/[R]eceive
+DisRSwChg bit UsrFlagsX.3 // Disable run-time switch reconfiguration
+FullFireT bit UsrFlagsX.4 // Transmit full 10B packets for fires (safer)
+FastFireRD bit UsrFlagsX.5 // Receive disable for FastFires (see FullFireT)
+
+/******************************/
+public Mark_Start equ 's' // L1 layer packet start
+public Mark_End equ 'e' // L1 layer packet end
+public XSum_Base equ 0xB3A7 // L2 packet xsumming base number
+public XSum_Mul equ 13 // L2 packet xsumming advance multiply
+public PktN_Fire equ 'S' // L3 packet ID for fire
+public PktN_CfgR equ 'R' // L3 packet ID for configuration request
+public PktN_CfgA equ 'A' // L3 packet ID for configuration answer
+
+DispP equ P0
+BMD_U equ 0x01
+BMD_UR equ 0x02
+BMD_UL equ 0x04
+BMD_M equ 0x08
+BMD_BR equ 0x10
+BND_DOT equ 5
+BBD_DOT equ DispP.BND_DOT
+BMD_DOT equ 1<<BND_DOT
+BMD_B equ 0x40
+BMD_BL equ 0x80
+
+MiscP equ P1
+BPM_DispR equ P1.0
+BMM_DispR equ 0x01
+BPM_DispL equ P1.1
+BMM_DispL equ 0x02
+BPM_Laser equ P1.2
+BMM_Laser equ 0x04
+BMM_LED0 equ 0x08 // RED ^ - cable up
+BMM_LED1 equ 0x10 // GREEN <
+BMM_LED2 equ 0x20 // RED >
+BNM_LED3 equ 6
+BMM_LED3 equ 1<<BNM_LED3 // GREEN v
+BMM_LEDM equ BMM_LED0|BMM_LED1|BMM_LED2|BMM_LED3
+BPM_Sound equ P1.7
+BMM_Sound equ 0x80
+
+SwitchP equ P2
+BMS_IdentM equ 0x0F // However defined, hard-coded
+BNS_IsTeam equ 4
+BBS_IsTeam equ SwConfigX.BNS_IsTeam
+BNS_TeamN equ 5 // 1=Green
+BBS_TeamN equ SwConfigX.BNS_TeamN
+BBS_QuietL equ SwConfigX.6 // 1=LEDs off
+BBS_QuietS equ SwConfigX.7 // 1=Disable
+
+IfaceP equ P3
+BPI_Fire equ P3.2
+BPI_Status equ P3.4
+
+/******************************/
+Font__ equ low~(0 )
+Font_0 equ low~(0|BMD_U|BMD_UL|BMD_UR |BMD_BL|BMD_BR|BMD_B)
+Font_1 equ low~(0 |BMD_UR |BMD_BR )
+Font_2 equ low~(0|BMD_U |BMD_UR|BMD_M|BMD_BL |BMD_B)
+Font_3 equ low~(0|BMD_U |BMD_UR|BMD_M |BMD_BR|BMD_B)
+Font_4 equ low~(0 |BMD_UL|BMD_UR|BMD_M |BMD_BR )
+Font_5 equ low~(0|BMD_U|BMD_UL |BMD_M |BMD_BR|BMD_B)
+Font_6 equ low~(0|BMD_U|BMD_UL |BMD_M|BMD_BL|BMD_BR|BMD_B)
+Font_7 equ low~(0|BMD_U |BMD_UR |BMD_BR )
+Font_8 equ low~(0|BMD_U|BMD_UL|BMD_UR|BMD_M|BMD_BL|BMD_BR|BMD_B)
+Font_9 equ low~(0|BMD_U|BMD_UL|BMD_UR|BMD_M |BMD_BR|BMD_B)
+Font_A equ low~(0|BMD_U|BMD_UL|BMD_UR|BMD_M|BMD_BL|BMD_BR )
+Font_B equ low~(0 |BMD_UL |BMD_M|BMD_BL|BMD_BR|BMD_B)
+Font_C equ low~(0|BMD_U|BMD_UL |BMD_BL |BMD_B)
+Font_c_ equ low~(0 |BMD_M|BMD_BL |BMD_B)
+Font_D equ low~(0 |BMD_UR|BMD_M|BMD_BL|BMD_BR|BMD_B)
+Font_E equ low~(0|BMD_U|BMD_UL |BMD_M|BMD_BL |BMD_B)
+Font_F equ low~(0|BMD_U|BMD_UL |BMD_M|BMD_BL )
+Font_G equ low~(0|BMD_U|BMD_UL |BMD_BL|BMD_BR|BMD_B)
+Font_H equ low~(0 |BMD_UL|BMD_UR|BMD_M|BMD_BL|BMD_BR )
+Font_I equ low~(0 |BMD_UL |BMD_BL )
+Font_L equ low~(0 |BMD_UL |BMD_BL |BMD_B)
+Font_N equ low~(0 |BMD_M|BMD_BL|BMD_BR )
+Font_O equ low~(0|BMD_U|BMD_UL|BMD_UR |BMD_BL|BMD_BR|BMD_B)
+Font_P equ low~(0|BMD_U|BMD_UL|BMD_UR|BMD_M|BMD_BL )
+Font_R equ low~(0 |BMD_M|BMD_BL )
+Font_S equ low~(0|BMD_U|BMD_UL |BMD_M |BMD_BR|BMD_B)
+Font_T equ low~(0 |BMD_UL |BMD_M|BMD_BL |BMD_B)
+Font_U equ low~(0 |BMD_UL|BMD_UR |BMD_BL|BMD_BR|BMD_B)
+Font_Y equ low~(0 |BMD_UL|BMD_UR|BMD_M |BMD_BR|BMD_B)
+Font_MIN equ low~(0 |BMD_M )
+Font_ equ low~(0|BMD_U|BMD_UL|BMD_UR|BMD_M|BMD_BL|BMD_BR|BMD_B)
+
+/******************************/
+public GraveWA equ $-DataStart // GraveW address
+public GraveW: rw 16 // Kills by players #0..#F
+// Config:
+LoadPart:
+public ReloadN: rb 1 // Reload countdown
+public DeadN: rb 1 // Dead state countdown
+public SeriC_Max: rb 1 // Maximum # of shots per one series
+public Ammo_Max: rb 1 // Ammo # in one clip
+public Ammo: rb 1 // Remaining ammo in the current clip
+public DeadDivN: rb 1 // 4LED-Dead -> Dead cycle divisor
+public T_Start: rb 1 // Startup info cycle delay
+public T_Reload: rb 1 // Reload cycle delay
+public T_Laser: rb 1 // Laser firing
+public T_Delay: rb 1 // Inter-Laser delay
+public T_First: rb 1 // Additional series start delay period
+public T_LED4: rb 1 // 1 of RY-LED switch period
+public T_Scroll: rb 1 // Scroll of one letter
+public T_ScrollF: rb 1 // Scroll of 1st two letters
+public T_Dead: rb 1 // 4LED-Dead (and Dead) cycle delay
+public T_TimedD: rb 1 // TimedDisp delay (temporary, non-scrolling)
+public AddrSpace equ $-DataStart // +1 of remote configurable address space
+LoadPartS equ $-LoadPart
+ MagicRAM: rw 1 // Contains MagicRAMw for RAM-check
+public RxBufSiz equ 0x80+DataStart-$-StackSiz51 // Receive buffer size
+RxBuf: rb RxBufSiz // Receive buffer
+StackBtm: // Start of stack
+
+/******************************/
+ seg code
+
+ org 0x0 // Reset, SUsage=6
+Reset:
+ jb BPI_Fire,BadRAM
+ mov a,#high MagicRAMw
+ xrl a,MagicRAM
+ jnz BadRAM
+ sjmp ResCont
+
+ org 0xB // T0, SUsage=4
+T0Int: push psw
+ push acc
+ inc Timer
+ dec WDogCnt
+ mov a,WDogCnt
+ jnz NWDogFail
+ inc WDogsCnt // Failing!
+WarmBoot: mov r0,#ClearTop-1 // Mustn't reset RAM
+ sjmp ContBoot
+
+NWDogFail: pop acc
+ pop psw
+ reti
+
+ org 0x23 // Ser, SUsage=14
+SerInt: ajmp SerICont
+
+SwRConfig: inc RSwChgs
+ sjmp WarmBoot
+
+ResCont: mov a,#low MagicRAMw
+ xrl a,MagicRAM+1
+ jz SwRConfig
+BadRAM: mov MagicRAM,#high MagicRAMw
+ mov MagicRAM+1,#low MagicRAMw
+ mov r0,#LoadPart
+ mov dptr,#LoadContn
+ mov r2,#LoadPartS
+FillMem: clr a
+ movc a,@a+dptr
+ mov @r0,a
+ inc r0
+ inc dptr
+ djnz r2,FillMem
+ColdBoot: mov r0,#LoadPart-1
+
+ContBoot: clr a
+ mov IE,a
+ mov TCON,a
+ mov sp,#StackBtm-1
+
+ClearMem: mov @r0,a
+ djnz r0,ClearMem
+
+ mov SwConfigX,SwitchP
+ mov SysFlagsX,a
+
+ mov Timer,#1
+ mov CurPktS,#RxBuf
+ mov UserPktS,#RxBuf
+
+ mov DispP,a
+ jb BPI_Fire,0f
+ mov MiscP,#~(BMM_DispL|BMM_DispR)
+ jnb BPI_Fire,$
+ mov a,SwitchP
+ xch a,SwConfigX
+ xrl a,SwConfigX
+ jz 0f
+ mov Phase,#Ph_Test
+ setb DispDotTR
+0: mov MiscP,#~BMM_DispR
+
+ mov UsrFlagsX,#0x03 //DEBUG!!!
+
+ clr a
+ mov IP,#0x10 // Pri: Ser=1
+ mov TCON,a
+ mov TL1,#-BauDiv
+ mov TH1,#-BauDiv
+ mov TL0,a
+ mov TH0,a
+ mov TMOD,#0x20 // T1=m2, T0=m0
+ mov PCON,a // SerSpd=normal
+ mov SCON,#0x50 // 8N1, T1, clr
+ mov TCON,#0x50 // T1+T0=run, clr
+
+ mov IE,#0x92 // Int: Ser+T0
+
+ mov r0,#TimPhase
+ acall StartTim
+ acall InitLED4
+MainLoop: mov WDogCnt,#0 // Reset WatchDog
+// Check run-time change of configuration
+ jb DisRSwChg,1f
+ mov a,SwConfigX
+ xrl a,SwitchP
+ jz 1f
+ ajmp SwRConfig
+1:
+// Display refresh
+ mov DispP,#0xFF
+ xrl MiscP,#BMM_DispL|BMM_DispR
+ mov a,Phase
+ jnb BPM_DispR,0f
+ jnb DispDotTR,6f
+ jb Xmitting,7f
+6: jnb DispDotRD,1f
+ xrl a,#Ph_Reload
+ jnz 1f
+7: clr BBD_DOT
+1: mov a,ScrollPtr
+ jnz 4f
+ mov a,DispL
+ jnb TimedDisp,2f
+ mov a,TimedL
+ sjmp 2f
+
+0: jnb DispDotTR,8f
+ jb PktRcvng,9f
+8: jnb DispDotRD,3f
+ xrl a,#Ph_Dead
+ jnz 3f
+9: clr BBD_DOT
+3: mov a,ScrollPtr
+ jz 5f
+ inc a
+4: mov dptr,#ScrBase
+ movc a,@a+dptr
+ sjmp 2f
+
+5: mov a,DispR
+ jnb TimedDisp,2f
+ mov a,TimedR
+2: anl DispP,a
+// 4-LED cycle
+ jb BBS_QuietL,NoLED4Fr
+ mov a,Phase
+ xrl a,#Ph_Dead
+ jz NoLED4Fr
+ mov r0,#TimLED4
+ acall QueryTim
+ jnc NoLED4Fr
+ jnb BBS_IsTeam,1f
+ mov a,#BMM_LED0|BMM_LED2
+ jnb BBS_TeamN,5f
+ mov a,#BMM_LED1|BMM_LED3
+5: xrl MiscP,a
+ sjmp 2f
+
+1: mov a,#~BMM_LEDM
+ orl a,MiscP
+ rl a
+ jb acc.(BNM_LED3+1),4f
+ mov a,#~BMM_LED0
+4: orl MiscP,#BMM_LEDM
+ anl MiscP,a
+2: mov r0,#TimLED4
+ mov a,T_LED4
+ acall StartTim
+NoLED4Fr:
+// Fire series maintenance
+ jnb BPI_Fire,0f
+ mov SeriCnt,#0
+0:
+/*** Here end mandatory MainLoop routines ***/
+ mov r0,#TimPhase
+ acall QueryTim
+ jnc NoPhases
+ mov dptr,#PhaseTab
+ mov r1,#Phase1
+ mov a,Phase
+ acall JmpByTab
+NoPhases:
+// Fire check
+ mov a,Phase
+ jz 1f
+ dec a
+ jnz 2f
+1: jb BPI_Status,0f
+ clr a
+ mov Phase,a
+ mov Phase1,a
+ mov r0,#TimPhase
+ acall StartTim
+ sjmp CantFire
+
+2: cjne a,#Ph_First-Ph_Ammo,CantFire
+ mov a,SeriCnt
+ dec a
+ jz CantFire
+0: jb BPI_Fire,CantFire
+ mov a,SeriCnt
+ subb a,SeriC_Max
+ jnc CantFire
+ mov a,Ammo
+ jz CantFire
+ jb XMitting,CantFire
+// Fire one shot NOW!
+ inc SeriCnt
+ mov Phase,#Ph_Laser
+ dec Ammo
+ clr BPM_Laser
+ mov c,BBS_QuietS
+ mov BPM_Sound,c
+ inc TotShotsW+1
+ mov a,TotShotsW+1
+ jnz 1f
+ inc TotShotsW
+1: mov a,#PktN_Fire
+ acall StartXMiX
+ mov ScrollPtr,#0
+ acall DispAmmo
+ mov a,T_Laser
+ mov r0,#TimPhase
+ acall StartTim
+CantFire:
+// Scroll Update
+ mov r0,#TimScroll
+ acall QueryTim
+ jnc 6f
+ clr TimedDisp
+ mov a,ScrollPtr
+ jz 6f
+ mov dptr,#ScrBase+2
+ movc a,@a+dptr
+ jnz 0f
+ mov ScrollPtr,a
+ sjmp 6f
+
+0: inc ScrollPtr
+ mov a,ScrollPtr
+ movc a,@a+dptr
+ jnz 1f
+ mov a,T_ScrollF
+ sjmp 2f
+
+1: mov a,T_Scroll
+2: acall StartTim
+6:
+// Packet received?
+ mov a,UserPktS
+ mov r0,a
+ xrl a,CurPktS
+ jnz 0f
+GotNoSerS: ajmp GotNoSer
+
+ShortPkt: mov a,r0
+ acall RxBufInc
+ push 0 //r0
+ mov r0,a
+ sjmp ProcSPkt
+
+0: mov a,@r0
+; jb acc.7,ShortPkt
+ jb XMitting,GotNoSerS
+ inc a
+ add a,r0
+ subb a,#RxBuf+RxBufSiz
+ jnc 1f
+ add a,#RxBufSiz
+1: add a,#RxBuf
+ push acc
+ mov a,@r0
+ clr c
+ subb a,#3
+ jc FailRPktN
+ mov @r0,a
+ push 0 //r0
+ inc a
+ mov r2,a
+ acall RxBufInc
+ mov r1,#RxChkXSumW+1
+ mov @r1,#low XSum_Base
+ dec r1
+ mov @r1,#high XSum_Base
+0: mov a,@r0
+ acall AddXSum
+ acall RxBufInc
+ djnz r2,0b
+ pop 2 //r2
+ mov a,@r0
+ xrl a,@r1
+FailRPktN: jnz FailRPktS
+ acall RxBufInc
+ mov a,@r0
+ inc r1
+ xrl a,@r1
+ jnz FailRPktS
+// XSum is correct
+ mov a,r2
+ mov r0,a
+ mov a,@r0
+ mov r2,a
+ acall RxBufInc
+ mov a,@r0
+ mov r3,a
+ acall RxBufInc
+ cjne r3,#PktN_Fire,NoPFire
+ cjne r2,#1,FailRPktS
+// Fire packet received, @R0=remote SwConfigX
+ProcSPkt: mov a,@r0
+ jnb BBS_IsTeam,ShotDown // We're anarchy
+ jnb acc.BNS_IsTeam,ShotDown // From anarchy one
+ xrl a,SwConfigX
+ jnb acc.BNS_TeamN,FriendS // One of our team
+ mov a,@r0
+ShotDown: xrl a,SwConfigX
+ anl a,#BMS_IdentM
+ jz FriendS
+// Really shot by enemy
+ mov TimedL,#Font_E
+ mov a,Phase
+ xrl a,#Ph_Dead
+ jz PrintIDR
+ mov a,@r0
+ anl a,#0x0F
+ rl a
+ add a,#GraveW+1
+ mov r1,a
+ inc @r1
+ mov a,@r1
+ jnz 0f
+ dec r1
+ inc @r1
+0: mov TimedL,#Font_S
+ mov Phase,#Ph_Dead
+ mov Phase1,DeadN
+ anl MiscP,#~BMM_LEDM
+ push 0 //r0
+ acall NxtDead
+ pop 0 //r0
+ sjmp PrintIDR
+
+FriendS: mov TimedL,#Font_F
+PrintIDR: mov a,@r0
+ anl a,#0x0F
+ mov dptr,#FontHex
+ movc a,@a+dptr
+ mov TimedR,a
+ setb TimedDisp
+ mov ScrollPtr,#0
+ mov a,T_TimedD
+ mov r0,#TimScroll
+ acall StartTim
+FailRPktS: sjmp FailRPkt
+
+NoPFire: cjne r3,#PktN_CfgR,NoPCfgR
+ jnb XMitting,0f
+ dec sp
+ sjmp GotNoSer
+
+0: mov a,@r0
+ xrl a,SwConfigX
+ anl a,#BMS_IdentM
+ jnz FailRPkt
+ acall RxBufInc2
+CfgNBlock: mov a,r2
+ jz FailRPkt
+ mov a,@r0
+ acall RxBufInc2
+ jz CRRepRes
+ mov r3,a
+ mov a,r2
+ jz FailRPkt
+ mov a,@r0
+ acall RxBufInc2
+ mov r1,a
+CfgBlock: mov a,r2
+ jz FailRPkt
+ mov a,@r0
+ acall RxBufInc2
+ push acc
+ mov a,r1
+ clr c
+ subb a,#AddrSpace
+ pop acc
+ jnc SkipWrite
+ jb UnConfig,SkipWrite
+ mov @r1,a
+SkipWrite: inc r1
+ djnz r3,CfgBlock
+ sjmp CfgNBlock
+
+CRRepRes: pop acc
+ clr c
+ subb a,#RxBuf+2
+ jnc 0f
+ add a,#RxBufSiz
+0: add a,#RxBuf
+ mov CAPktEnd,a
+ mov a,r0
+ mov UserPktS,a
+ mov a,#CfgRS-ScrBase
+ acall DoScroll
+ mov a,#PktN_CfgA
+ acall StartXMiX
+ sjmp GotNoSer
+
+NoPCfgR: cjne r3,#PktN_CfgA,FailRPkt
+ mov a,#CfgAS-ScrBase
+ScrRPkt: acall DoScroll
+FailRPkt: pop UserPktS
+
+GotNoSer:
+
+ ajmp MainLoop
+
+/******************************/
+PhaseTab:
+ db PhCfgDump-PhaseTab
+ db PhAmmo -PhaseTab
+ db PhLaser -PhaseTab
+ db PhDelay -PhaseTab
+ db PhFirst -PhaseTab
+ db PhReload -PhaseTab
+ db PhDead -PhaseTab
+ db PhTest -PhaseTab
+
+PhCfgDump: mov a,T_TimedD
+ acall StartTim
+SkpCDump: inc @r1
+ mov dptr,#CfgDTab
+ mov a,@r1
+ clr c
+ subb a,#CD_Grave0
+ jnc CDGrave
+ mov a,@r1
+JmpByTab: movc a,@a+dptr
+ jmp @a+dptr
+
+PhLaser: orl MiscP,#BMM_Laser|BMM_Sound
+ inc Phase
+ mov a,T_Delay
+ sjmp StartTimS
+
+PhDelay: inc Phase
+ mov a,Ammo
+ jz PD_Reload // Do Reload
+ mov a,T_First
+ sjmp StartTimS
+
+PhTest: jb XMitting,PT_WaitTI
+ mov a,#TestChar
+ acall StartXMiX
+PT_WaitTI:
+ mov a,SwConfigX
+ swap a
+ rr a
+ anl a,#0x78
+ sjmp StartTimS
+
+PD_Reload: inc Phase
+ mov Phase1,ReloadN
+ mov Ammo,Ammo_Max
+ mov a,#ReloadS-ScrBase
+ acall DoScroll
+PhReload: dec Phase1
+ mov a,Phase1
+ jz NormAmmo
+ mov DispL,#Font_L
+ mov a,Phase1
+ acall PutHexFnR
+ mov a,T_Reload
+ sjmp StartTimP
+
+PhDead: xrl MiscP,#BMM_LEDM
+ dec Phase1
+ mov a,Phase1
+ jz RAmmonLED
+NxtDead: mov B,DeadDivN
+ div aB
+ xch a,B
+ jnz 0f
+ mov DispL,#Font_D
+ mov a,B
+ acall PutHexFnR
+0: mov a,T_Dead
+StartTimP: mov r0,#TimPhase
+StartTimS: ajmp StartTim
+
+RAmmonLED: acall InitLED4
+PhFirst:
+NormAmmo: mov Phase,#Ph_Ammo
+PhAmmo: // PhAmmo shouldn't happen <= no timer
+ ajmp DispAmmo
+
+CDGrave: cjne a,#CD_Last-CD_Grave0,1f
+ sjmp NormAmmo
+
+1: mov B,#3
+ div aB
+ mov r2,a
+ rl a
+ add a,#GraveW
+ mov r0,a
+ mov a,@r0
+ inc r0
+ orl a,@r0
+ jz SkpCDump2
+ mov a,B
+ cjne a,#0,0f
+ mov DispL,#Font_D
+ mov a,r2
+PutHexFnR: mov dptr,#FontHex
+ ajmp PutFontR
+
+0: dec r0
+ mov r3,a
+ acall ConvDecW
+ cjne r3,#1,DispHexS
+ mov a,@r0
+ sjmp DispHexS
+
+CfgDTab equ $-1
+ db CDPNum -CfgDTab
+ db CDGMode -CfgDTab
+ db CDLEDs -CfgDTab
+ db CDSound -CfgDTab
+ db CDWDogs -CfgDTab
+ db CDWDogsN -CfgDTab
+ db CDRSwChg -CfgDTab
+ db CDRSwChgN-CfgDTab
+ db CDTotSh -CfgDTab
+ db CDTotShM -CfgDTab
+ db CDTotShN -CfgDTab
+
+CDPNum: mov DispL,#Font_P
+ mov a,SwConfigX
+ anl a,#0x0F
+ sjmp PutHexFnR
+
+CDGMode: mov DispL,#Font_G
+ mov a,#Font_A
+ jnb BBS_IsTeam,DoGaMode
+ mov a,#Font_R
+ jnb BBS_TeamN,DoGaMode
+ mov a,#Font_G
+DoGaMode: mov DispR,a
+ ret
+
+CDLEDs: jnb BBS_QuietL,SkpCDumpS
+ mov DispL,#Font_L
+ mov DispR,#Font_D
+ ret
+
+CDSound: jnb BBS_QuietS,SkpCDumpS
+ mov DispL,#Font_S
+ mov DispR,#Font_D
+ ret
+
+CDWDogs: mov a,WDogsCnt
+ jz SkpCDump1
+ mov DispL,#Font_D
+ mov DispR,#Font_R
+ ret
+
+SkpCDump2: inc @r1
+SkpCDump1: inc @r1
+SkpCDumpS: ajmp SkpCDump
+
+CDWDogsN: mov a,WDogsCnt
+ sjmp DispDecS
+
+CDRSwChg: mov a,RSwChgs
+ jz SkpCDump1
+ mov DispL,#Font_S
+ mov DispR,#Font_C
+ ret
+
+CDRSwChgN: mov a,RSwChgs
+DispDecS: ajmp DispDec
+
+CDTotSh: mov a,TotShotsW
+ orl a,TotShotsW+1
+ jz SkpCDump2
+ mov DispL,#Font_F
+ mov DispR,#Font_S
+ ret
+
+CDTotShM: mov r0,#TotShotsW
+ acall ConvDecW
+ mov a,@r0
+ sjmp DispHexS
+
+CDTotShN: mov r0,#TotShotsW
+ acall ConvDecW
+DispHexS: ajmp DispHex
+/******************************/
+SerICont: push psw
+ push acc
+ push 0 //r0
+ push 2 //r2
+RetryRI: jbc RI,GotRI
+RetryTI: jbc TI,GotTI
+ pop 2 //r2
+ pop 0 //r0
+ pop acc
+ pop psw
+ reti
+/******************************/
+GotRI: mov a,SBUF
+ jnb acc.7,5f
+ jb FastFireRD,ScratchRI
+ jb acc.6,ScratchRI
+ mov r0,CurPktS
+ mov @r0,a
+ acall RxBufInc
+ mov a,r0
+ xrl a,UserPktS
+ jz ScratchRI
+ mov a,r0
+ mov CurPktS,a
+ sjmp ScratchRI
+
+5: cjne a,#Mark_Start,0f
+ mov r0,CurPktS
+ acall RxBufInc
+ mov a,r0
+ xrl a,UserPktS
+ jz ScratchRI
+ mov CurPktE,r0
+ setb PktRcvng
+ clr PktGotNib
+ sjmp RetryRI
+
+0: cjne a,#Mark_End,1f
+ jnb PktRcvng,RetryRI
+ jb PktGotNib,ScratchRI
+ clr PktRcvng
+ mov a,CurPktE
+ mov r0,CurPktS
+ clr c
+ subb a,r0
+ jnc 3f
+ add a,#RxBufSiz
+3: dec a
+ jz RetryRI
+ mov @r0,a
+ mov a,CurPktE
+ mov CurPktS,a
+// Successfuly received packet
+ sjmp RetryRI
+
+1: jnb PktRcvng,RetryRI
+ clr c
+ subb a,#'0'
+ jc ScratchRI
+ subb a,#10
+ jc GotRITen
+ subb a,#'A'-('9'+1)
+ jc ScratchRI
+ subb a,#6
+ jc GotRISix
+ScratchRI: clr PktRcvng
+RetryRIS: sjmp RetryRI
+/******************************/
+GotTI: jnb XMitting,RetryTI
+ clr XMittedN
+ jnb XMitHaveP,PrepXMit
+ mov a,XMitNib
+SendPrepd: jb XMittedN,RetryTIS
+ jbc XMitByte,XMitByteC
+ jnb XMit1stNib,Have2ndN
+ swap a
+Have2ndN: anl a,#0x0F
+ add a,#'0'
+ mov r2,a
+ clr c
+ subb a,#'9'+1
+ mov a,r2
+ jc XMitByteC
+ add a,#'A'-('9'+1)
+XMitByteC: mov SBUF,a
+ setb XMittedN
+ mov c,XMit1stNib
+ clr XMit1stNib
+ mov XMitHaveP,c
+ jnc PrepXMit
+RetryTIS: ajmp RetryTI
+/******************************/
+GotRISix: add a,#6
+GotRITen: add a,#10
+ jb PktGotNib,2f
+ swap a
+ mov PktNibble,a
+ sjmp DoneFNRI
+
+2: orl a,PktNibble
+ mov r2,a
+ mov r0,CurPktE
+ acall RxBufInc
+ mov a,UserPktS
+ xrl a,r0
+ jz ScratchRI
+ mov a,r0
+ xch a,CurPktE
+ mov r0,a
+ mov a,r2
+ mov @r0,a
+DoneFNRI: cpl PktGotNib
+ sjmp RetryRIS
+/******************************/
+PrepXMit: mov a,XMitPhase
+ mov dptr,#PhXMitTab
+ movc a,@a+dptr
+ jmp @a+dptr
+
+PhXMitTab: db XPStart -PhXMitTab
+ db XPType -PhXMitTab
+ db XPSwCfg -PhXMitTab
+ db XPData -PhXMitTab
+ db XPXSumH -PhXMitTab
+ db XPXSumL -PhXMitTab
+ db XPEnd -PhXMitTab
+ db XPFinish-PhXMitTab
+
+InvalCR: mov CAPktEnd,a
+XPFinish: clr XMitting
+ sjmp RetryTIS
+
+XPStart: mov a,XMitType
+ xrl a,#TestChar
+ jnz 1f
+ mov a,#TestChar
+ sjmp 2f
+
+1: xrl a,#TestChar^PktN_Fire
+ jnz 0f
+ jb FullFireT,0f
+ mov a,SwConfigX
+ clr acc.6
+ setb acc.7
+2: mov XMitPhase,#6 //XPFinish-1
+ sjmp ContXMitB
+
+0: mov a,#Mark_Start
+ContXMitB: setb XMitByte
+ inc XMitPhase
+ clr XMit1stNib
+ContXMit: setb XMitHaveP
+ mov XMitNib,a
+ ajmp SendPrepd
+
+XPType: mov XMitXSumW ,#high XSum_Base
+ mov XMitXSumW+1,#low XSum_Base
+ mov a,XMitType
+XMitXHexP: inc XMitPhase
+XMitXHex: push 1 //r1
+ push 3 //r3
+ push B
+ mov r1,#XMitXSumW
+ push acc
+ acall AddXSum
+ pop acc
+ pop B
+ pop 3 //r3
+ pop 1 //r1
+XMitHex: clr XMitByte
+ setb XMit1stNib
+ sjmp ContXMit
+
+XPSwCfg: mov a,SwConfigX
+ sjmp XMitXHexP
+
+XPData: mov a,XMitType
+ xrl a,#PktN_CfgA
+ jnz XPDatDone
+ mov r0,UserPktS
+NxtBlock: mov a,r0
+ xrl a,CAPktEnd
+ jz DoneAns
+ mov a,@r0
+ dec @r0
+ mov r2,a
+ acall RxBufInc
+ mov a,r0
+ xrl a,CAPktEnd
+ jz InvalCR // Invalid CfgReq
+ mov a,r2
+ jz DoneBlock
+ mov a,@r0
+ inc @r0
+ mov r0,a
+ mov a,@r0
+ sjmp XMitXHex
+
+DoneBlock: acall RxBufInc
+ mov UserPktS,r0
+ mov a,r0
+ xrl a,CAPktEnd
+ jnz NxtBlock
+DoneAns: mov CAPktEnd,a // Cancel CfgA pending alert
+ acall RxBufInc
+ acall RxBufInc
+ mov UserPktS,r0
+XPDatDone: inc XMitPhase
+XPXSumH: mov a,XMitXSumW
+XMitHexP: inc XMitPhase
+ sjmp XMitHex
+
+XPXSumL: mov a,XMitXSumW+1
+ sjmp XMitHexP
+
+XPEnd: mov a,#Mark_End
+ sjmp ContXMitB
+
+/******************************/
+StartXMiX: mov XMitType,a
+ clr a
+ mov XMitPhase,a
+ clr XMitHaveP
+ setb XMitting
+ setb TI // Start XMit now!
+ ret
+/******************************/
+// I: A=text offset, O: Filled DispL+DispR, D: A,R0,R2
+DoScroll: mov ScrollPtr,a
+ mov r0,#TimScroll
+ mov a,T_ScrollF
+ sjmp StartTim
+/******************************/
+// O: Filled DispL+DispR, D: A,B,R2
+DispAmmo: mov a,Ammo
+// I: A=decimal, O: Filled DispL+DispR, D: A,B,R2
+DispDec: mov R2,a
+ clr c
+ subb a,#100
+ jnc 0f
+ mov a,MaxDecimal
+0: mov a,R2
+ mov B,#10
+ div aB
+ swap a
+ orl a,B
+// I: A=hexadecimal, O: Filled DispL+DispR, D: A,R2
+DispHex: mov dptr,#FontHex
+ mov R2,a
+ swap a
+ anl a,#0x0F
+ movc a,@a+dptr
+ mov DispL,a
+ mov a,R2
+ anl a,#0x0F
+PutFontR: movc a,@a+dptr
+ mov DispR,a
+Ret1: ret
+/******************************/
+InitLED4: orl MiscP,#BMM_LEDM
+ jb BBS_QuietL,Ret1
+ anl MiscP,#~BMM_LED0
+ jnb BBS_IsTeam,0f
+ jnb BBS_TeamN,0f
+ xrl MiscP,#BMM_LED0|BMM_LED1
+0: mov r0,#TimLED4
+ mov a,T_LED4
+/******************************/
+// I: R0=addr of byte, A=min time, O: @R0!=0, D:A
+StartTim: add a,Timer
+ jnz 0f
+ inc a
+0: mov @R0,a
+ ret
+/******************************/
+// I: R0=addr of byte, C=1->success, D:A
+QueryTim: mov a,@R0
+ clr c
+ jz 0f
+ subb a,Timer
+ mov c,acc.7
+ jnc 0f
+ clr a
+ mov @R0,a
+0: ret
+/******************************/
+RxBufInc2: dec r2
+// I: R0=RxAddr, O: R0=RxAddr+1
+RxBufInc: inc r0
+ cjne r0,#RxBuf+RxBufSiz,0f
+ mov r0,#RxBuf
+0: ret
+/******************************/
+// I: @R1/W=xsum, A=Byte, O: @R1/W=xsum+Byte, D:A,B,R3
+AddXSum: push 2 //r2
+ push acc
+ inc r1
+ inc @r1
+ mov a,@r1
+ dec r1
+ jnz 0f
+ inc @r1
+0: mov B,#XSum_Mul
+ mul aB
+ mov r2,a
+ mov r3,B
+ mov a,@r1
+ mov B,#XSum_Mul
+ mul aB
+ add a,r3
+ mov r3,a
+ pop acc
+ add a,r2
+ inc r1
+ mov @r1,a
+ dec r1
+ mov a,r3
+ addc a,#0
+ mov @r1,a
+ pop 2 //r2
+ ret
+// I: R0=SrcWord, O: R0=ConvDecW1, A=LOW [R0/W], D:R1,R2
+ConvDecW:
+ inc sp
+ mov r1,sp
+ inc sp
+ mov a,@r0
+ mov @r1,a
+ inc r0
+ inc r1
+ mov a,@r0
+ mov @r1,a
+ mov dptr,#CDW_Tab
+ mov r2,#4
+ mov r0,#ConvDecW1
+3: xchd a,@r0
+ swap a
+ mov @r0,a
+ inc r0
+ clr a
+ xchd a,@r0
+ swap a
+ mov @r0,a
+2: mov a,#1
+ movc a,@a+dptr
+ mov B,a
+ mov a,@r1
+ clr c
+ subb a,B
+ push acc
+ dec r1
+ clr a
+ movc a,@a+dptr
+ mov B,a
+ mov a,@r1
+ subb a,B
+ jc 1f
+ mov @r1,a
+ pop acc
+ inc r1
+ mov @r1,a
+ inc @r0
+ sjmp 2b
+
+1: dec sp
+ inc dptr
+ inc dptr
+ inc r1
+ mov a,@r0
+ dec r0
+ djnz r2,3b
+ dec sp
+ dec sp
+ ret
+/******************************/
+
+ScrBase: // Every text offset must >0 !!!
+FontHex: db Font_0,Font_1,Font_2,Font_3,Font_4,Font_5,Font_6,Font_7
+ db Font_8,Font_9,Font_A,Font_B,Font_C,Font_D,Font_E,Font_F
+ReloadS: db Font_R,Font_E,Font_L,Font_O,Font_A,Font_D,0
+CfgAS: db Font_C,Font_O,Font_N,Font_F,Font_I,Font_G
+ db Font_A,Font_N,Font_S,0
+CfgRS: db Font_C,Font_O,Font_N,Font_F,Font_I,Font_G
+ db Font_U,Font_R,Font_E,Font_D,0
+ if ($-ScrBase>=0x100) ScrBase equ 0
+/******************************/
+CDW_Tab: dw 1000,100,10,1
+
+LoadContn:
+ db 12 // Reload countdown
+ db 40 // Dead state countdown
+ db 15 // Maximum # of shots per one series
+ db 40 // Ammo # in one clip
+ db 40 // Remaining ammo in the current clip
+ db 4 // 4LED-Dead -> Dead cycle divisor
+ db 100 // Startup info cycle delay
+ db 48 // Reload cycle delay
+ db 8 // Laser firing
+ db 2 // Inter-Laser delay
+ db 24 // Additional series start delay period
+ db 32 // 1 of RY-LED switch period
+ db 25 // Scroll of one letter
+ db 50 // Scroll of 1st two letters
+ db 24 // 4LED-Dead (and Dead) cycle delay
+ db 110 // TimedDisp delay (temporary, non-scrolling)
+ if ($-LoadContn!=LoadPartS) LoadPartS equ 0
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::LaserGame' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::LaserGame::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"LaserGame",
+ "platform"=>"amiga",
+ "priority"=>550,
+ "icon"=>"hw-icon.jpeg",
+ "download"=>"LaserGame.lha",
+ "link-Intel 8051 source file"=>"LaserGun.a51",
+ "summary"=>"Firmware and config tool for shooting gun",
+ "license"=>"PD",
+ "maintenance"=>"obsolete-Config tool is written for the discontinued Amiga platform.",
+ "language"=>"i8051 asm, 680x0 asm",
+ "description"=><<"HERE",
+<p>LaserGame is a clone of commercial shoot'n'run game. Each player has its
+own hardware with multiple infra detecting sensor and one laser/infra gun.
+Shooting is visually targeting by red laser diode while the shooting
+information is being emitted by infrared.</p>
+<p>Its Amiga communication tool will receive shooting statistics while being
+also capable of remote hardware configuration.</p>
+<p>Hardware part done by
+@{[ a_href 'http://www.pavouk.org/','Pavel "Pavouk" Ruzicka' ]}.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/LaserGame/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl \
+ LaserGame.png
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# List of projects Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::List;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+Wrequire 'My::Project';
+
+
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Project List',
+ "args_check"=>{
+ "platform"=>'^(?:platform)?$',
+ },
+ "rel_up"=>top_dir(),
+ "rel_start"=>top_dir(),
+ "footer_ids"=>0,
+ );
+My::Web->heading();
+
+my $CGI=CGI->new();
+
+print My::Project->views(($W->{"args"}{"platform"} ? "BriefPlatform" : "BriefUnified"));
+print My::Project->platforms(undef()) if $W->{"args"}{"platform"};
+
+my %item=( My::Project::item_hash_read() );
+
+# $col{"name"}{"show"}=1
+# $col{"name"}{"format"}=sub { "<".$_[0].">"; }
+# $col{"name"}{""}="Project name";
+# @col_order
+
+my @row_order=qw(-priority);
+my @col_order=qw(name summary license maintenance language);
+my %col;
+
+sub format_url ($) { return (!$_[0] ? "" : '<a href="'.$_[0].'">X</a>'); }
+
+$col{"name"}{"format"}=sub {
+ $_[0]=~s#<a\s[^>]*>([^<]*)</a>#$1#g;
+ return "<a href=\"".$_[1]."/\">"
+ .(!$My::Web::W->{"args"}{"W"} ? "" : $item{$_[1]}{"priority"}.":")
+ .$_[0]."</a>";
+ };
+
+$col{"license"}{"format"}=sub {
+ my %known=(
+ "PD"=>"<a href=\"http://www.gnu.org/philosophy/categories.html#PublicDomainSoftware\">PD</a>",
+ "GPL"=>"<a href=\"http://www.gnu.org/licenses/gpl.html\">GPL</a>",
+ "LGPL"=>"<a href=\"http://www.gnu.org/licenses/lgpl.html\">LGPL</a>",
+ );
+ return $known{$_[0]} if $known{$_[0]};
+ return $_[0];
+ };
+
+$col{"maintenance"}{"format"}=sub {
+ return ($_[0]=~/^([^-]*)/)[0];
+ };
+
+$col{"online-demo"}{"format"}=\&format_url;
+$col{"download"}{"format"}=\&format_url;
+$col{"name"}{""}="Project Name";
+$col{"summary"}{""}="Abstract";
+$col{"license"}{""}="Copying";
+$col{"maintenance"}{""}="State";
+$col{"language"}{""}="Language";
+
+# Fill in cols not contained in @col_order
+if (0) {
+ my %col_order=map(($_=>1),@col_order);
+ push @col_order,map({ ($col_order{$_} ? () : $_); } keys(%{{ map(($_=>1),map((keys(%{$item{$_}})),keys(%item)))}}));
+ }
+
+my $print_one_platform=sub ($)
+{
+my($platform)=@_;
+
+ print '<table border="1">'."\n";
+ print '<tr>';
+ for my $col (@col_order) {
+ next if defined $col{$col}{"show"} && !$col{$col}{"show"};
+ print '<th>'.($col{$col}{""} || "[$col]").'</th>';
+ }
+ print '</tr>'."\n";
+ my @rows_ordered=sort {
+ for my $order_by (@row_order,"name") {
+ my $order_by=$order_by;
+ my $minus=($order_by=~s/^(-)//)[0];
+ # FIXME: 'cmp' or '<=>'?
+ my $r=($item{$a}{$order_by} <=> $item{$b}{$order_by});
+ $r=-$r if $minus;
+ return $r if $r;
+ }
+ return 0;
+ } map(($platform && $item{$_}{"platform"} ne $platform ? () : ($_)),keys(%item));
+ for my $row (@rows_ordered) {
+ print '<tr>';
+ for my $col (@col_order) {
+ next if defined $col{$col}{"show"} && !$col{$col}{"show"};
+ print '<td>';
+ if (!$col{$col}{"format"}) {
+ print(($item{$row}{$col} || ""));
+ }
+ else {
+ print(&{$col{$col}{"format"}}($item{$row}{$col},$row));
+ }
+ print '</td>';
+ }
+ print '</tr>'."\n";
+ if ($CGI->param("description_opt")) {
+ print '<tr><td style="border: none;"></td>';
+ print '<td colspan="'.(scalar(@col_order)-1).'"><blockquote>'.$item{$row}{"description"}.'</blockquote></td>';
+ print '</tr>'."\n";
+ print '<tr><td style="border: none;" colspan="'.scalar(@col_order).'"> </td></tr>'."\n";
+ }
+ }
+ print '</table>'."\n";
+};
+
+
+if (!$W->{"args"}{"platform"}) {
+ &{$print_one_platform}(undef());
+ }
+else {
+ my @platforms=@My::Project::platforms;
+ while (@platforms) {
+ my $platform_sym =shift @platforms;
+ my $platform_name=shift @platforms;
+ print '<a name="'.$platform_sym.'">';
+ print "<h2>$platform_name</h2>";
+ print '</a>'."\n";
+ &{$print_one_platform}($platform_sym);
+ }
+ }
+
+
+My::Web->footer();
SUBDIRS= \
step \
- icp \
+ Islet \
FordFulk \
Heat \
kix \
cvsutil \
cvsbranchdiff \
ppp9k \
- LaceMail \
- line9k
+ PerlMail \
+ line9k \
+ captive \
+ PortDiag \
+ CasioA \
+ LaserGame \
+ ShortRel \
+ TraceFS \
+ AutoGen \
+ gsmperl \
+ 332 \
+ lynxilla \
+ wayback \
+ kewensis \
+ QueryDev \
+ SClock \
+ ResRAM \
+ ssht \
+ postget \
+ middleman \
+ phphash \
+ energie \
+ MyWeb \
+ pgsqlsubstr \
+ int13sniff \
+ libtool \
+ muttsort \
+ gladewsrc \
+ etherealmmse \
+ etherealwsp \
+ libxml2reader
EXTRA_DIST+= \
- list.cgi.pl
-
-#noinst_DATA+= \
-# index.html
+ Index.html.pl \
+ ChangeLog.txt.pl \
+ Pod2Html.html.pl \
+ List.html.pl \
+ Rel.pl
#! /usr/bin/perl
#
# $Id$
-# Main page of 'My::Project::Nokia61'
+# Main page of 'My::Project::MyWeb'
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::MyWeb::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::Nokia61::ListItem;
+Wuse 'My::Project';
+Wuse 'project::MyWeb::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::Nokia61::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::MyWeb::ListItem::ListItem,
);
-print <<'HERE';
-<iframe src="Nokia61.php?base=.%2F" width="90%" height="500" />
-<a href="Nokia61.php?base=.%2F">Program on-line</a>.
-</iframe>
-HERE
-
My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::MyWeb' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::MyWeb::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"My::Web",
+ "platform"=>"web",
+ "priority"=>250,
+ "cvs"=>"www/www.jankratochvil.net",
+ "link-Example web"=>a_href('http://www.jankratochvil.net/'),
+ "summary"=>a_href('http://www.perl.org/','Perl')." web framework",
+ "license"=>"GPL",
+ "maintenance"=>"ready",
+ "language"=>"Perl",
+ "description"=><<"HERE",
+<p>Each web author has his own web framework reusable for other web developers
+as a generic engine. Here is mine. I am not a fool to expect you would use
+it.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/MyWeb/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::Nokia61'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::Nokia61::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::Nokia61::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::Nokia61::ListItem::ListItem,
+ );
+
+do { My::Web::make("make -s $_") if ! -f $_; } for ("./Nokia61");
+print <<"HERE";
+<table border="0" width="100%">
+ <col width="0*" />
+ <col width="1*" />
+ <tr>
+ <td align="left">
+<iframe src="Nokia61.php?base=.%2F" width="500" height="600">
+<a href="Nokia61.php?base=.%2F">Program on-line</a>.
+</iframe>
+ </td>
+ <td align="center">@{[ img 'Nokia61.jpeg','Illustration' ]}</td>
+ </tr>
+</table>
+HERE
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::Nokia61;
+package project::Nokia61::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Nokia Game "Rotation"",
- "priority"=>7,
+
+our @ListItem=(
+ "name"=>"Rotation",
+ "platform"=>"web",
+ "priority"=>480,
+ "icon"=>"Nokia61-icon.jpeg",
"download"=>"Nokia61.c",
- "summary"=>"Logical game solver",
+ "summary"=>"Nokia logical game "Rotation" solver",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C, PHP",
- "description"=>""
- .'<p>At least Nokia 3210 offers game <b>Rotation</b>, this little software will'
- .' tell you the optimal solution steps for the given game board situation.'
- .' The goal is to get board with'
- .' <b>1 2 3</b>, <b>4 5 6</b>, <b>7 8 9</b>,'
- .' in rows.</p>'
+ "description"=><<"HERE",
+<p>At least Nokia 3210 offers game <b>Rotation</b>, this little software will
+tell you the optimal solution steps for the given game board situation.
+The goal is to get board with
+<b>1 2 3</b>, <b>4 5 6</b>, <b>7 8 9</b>,
+in rows.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html \
- Nokia61
+ Index.html.pl
Nokia61: Nokia61.c
gcc -Wall -ggdb3 -o $@ $<
+
+CLEANFILES+= \
+ Nokia61 \
+ Nokia61_23.cache
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::PerlMail'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::PerlMail::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::PerlMail::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::PerlMail::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>Features list</p>
+<ul>
+ <li>Powerful filtering by @{[ a_href 'http://www.perl.org/','Perl' ]} rules</li>
+ <li>Safe mails transfer to remote user workstation while using possibly dynamic IP</li>
+ <li>Event driven immediate response, no polling (IMAP/POP3 poll)</li>
+ <li>No risk of SMTP error mails during remote workstation connection problems</li>
+ <li>SMS-forwarder featuring
+ @{[ a_href 'http://search.cpan.org/author/JARIAALTO/Lingua-EN-Squeeze-1998.1204/','Lingua::EN::Squeeze' ]},
+ MIME decoding, HTML conversion</li>
+ <li>Outgoing mail headers mangling by per-recipient rules</li>
+ <li>@{[ a_href 'http://www.mutt.org/','Mutt' ]} mailer integration</li>
+ <li>@{[ a_href 'http://www.nokia.com/phones/9110i','Nokia Communicator' ]} contacts directory conversion</li>
+</ul>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::PerlMail' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::PerlMail::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"PerlMail",
+ "platform"=>"unixuser",
+ "priority"=>640,
+ "cvs"=>"PerlMail",
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "link-README"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/PerlMail/README?rev=HEAD",
+ "summary"=>"Perl mail processor - ".a_href('http://www.procmail.org/','procmail')."(1) successor",
+ "license"=>"GPL",
+ "maintenance"=>"ready",
+ "language"=>"Perl",
+ "description"=><<"HERE",
+<p>Successor to @{[ a_href 'http://www.procmail.org/','procmail' ]}(1)
+and @{[ a_href 'http://search.cpan.org/author/SIMON/Mail-Audit-2.1/','Mail::Audit' ]}.
+It supports @{[ a_href 'http://www.perl.org/','Perl' ]}-rules filtering, dynamic client IP,
+mobile SMS forwarding, @{[ a_href 'http://www.mutt.org/','Mutt' ]} integration,
+@{[ a_href 'http://www.nokia.com/phones/9110i','Nokia Communicator' ]} contacts directory integration.</p>
+<p>Use if you like: <span class="quote">
+ @{[ CGI::escapeHTML(q{store "=spam" if ($_=mimehead(body_first())->mime_attr("Content-Type")) && m#text/html#i;}) ]}
+ </span></p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/PerlMail/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# URL redirector of &My::Web::a_href Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::Pod2Html;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "header_only"=>1,
+ "args_check"=>{
+ "cvs"=>'^[\w\d][\w\d/.]*$',
+ },
+ );
+
+$W->{"r"}->send_http_header("text/html");
+local *F;
+open F,"lynx -source ".$W->{"project_viewcvs"}."*checkout*/".$W->{"args"}{"cvs"}."?rev=HEAD"
+ ." |pod2html -"
+ ." |";
+print while <F>;
+close F;
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::PortDiag'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::PortDiag::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::PortDiag::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::PortDiag::ListItem::ListItem,
+ );
+
+
+print centerimg "PortDiag","PortDiag Snapshot";
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::PortDiag' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::PortDiag::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"PortDiag",
+ "platform"=>"amiga",
+ "priority"=>470,
+ "icon"=>"PortDiag-icon",
+ "download"=>"PortDiag.lha",
+ "link-source file"=>"PortDiag.asm",
+ "aminet"=>"hard/hack/PortDiag",
+ "summary"=>"Hardware I/O port diagnostics utility",
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"680x0 asm",
+ "description"=><<"HERE",
+<p>PortDiag is generally used for low-level hardware watching and modifying.
+It has support for all the bits of the four CIA ports, digital and analog parts
+of the game ports, serial port TXD and RXD signals and selective system
+allocation of this hardware.</p>
+<p>Hardware issues and images by the courtesy of
+@{[ a_href 'http://www.pavouk.org/','Pavel "Pavouk" Ruzicka' ]}.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/PortDiag/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl \
+ PortDiag.png
--- /dev/null
+;###############################################
+;### SPECIAL WARNING FOR NORMAL PROGRAMMERS: ###
+;###############################################
+;###### Please don't read this source !!! ######
+;##### It is completely ALTERNATIVELY made #####
+;### from scratch. Reading such thing may and ##
+;### possibly WILL leave permanent damage to ###
+;################ your _mind_. #################
+;##### Special recommendation for Lemming. #####
+;###############################################
+
+;DEBUG equ 1
+
+ include "ssmac.h"
+
+WARN_DDR_MASK equ $FFF800FF
+WARN_PR_MASK equ $00000001
+
+ciaa equ $bfe001
+ciab equ $bfd000
+CIABaseA4 equ ciab
+BaseA4 equ $dff000
+TEXT_PEN equ 1
+BGND_PEN equ 0
+
+ dv.b ST_joy0daty
+ dv.b ST_joy0datx
+ dv.b ST_joy1daty
+ dv.b ST_joy1datx
+ dv.b ST_pot0daty
+ dv.b ST_pot0datx
+ dv.b ST_pot1daty
+ dv.b ST_pot1datx
+ dv.l DefCIAIO
+ dv.l SigMask
+ dv.l MyWindow
+ dv.l StdFont
+ dv.l potgobase
+ dv.l diskbase
+ dv.l miscbase
+ dv.l OrigWPtr
+ dv.l VisualInfo
+ dv.w GameAlloced
+ dbuf ScrTitBuf,80
+ dv.b CleanServ
+ dv.b Signaled
+ dv.b InitCounters
+ dv.b DiskAlloc
+ dv.b PortAdd
+
+ start
+
+ move.l 4.w,a6
+ addq.b #1,TDNestCnt(a6)
+ gett RzPortName,a1
+ call FindPort
+ tst.l d0
+ beq.s NoPortFound
+ move.l d0,a1
+ move.l MP_SIGTASK(a1),a1
+ moveq #1<<6,d0
+ rol.l #8,d0
+ call Signal
+ call Permit
+ dtl <Already running>,a0
+ bra.s SSExitError
+
+NoPortFound lea RzPort(pc),a1
+ move.l ThisTask(a6),MP_SIGTASK(a1)
+ call AddPort
+ call Permit
+ stv PortAdd
+ lea StdAttr(pc),a0
+ call gfx,OpenFont
+ put.l d0,StdFont
+ beq.s OpenWinFail
+ dtl <disk.resource>,a1
+ call exec,OpenResource
+ put.l d0,diskbase
+ beq.s OpenWinFail
+ dtl <misc.resource>,a1
+ call OpenResource
+ put.l d0,miscbase
+ beq.s OpenWinFail
+ sub.l a0,a0
+ call intuition,LockPubScreen
+ move.l d0,ScrLock
+ bne.s LockScrOK
+OpenWinFail dtl <Cannot open window>,a0
+SSExitError jump ss,ExitError
+
+LockScrOK move.l d0,a0
+ sub.l a1,a1
+ call gadtools,GetVisualInfoA
+ put.l d0,VisualInfo
+ beq.s OpenWinFail
+ move.l d0,d5
+ lea AGamePort(pc),a0
+ call CreateContext
+ lea GNGadgets(pc),a3
+ clr.l -(sp)
+ clr.l -(sp)
+ push #GA_Immediate
+GGNG_Loop tst.l d0
+ beq.s OpenWinFail
+ move.l d0,a0
+ move.l a3,a1
+ tst.b gng_GadgetID+1(a1)
+ bmi.s GGNG_Skip
+ move.l sp,4(sp)
+GGNG_Skip lea gng_VisualInfo(a3),a3
+ move.l d5,(a3)+
+ moveq #BUTTON_KIND,d0
+ move.l sp,a2
+ call CreateGadgetA
+ tst.w (a3)
+ bne.s GGNG_Loop
+ tst.l d0
+ beq.s OpenWinFail
+ lea 1*8+4(sp),sp
+ lea NewMyWindow(pc),a0
+;;; move.w #CUSTOMSCREEN,nw_Type(a0)
+ clr.l -(sp)
+ dt ScrTitle,<PortDiag - Copyright (c) 1995 Short Software ',60,'short@k332.feld.cvut.cz',62,'>
+ tpea ScrTitle
+ push #WA_ScreenTitle
+ push sp
+ push #WA_AutoAdjust
+ moveq #0,d0
+ move.w NewMyWindow+nw_Width(pc),d0
+ push d0
+ push #WA_InnerWidth
+ move.w NewMyWindow+nw_Height(pc),d0
+ push d0
+ push #WA_InnerHeight
+ move.l sp,a1
+ call intuition,OpenWindowTagList
+ put.l d0,MyWindow
+ beq OpenWinFail
+ get.l sv_thistask,a0
+ put.l pr_WindowPtr(a0),OrigWPtr
+ move.l d0,pr_WindowPtr(a0)
+ lea 4*8+4(sp),sp
+ move.l d0,a0
+ move.l wd_UserPort(a0),d6
+ move.l wd_RPort(a0),d2
+ sub.l a1,a1
+ call gadtools,GT_RefreshWindow
+ lea BorList(pc),a2
+ move.w (a2)+,d0
+ get.l intuitionbase,a6
+NextBorder lea (a2,d0.w),a1
+ move.l d2,a0
+ moveq #0,d0
+ moveq #0,d1
+ call DrawBorder
+ move.w (a2)+,d0
+ bne.s NextBorder
+ get.l StdFont,a0
+ move.l d2,a1
+ call gfx,SetFont
+ move.l d2,a0
+ lea MyWinITexts(pc),a1
+ moveq #0,d0
+ moveq #0,d1
+ call intuition,PrintIText
+ dtl <potgo.resource>,a1
+ call exec,OpenResource
+ put.l d0,potgobase
+ beq OpenWinFail
+ get.l intuitionbase,a6
+ bsr ActivateScreen
+ call ss,TrackSignal
+ moveq #0,d2
+ bset d0,d2
+ put.l d2,SigMask
+ move.l CIABaseA4Ptr(pc),a4
+ move.b ciaa+ciaddra-CIABaseA4(a4),d0
+ rol.w #8,d0
+ move.b ciaa+ciaddrb-CIABaseA4(a4),d0
+ rol.l #8,d0
+ move.b ciab+ciaddra-CIABaseA4(a4),d0
+ rol.l #8,d0
+ move.b ciab+ciaddrb-CIABaseA4(a4),d0
+ put.l d0,DefCIAIO
+ stv.b CleanServ
+ moveq #INTB_VERTB,d0
+ lea IntStruct(pc),a1
+ move.l v,IS_DATA(a1)
+ call exec,AddIntServer
+LoopIDCMP lea SetSelected(pc),a1
+ bsr DoRoutUpdate
+ get.l MyWindow,a2
+ move.l wd_RPort(a2),d3
+ move.l d3,a1
+ moveq #TEXT_PEN,d0
+ call gfx,SetAPen
+ move.l d3,a1
+ moveq #BGND_PEN,d0
+ call SetBPen
+ move.l joy0dat(a4),d2
+ geta ST_joy0daty,a0
+ moveq #64,d0
+ moveq #125,d1
+ lea G12l+gg_GadgetID(pc),a2
+ lea G12r+gg_GadgetID(pc),a3
+ bsr ProcCounterLR ;joy0daty
+ moveq #64,d0
+ moveq #114,d1
+ lea G11l+gg_GadgetID(pc),a2
+ lea G11r+gg_GadgetID(pc),a3
+ bsr ProcCounterLR ;joy0datx
+ move.w #216,d0
+ moveq #125,d1
+ lea G22l+gg_GadgetID(pc),a2
+ lea G22r+gg_GadgetID(pc),a3
+ bsr ProcCounterLR ;joy1daty
+ move.w #216,d0
+ moveq #114,d1
+ lea G21l+gg_GadgetID(pc),a2
+ lea G21r+gg_GadgetID(pc),a3
+ bsr ProcCounterLR ;joy1datx
+ move.l pot0dat(a4),d2
+ moveq #64,d0
+ move.w #147,d1
+ bsr.s ProcCounter ;pot0daty
+ moveq #64,d0
+ move.w #136,d1
+ bsr.s ProcCounter ;pot0datx
+ move.w #216,d0
+ move.w #147,d1
+ bsr.s ProcCounter ;pot1daty
+ move.w #216,d0
+ move.w #136,d1
+ bsr.s ProcCounter ;pot1datx
+ stv.b InitCounters
+ clrv.b Signaled
+ get.l SigMask,d0
+ move.l d6,a0
+ move.b MP_SIGBIT(a0),d1
+ bset d1,d0
+ or.w #SIGBREAKF_CTRL_C!SIGBREAKF_CTRL_E,d0
+ call exec,Wait
+ btst #SIGBREAKB_CTRL_C,d0
+ beq.s TestFlagE
+SSReportBreak moveq #err_break,d0
+SSReportError jump ss,ReportError
+
+
+PC_Return tstv.b InitCounters
+ beq.s PC_Cont
+ cmp.l d0,d0
+ rts
+
+ProcCounter rol.l #8,d2
+ cmp.b (a0)+,d2
+ beq.s PC_Return
+PC_Cont move.l a0,d5
+ move.b d2,-(a0)
+ move.l d3,a1
+ call Move
+ move.l d3,a1
+ moveq #RP_JAM2,d0
+ call SetDrMd
+ moveq #0,d0
+ move.b d2,d0
+ move.w d0,-(sp)
+ move.l sp,a1
+ subq #4,sp
+ move.l a2,d4
+ move.l sp,a2
+ dtl <%02x>,a0
+ call ss,FormatStr
+ move.l d4,a2
+ move.l d3,a1
+ move.l sp,a0
+ moveq #2,d0
+ call gfx,Text
+ addq #6,sp
+ move.l d5,a0
+ move.l sp,d0
+Return2 rts
+
+ActivateScreen move.l ScrLock(pc),a0
+ jump ScreenToFront
+
+TestFlagE btst #SIGBREAKB_CTRL_E,d0
+ beq.s RetryIDCMP
+ get.l MyWindow,a0
+ call intuition,ActivateWindow
+ get.l MyWindow,a0
+ call WindowToFront
+ bsr.s ActivateScreen
+RetryIDCMP move.l d6,a0
+ call gadtools,GT_GetIMsg
+ tst.l d0
+ beq LoopIDCMP
+ move.l d0,a1
+ movem.l im_Class(a1),d2/d3/a3
+ call GT_ReplyIMsg
+ btst #9,d2 ;bit(IDCMP_CLOSEWINDOW)
+ bne.s Return2
+ moveq #0,d0
+ move.l CIABaseA4Ptr(pc),a4
+ btst #6,d2 ;bit(IDCMP_GADGETUP)
+ beq.s NoGadUp
+ move.b gg_GadgetID+1(a3),d0
+ addq.b #4,d0
+ bcc.s RetryIDCMP
+ move.b DefCIAIO(v,d0.w),d1
+ add.w d0,d0
+ add.w CIAddrTab(pc,d0.w),a4
+ move.b d1,(a4)
+SafeSetCIA nop
+ move.b (a4),(a4)
+ bra.s RetryIDCMP
+
+CIAprTab dc.w ciaa+ciapra-CIABaseA4
+ dc.w ciaa+ciaprb-CIABaseA4
+ dc.w ciab+ciapra-CIABaseA4
+ dc.w ciab+ciaprb-CIABaseA4
+CIAddrTab dc.w ciaa+ciaddra-CIABaseA4
+ dc.w ciaa+ciaddrb-CIABaseA4
+ dc.w ciab+ciaddra-CIABaseA4
+ dc.w ciab+ciaddrb-CIABaseA4
+CIAEndTab
+
+NoGadUp btst #5,d2 ;bit(IDCMP_GADGETDOWN)
+ beq.s RetryIDCMP
+ move.b gg_GadgetID+1(a3),d0
+ beq.s RetryIDCMP
+ subq.b #1,d0
+ cmp.b #64,d0
+ bcc.s OtherButtonDown
+ move.w d0,d1
+ lsr.w #3,d0
+ add.w d0,d0
+ lea Warn_DDR_Mask(pc),a0
+ subq.w #8,d0
+ bcc.s ItsddrChange
+ addq #4,a0
+ move.w CIAEndTab(pc,d0.w),d2
+ btst d1,(a4,d2.w)
+ bne.s ItsddrChange
+CallScrBeep bsr.s DoScrBeep
+ bra RetryIDCMP
+
+DoScrBeep move.l ScrLock(pc),a0 ;(#66)
+ jump intuition,DisplayBeep
+
+ItsddrChange tstv.l Arg_Force
+ bne.s NoWarnBit
+ move.l (a0),d3
+ btst d1,d3
+ beq.s NoWarnBit
+ mpush d0/d1/a0
+ dtl.lc <WARNING: You are attempting to change a bit>,a0
+ dt.lc <which may cause permanent hardware damage or>
+ dt.lc <unconditional immediate system crash!>
+ dt.lc <>
+ dt.lc <This is not a common warning as in many other programs:>
+ dt.lc <THIS REALLY _MIGHT_ DESTROY YOUR MACHINE!!!>
+ dt.lc <>
+ dt.lc <And remember: The author is not responsible for>
+ dt.l <any damage caused by this (any ;-) ) software!>
+ dtl <Change it|Oh no, forget it!>,a2
+ call ss,SimpleRequest
+ subq.l #1,d0
+ mpop d0/d1/a0
+ bne RetryIDCMP
+ bclr d1,d3
+ move.l d3,(a0)
+NoWarnBit add.w CIAddrTab(pc,d0.w),a4
+ bchg d1,(a4)
+ bra SafeSetCIA
+
+Warn_DDR_Mask dc.l WARN_DDR_MASK,WARN_PR_MASK
+
+OtherButtonDown bne.s NoWritePotgo
+;+++ Pressed "Start potgo" +++ (#65)
+ moveq #1,d0 ;START
+ moveq #1,d1 ;START
+ call potgo,WritePotgo
+ bra RetryIDCMP
+
+NoWritePotgo sub.b #66,d0
+ bmi.s CallScrBeep
+ bne.s NoTXD
+ opt nochkimm ;(#67)
+ move.b adkconr+BaseA4,d0
+ opt chkimm
+ and.b #ADKF_UARTBRK>>8,d0
+ bchg #ADKB_UARTBRK-8,d0
+ lsl.b #4,d0
+ bset #ADKB_UARTBRK-8,d0
+ opt nochkimm
+ move.b d0,adkcon+BaseA4
+ opt chkimm
+ bra RetryIDCMP
+
+NoTXD subq.b #1,d0
+ cmp.b #8,d0
+ bcc.s NoPotgoBits
+ moveq #0,d1 ;(#68)..(#75)
+ bset d0,d1
+ rol.w #8,d1
+ get.l potgobase,a6
+ move.w $28(a6),d0
+ and.w d1,d0
+ eor.w d1,d0
+ call WritePotgo
+ bra RetryIDCMP
+
+NoPotgoBits subq.b #8,d0
+ bne NoASerial
+ moveq #MR_SERIALPORT,d2
+ lea ASerial+gg_GadgetID(pc),a2
+ dtl <Seria>,a3
+DoAParallel move.l a2,d7
+ bsr.s ClearScrTit
+ geta ScrTitBuf,a0
+CopySerParName move.b (a3)+,(a0)+
+ bne.s CopySerParName
+ lea 6(a0),a4
+ subq #1,a0
+ dtl <l port grab error, owned by >,a1
+CopySerParSuff move.b (a1)+,(a0)+
+ bne.s CopySerParSuff
+ move.l d7,a2
+ tst.b (a2)
+ bne.s DoFreeSerPar
+ lea -1(a0),a3
+ bsr.s SerParHalf
+ addq.l #1,d2
+ bsr.s SerParHalf
+ dtl <allocated.>,a0
+ moveq #-1,d0
+ move.l d7,a2
+CopySerParSucc move.b (a0)+,(a4)+
+ bne.s CopySerParSucc
+ bsr SetSelected
+ bra.s DoScrWinTitle
+
+ClearScrTit get.l MyWindow,a0
+ moveq #-1,d0
+ move.l d0,a1
+ sub.l a2,a2
+ jump intuition,SetWindowTitles
+
+DoFreeSerPar bsr.s FreeSerParRout
+ gett GivenSys,a0
+ moveq #0,d0
+ bra.s CopySerParSucc
+
+SerParHalf move.l d2,d0
+ lea IntName(pc),a1
+ move.l 4.w,a0
+ addq.b #1,TDNestCnt(a0)
+ call misc,AllocMiscResource
+ tst.l d0
+ beq.s JumpExecPermit
+ move.l d0,a0
+ moveq #31,d0
+CopyLimName move.b (a0)+,(a3)+
+ dbeq d0,CopyLimName
+ clr.b (a3)
+ bsr.s JumpExecPermit
+ move.l d2,d0
+ and.b #~1,d0
+ cmp.l d0,d2
+ beq.s DontFreeRest
+ bsr.s JumpMiscFree
+DontFreeRest addq #4,sp
+ bsr DoScrBeep
+DoScrWinTitle geta ScrTitBuf,a2
+ bra DoScrTitle
+
+FreeSerParRout move.l d2,d0
+ bsr.s JumpMiscFree
+ move.l d2,d0
+ addq.l #1,d0
+JumpMiscFree jump misc,FreeMiscResource
+
+JumpExecPermit jump exec,Permit
+
+NoASerial moveq #MR_PARALLELPORT,d2
+ lea AParallel+gg_GadgetID(pc),a2
+ dtl <Paralle>,a3
+ subq.b #2,d0
+ bcs DoAParallel
+ bne NoADisk
+ lea ADisk+gg_GadgetID(pc),a2
+ tst.b (a2)
+ bne ADiskDoFree
+ move.l a2,d7
+ get.l MyWindow,a0
+ get.l intuitionbase,a6
+ cmp.w #39,LIB_VERSION(a6)
+ bcs.s StupidGfx2
+ move.l a0,a3
+ clr.l -(sp)
+ push sp
+ push #WA_BusyPointer
+ push sp
+ push #WA_PointerDelay
+ move.l sp,a1
+ call SetWindowPointerA
+ move.l a3,a0
+StupidGfx2 moveq #-1,d4
+ move.l d4,a1
+ dtl <Allocating disk...>,a2
+ call SetWindowTitles
+ get.l diskbase,a6
+ moveq #3,d2
+LoopADiskUnit move.l d2,d0
+ call AllocUnit
+ tst.l d0
+ sne d1
+ move.b d1,d0
+ roxr.b #1,d0
+ roxl.b #1,d3
+ bsr PushSw
+ dbra d2,LoopADiskUnit
+ put.b d3,DiskAlloc
+ get.l sv_thistask,a2
+ lea pr_MsgPort(a2),a2
+RetryGetUnit lea DRUnit(pc),a1
+ move.l a2,a0
+ move.l a0,MN_REPLYPORT(a1)
+ call disk,GetUnit
+ tst.l d0
+ bne.s GotUnit
+ move.l 4.w,a6
+RetryGiveReply move.l a2,a0
+ call WaitPort
+ move.l a2,a0
+ call GetMsg
+ tst.l d0
+ beq.s RetryGiveReply
+ bra.s RetryGetUnit
+
+GotUnit move.l d7,a2
+ moveq #-1,d0
+ bsr SetSelected
+ dtl <Disk control hardware allocated; Units: 0 - %s, 1 - %s, 2 - %s, 3 - %s>,a0
+ move.l sp,a1
+ geta ScrTitBuf,a2
+ call ss,FormatStr
+ lea 4*4(sp),sp
+ get.l intuitionbase,a6
+ cmp.w #39,LIB_VERSION(a6)
+ bcs.s SetTitnRet
+ clr.l -(sp)
+ clr.l -(sp)
+ push #WA_Pointer
+ move.l a3,a0
+ move.l sp,a1
+ call SetWindowPointerA
+ lea (1*8+4)+(2*8+4)(sp),sp
+SetTitnRet get.l MyWindow,a0
+ move.l d4,a1
+ call SetWindowTitles
+ bra RetryIDCMP
+
+ADiskDoFree bsr FreeDiskRes
+ moveq #0,d0
+ bsr SetSelected
+ dtl.c <Disk completely >,a2
+ dt GivenSys,<given to system.>
+DoScrTitle get.l intuitionbase,a6
+ moveq #-1,d4
+ bra.s SetTitnRet
+
+NoADisk subq.b #1,d0
+ bne RetryIDCMP
+ lea AGamePort+gg_GadgetID(pc),a2
+ get.l potgobase,a6
+ tst.b (a2)
+ bne.s ADoFreeGame
+ move.w #$5501,d0
+ move.w d0,d2
+ call AllocPotBits
+ and.w d2,d0
+ beq.s AGameFailed
+ put.w d0,GameAlloced
+ moveq #4,d2
+ ror.w #2,d0
+LoopPushRol bsr.s PushRolSw
+ dbra d2,LoopPushRol
+ moveq #-1,d0
+ bsr SetSelected
+ bsr ClearScrTit
+ dtl <Game Port 1: A - %s, B - %s; Game Port 2: A - %s, B - %s; Start - %s>,a0
+ move.l sp,a1
+ geta ScrTitBuf,a2
+ call ss,FormatStr
+ lea 5*4(sp),sp
+ bra.s DoScrTitle
+
+PushRolSw rol.w #2,d0
+ scs d1
+PushSw neg.b d1
+ ext.w d1
+ lsl.w #2,d1
+ dt <Yes>
+ dt NoMsg,<No>
+ gett NoMsg,a0
+ sub.w d1,a0
+ move.l (sp),a1
+ move.l a0,(sp)
+ jmp (a1)
+
+AGameFailed bsr DoScrBeep
+ dtl <Game Ports are fully allocated!>,a2
+ bra.s DoScrTitle
+
+ADoFreeGame get.w GameAlloced,d0
+ clrv.w GameAlloced
+ call FreePotBits
+ moveq #0,d0
+ bsr SetSelected
+ dtl <Game Ports given to system.>,a2
+ bra DoScrTitle
+
+FreeDiskRes call disk,GiveUnit
+ get.b DiskAlloc,d3
+ ror.b #4,d3
+ moveq #3,d2
+LoopFreeUnit rol.b #1,d3
+ bcc.s SkipFreeUnit
+ move.l d2,d0
+ call FreeUnit
+SkipFreeUnit dbra d2,LoopFreeUnit
+ rts
+
+Cleanup move.l 4.w,a6
+ tstv.b PortAdd
+ beq.s NoPortAdd
+ clrv.b PortAdd
+ lea RzPort(pc),a1
+ call RemPort
+NoPortAdd tstv.b CleanServ
+ beq.s NoCleanServ
+ clrv.b CleanServ
+ lea IntStruct(pc),a1
+ moveq #INTB_VERTB,d0
+ call RemIntServer
+NoCleanServ lea ADisk+gg_GadgetID(pc),a2
+ tst.b (a2)
+ beq.s NoFreeDisk
+ clr.b (a2)
+ bsr.s FreeDiskRes
+NoFreeDisk lea ASerial+gg_GadgetID(pc),a2
+ tst.b (a2)
+ beq.s NoFreeSerial
+ clr.b (a2)
+ moveq #MR_SERIALPORT,d2
+ bsr FreeSerParRout
+NoFreeSerial lea AParallel+gg_GadgetID(pc),a2
+ tst.b (a2)
+ beq.s NoFreeParallel
+ clr.b (a2)
+ moveq #MR_PARALLELPORT,d2
+ bsr FreeSerParRout
+NoFreeParallel get.w GameAlloced,d0
+ beq.s NoFreeGamePort
+ clrv.w GameAlloced
+ call potgo,FreePotBits
+NoFreeGamePort get.l MyWindow,d0
+ beq.s NoMyWindow
+ clrv.l MyWindow
+ get.l sv_thistask,a0
+ get.l OrigWPtr,pr_WindowPtr(a0)
+ move.l d0,a4
+ move.l 4.w,a6
+ addq.b #1,TDNestCnt(a6)
+ClearWinPort move.l wd_UserPort(a4),a0
+ call GetMsg
+ tst.l d0
+ beq.s WinPortCleared
+ move.l d0,a1
+ call ReplyMsg
+ bra.s ClearWinPort
+
+WinPortCleared move.l a4,a0
+ moveq #0,d0
+ call intuition,ModifyIDCMP
+ call exec,Permit
+ move.l a4,a0
+ call intuition,CloseWindow
+NoMyWindow get.l StdFont,d0
+ beq.s NoCloseFont
+ clrv.l StdFont
+ move.l d0,a1
+ call gfx,CloseFont
+NoCloseFont lea AGamePort(pc),a1
+ move.l (a1),a0
+ clr.l (a1)
+ call gadtools,FreeGadgets
+ get.l VisualInfo,a0
+ clrv.l VisualInfo
+ call FreeVisualInfo
+ sub.l a0,a0
+ lea ScrLock(pc),a0
+ move.l (a0),a1
+ clr.l (a0)
+ jump intuition,UnlockPubScreen
+
+GadTable dc.w AA0l+gg_GadgetID-*-2
+ dc.w AA1l+gg_GadgetID-*-2
+ dc.w AA2l+gg_GadgetID-*-2
+ dc.w AA3l+gg_GadgetID-*-2
+ dc.w AA4l+gg_GadgetID-*-2
+ dc.w AA5l+gg_GadgetID-*-2
+ dc.w AA6l+gg_GadgetID-*-2
+ dc.w AA7l+gg_GadgetID-*-2
+ dc.w AB0l+gg_GadgetID-*-2
+ dc.w AB1l+gg_GadgetID-*-2
+ dc.w AB2l+gg_GadgetID-*-2
+ dc.w AB3l+gg_GadgetID-*-2
+ dc.w AB4l+gg_GadgetID-*-2
+ dc.w AB5l+gg_GadgetID-*-2
+ dc.w AB6l+gg_GadgetID-*-2
+ dc.w AB7l+gg_GadgetID-*-2
+ dc.w BA0l+gg_GadgetID-*-2
+ dc.w BA1l+gg_GadgetID-*-2
+ dc.w BA2l+gg_GadgetID-*-2
+ dc.w BA3l+gg_GadgetID-*-2
+ dc.w BA4l+gg_GadgetID-*-2
+ dc.w BA5l+gg_GadgetID-*-2
+ dc.w BA6l+gg_GadgetID-*-2
+ dc.w BA7l+gg_GadgetID-*-2
+ dc.w BB0l+gg_GadgetID-*-2
+ dc.w BB1l+gg_GadgetID-*-2
+ dc.w BB2l+gg_GadgetID-*-2
+ dc.w BB3l+gg_GadgetID-*-2
+ dc.w BB4l+gg_GadgetID-*-2
+ dc.w BB5l+gg_GadgetID-*-2
+ dc.w BB6l+gg_GadgetID-*-2
+ dc.w BB7l+gg_GadgetID-*-2
+ dc.w AA0r+gg_GadgetID-*-2
+ dc.w AA1r+gg_GadgetID-*-2
+ dc.w AA2r+gg_GadgetID-*-2
+ dc.w AA3r+gg_GadgetID-*-2
+ dc.w AA4r+gg_GadgetID-*-2
+ dc.w AA5r+gg_GadgetID-*-2
+ dc.w AA6r+gg_GadgetID-*-2
+ dc.w AA7r+gg_GadgetID-*-2
+ dc.w AB0r+gg_GadgetID-*-2
+ dc.w AB1r+gg_GadgetID-*-2
+ dc.w AB2r+gg_GadgetID-*-2
+ dc.w AB3r+gg_GadgetID-*-2
+ dc.w AB4r+gg_GadgetID-*-2
+ dc.w AB5r+gg_GadgetID-*-2
+ dc.w AB6r+gg_GadgetID-*-2
+ dc.w AB7r+gg_GadgetID-*-2
+ dc.w BA0r+gg_GadgetID-*-2
+ dc.w BA1r+gg_GadgetID-*-2
+ dc.w BA2r+gg_GadgetID-*-2
+ dc.w BA3r+gg_GadgetID-*-2
+ dc.w BA4r+gg_GadgetID-*-2
+ dc.w BA5r+gg_GadgetID-*-2
+ dc.w BA6r+gg_GadgetID-*-2
+ dc.w BA7r+gg_GadgetID-*-2
+ dc.w BB0r+gg_GadgetID-*-2
+ dc.w BB1r+gg_GadgetID-*-2
+ dc.w BB2r+gg_GadgetID-*-2
+ dc.w BB3r+gg_GadgetID-*-2
+ dc.w BB4r+gg_GadgetID-*-2
+ dc.w BB5r+gg_GadgetID-*-2
+ dc.w BB6r+gg_GadgetID-*-2
+ dc.w BB7r+gg_GadgetID-*-2
+ dc.w G13l+gg_GadgetID-*-2
+ dc.w G13r+gg_GadgetID-*-2
+ dc.w G14l+gg_GadgetID-*-2
+ dc.w G14r+gg_GadgetID-*-2
+ dc.w G23l+gg_GadgetID-*-2
+ dc.w G23r+gg_GadgetID-*-2
+ dc.w G24l+gg_GadgetID-*-2
+ dc.w G24r+gg_GadgetID-*-2
+ dc.w S1l+gg_GadgetID-*-2
+ dc.w S2l+gg_GadgetID-*-2
+ dc.w G13m+gg_GadgetID-*-2
+ dc.w G23m+gg_GadgetID-*-2
+ dc.w G14m+gg_GadgetID-*-2
+ dc.w G24m+gg_GadgetID-*-2
+
+ProcCounterLR bsr ProcCounter
+ beq.s Return1ShEq
+ ror.b #2,d2
+ scs d0
+ bsr.s ChkSelected
+ rol.b #1,d2
+ scs d0
+ rol.b #1,d2
+ scs d1
+ eor.b d1,d0
+ move.l a3,a2
+ChkSelected cmp.b (a2),d0
+Return1ShEq beq.s Return1
+SetSelected mpush d2/d3/a0/a1/a3
+ move.b d0,(a2)
+ get.l MyWindow,a3
+ move.l wd_RPort(a3),a1
+ cmp.b #76,1(a2)
+ bcc.s NoImage
+ move.l a1,a0
+ lea ImgZero(pc),a1
+ move.w -gg_GadgetID+gg_LeftEdge(a2),d0
+ move.w -gg_GadgetID+gg_TopEdge(a2),d1
+ move.l -gg_GadgetID+gg_GadgetRender(a2),a3
+ cmp.l a1,a3
+ bne.s SS_DoInpOut
+ tst.b (a2)
+ beq.s SS_HaveImage
+ lea ImgOne(pc),a1
+ bra.s SS_HaveImage
+
+NoImage moveq #RP_COMPLEMENT,d0
+ call gfx,SetDrMd
+ move.l wd_RPort(a3),a0
+ moveq #3,d0
+ cmp.w #39,LIB_VERSION(a6)
+ bcs.s StupidGfx
+ call SetWriteMask ;failures ignored
+StupidGfxJump move.l wd_RPort(a3),a1
+ lea -gg_GadgetID+gg_LeftEdge(a2),a0
+ move.w (a0)+,d0 ;LeftEdge->xmin
+ move.w (a0)+,d1 ;TopEdge->ymin
+ move.w (a0)+,d2
+ add.w d0,d2
+ subq.w #1,d2 ;xmax
+ move.w (a0),d3
+ add.w d1,d3
+ subq.w #1,d3 ;ymax
+ call RectFill
+Ret_SetSelected mpop d2/d3/a0/a1/a3
+Return1 rts
+
+SS_DoInpOut lea ImgInput(pc),a1
+ tst.b (a2)
+ beq.s SS_HaveImage
+ lea ImgOutput(pc),a1
+SS_HaveImage call intuition,DrawImage
+ get.l gfxbase,a6
+ bra.s Ret_SetSelected
+
+StupidGfx move.b d0,rp_Mask(a0)
+ bra.s StupidGfxJump
+
+DoRoutUpdate lea CIABaseA4,a4
+CIABaseA4Ptr equ *-4
+ lea GadTable(pc),a0
+ lea CIAprTab(pc),a3
+ moveq #7,d7
+ChkCIALoop move.w (a3)+,d0
+ move.b (a4,d0.w),d2
+ bsr.s ChkEight
+ dbra d7,ChkCIALoop
+ get.l potgobase,a4
+ move.b $28(a4),d2 ;$28(potgobase)/W=Contents of POTGO/POTINP
+ bsr.s ChkEight
+ lea BaseA4,a4
+BaseA4Ptr equ *-4
+ move.b potinp(a4),d2
+ move.b d2,d0
+ and.b #$05,d2
+ and.b #$50,d0
+ lsr.b #3,d0
+ or.b d0,d2
+ btst #ADKB_UARTBRK-8,adkconr(a4)
+ sne d0 ;TXD
+ roxr.b #1,d0
+ roxl.b #1,d2
+ btst #11-8,serdatr(a4)
+ sne d0 ;RXD
+ roxr.b #1,d0
+ roxl.b #1,d2
+ moveq #5,d3
+ bra.s Chk8Loop
+
+ChkEight moveq #7,d3
+Chk8Loop move.w (a0)+,d0
+ lea (a0,d0.w),a2
+ ror.b d2
+ scs d0
+ cmp.b (a2),d0
+ beq.s Chk8Okay
+ jsr (a1)
+Chk8Okay dbra d3,Chk8Loop
+ rts
+
+IntRoutine tst.b Signaled(a1)
+ bne.s IntReturnQuick
+ move.l a1,v
+ mpush d2-d4/d7/a2-a4
+ move.l sp,d4
+ lea DoSignal(pc),a1
+ bsr DoRoutUpdate
+ move.l joy0dat(a4),d0
+ vcmp.l ST_joy0daty,d0
+ bne.s DoSignal
+ move.l pot0dat(a4),d0
+ vcmp.l ST_pot0daty,d0
+ bne.s DoSignal
+ bra.s IntReturn
+
+DoSignal get.l SigMask,d0
+ get.l sv_thistask,a1
+ stv.b Signaled
+ call exec,Signal
+ move.l d4,sp
+IntReturn mpop d2-d4/d7/a2-a4
+IntReturnQuick move.l BaseA4Ptr(pc),a0
+ cmp.l d0,d0
+ rts
+
+IntStruct dc.l 0,0
+ dc.b NT_INTERRUPT,-128
+ dc.l IntName
+ dc.l 0 ;IS_DATA
+ dc.l IntRoutine
+
+IntName dc.b 'PortDiag',0
+ even
+
+DRUnit dc.l 0,0
+ dc.b NT_MESSAGE,0
+ dc.l IntName
+DRReplyPort dc.l 0
+ dc.w DRU_SIZE
+
+ dc.l 0,0
+ dc.b NT_INTERRUPT,-128
+ dc.l IntName,0,0 ;LN_NAME,IS_DATA,IS_CODE
+
+ dc.l 0,0
+ dc.b NT_INTERRUPT,-128
+ dc.l IntName,0,0 ;LN_NAME,IS_DATA,IS_CODE
+
+ dc.l 0,0
+ dc.b NT_INTERRUPT,-128
+ dc.l IntName,0,0 ;LN_NAME,IS_DATA,IS_CODE
+
+RzPort dc.l 0,0
+ dc.b NT_MSGPORT,-128
+ dc.l RzPortName
+ dc.b PA_IGNORE,0
+ dc.l 0
+RzPortHead dc.l RzPortTail
+RzPortTail dc.l 0,RzPortHead
+ dc.b NT_MESSAGE,0
+
+ dt RzPortName,<PortDiag.rendezvous>
+
+GNGadgets
+GNGDefaultAA dc.w 44,78,72,13
+ dc.l DefaultTxt,StdAttr
+ dc.w 252
+ dc.l PLACETEXT_IN,0
+
+GNGDefaultAB dc.w 196,78,72,13
+ dc.l DefaultTxt,StdAttr
+ dc.w 253
+ dc.l PLACETEXT_IN,0
+
+GNGDefaultBA dc.w 348,78,72,13
+ dc.l DefaultTxt,StdAttr
+ dc.w 254
+ dc.l PLACETEXT_IN,0
+
+GNGDefaultBB dc.w 500,78,72,13
+ dc.l DefaultTxt,StdAttr
+ dc.w 255
+ dc.l PLACETEXT_IN,0
+
+GNGStartPotgo dc.w 318,106,134,15
+ dc.l SPotgoTxt,StdAttr
+ dc.w 65
+ dc.l PLACETEXT_IN,0
+
+ dc.w 0
+
+ dt DefaultTxt,<Default>
+ dt SPotgoTxt,<Start potgo>
+
+ include "PortDiagWin.asm"
+
+ScrLock equ NewMyWindow+nw_Screen
+
+BorList dc.w AABorder-*-2
+ dc.w ABBorder-*-2
+ dc.w BABorder-*-2
+ dc.w BBBorder-*-2
+ dc.w G1Border-*-2
+ dc.w G1Border1-*-2
+ dc.w G1Border2-*-2
+ dc.w G1Border3-*-2
+ dc.w G1Border4-*-2
+ dc.w G2Border-*-2
+ dc.w G2Border1-*-2
+ dc.w G2Border2-*-2
+ dc.w G2Border3-*-2
+ dc.w G2Border4-*-2
+ dc.w PotgoBorder-*-2
+ dc.w SerialBorder-*-2
+ dc.w AllocBorder-*-2
+ dc.w 0
+
+ dt <$VER: PortDiag 1.0 (4.10.95)>
+
+ tags
+ template <OMIT_ANY_OF_ALL_THOSE_ANNOYING_WARNING_MESSAGES=FORCE/S>
+ dv.l Arg_Force
+ exitrout Cleanup
+ finish
+ end
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::QueryDev'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::QueryDev::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::QueryDev::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::QueryDev::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::QueryDev' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::QueryDev::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"QueryDev",
+ "platform"=>"amiga",
+ "priority"=>150,
+ "download"=>"QueryDev.lha",
+ "link-source file"=>"QueryDev.asm",
+ "link-aminet README"=>"QueryDev.README",
+ "summary"=>"Detect disk device name from its volume name",
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"680x0 asm",
+ "description"=><<"HERE",
+<p>QueryDev detects the device name from the given volume name. Volume must be
+locked in the system. Useful for DiskCopy which has the parameter DEVICE and
+you want to copy the diskette from any drive. QueryDev writes the detected
+device name to the specified variable.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/QueryDev/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+Short: Volume name -> device name
+Author: short@k332.feld.cvut.cz (Jan Kratochvil)
+Uploader: short@k332.feld.cvut.cz (Jan Kratochvil)
+Type: util/cli
+
+Description:
+ QueryDev detects the device name from the given volume name. Volume must
+be locked in the system. Useful for DiskCopy which has the parameter DEVICE
+and you want to copy the diskette from any drive. QueryDev writes the
+detected device name to the specified variable.
+
+Requirements:
+ Kickstart version V37 (2.04) or higher and ss.library V5.0 or higher (from
+package SSLib*.lha).
--- /dev/null
+;DEBUG equ 1
+
+ include "SSMac.h"
+
+ clistart
+
+ moveq #LDF_VOLUMES+LDF_DEVICES+LDF_READ,d1
+ call dos,LockDosList
+ move.l d0,d1
+ move.l d0,d4
+ get.l Arg_Volume,d2
+ moveq #LDF_VOLUMES,d3
+ call FindDosEntry
+ tst.l d0
+ bne.s EntryFound
+ dtl <Volume %s not found>,a0
+VolumeError geta Arg_Volume,a1
+ jump ss,ExitError
+
+EntryFound move.l d0,a2
+ move.l dl_Task(a2),a2
+ moveq #LDF_DEVICES,d2
+NextDevice move.l d4,d1
+ call NextDosEntry
+ dtl <No device matching volume %s>,a0
+ move.l d0,d4
+ beq.s VolumeError
+ move.l d0,a0
+ cmp.l dvi_Task(a0),a2
+ bne.s NextDevice
+ move.l dvi_Name(a0),d2
+ moveq #LDF_VOLUMES+LDF_DEVICES+LDF_READ,d1
+ call UnLockDosList
+ lsl.l #2,d2
+ move.l d2,a0
+ get.l Arg_VarName,d1
+ bne.s SomeVarName
+ dtl <DevName>,a1
+ move.l a1,d1
+SomeVarName push d1
+ moveq #0,d3
+ move.b (a0)+,d3
+ move.l a0,d2
+ moveq #1,d4
+ lsl.l #GVB_GLOBAL_ONLY,d4
+ tstv.l Arg_Global
+ bne.s GlobalVar
+ lsl.l #GVB_LOCAL_ONLY-GVB_GLOBAL_ONLY,d4
+GlobalVar call SetVar
+ tst.l d0
+ bne.s Return
+ dtl <Variable %s cannot be set>,a0
+ move.l sp,a1
+ jump ss,DosError
+
+Return addq #4,sp
+ rts
+
+ tags
+ template <VOLUME/A,TO=VARNAME,GLOBAL/S>
+ dv.l Arg_Volume
+ dv.l Arg_VarName
+ dv.l Arg_Global
+ finish
+ end
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# List of projects Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+use Apache::Constants qw(MOVED);
+Wrequire 'My::Project';
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "header_only"=>1,
+ "args_check"=>{
+ "rel"=>'^(?:prev|next)$',
+ "project"=>'^\w+$',
+ },
+ );
+
+my %item=( My::Project::item_hash_read() );
+my @platforms=@My::Project::platforms;
+my @projects=();
+# Do not sort by platforms:
+# while (@platforms)
+{
+ my $platform_sym =shift @platforms;
+ my $platform_name=shift @platforms;
+ push @projects,sort {
+ ($item{$b}{"priority"} <=> $item{$a}{"priority"})
+ or
+ (lc($item{$a}{"name"}) cmp lc($item{$b}{"name"}));
+ }
+ ( # Do not sort by platform: map({ $item{$_}{"platform"} ne $platform_sym ? () : ($_); } # )
+ keys(%item)
+ );
+ }
+my $target=undef();
+for (0..$#projects) {
+ next if $projects[$_] ne $W->{"args"}{"project"};
+ $target=$projects[$_-1] if $_>0 && $W->{"args"}{"rel"} eq "prev";
+ $target=$projects[$_+1] if $_<$#projects && $W->{"args"}{"rel"} eq "next";
+ last if $target;
+ }
+
+$W->{"r"}->status(MOVED);
+$W->{"r"}->header_out("Location"=>"http://".&{$W->{"web_hostname_sub"}}()
+# .":7680" # DEBUG
+ ."/project/".(!$target ? "" : "$target/"));
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::ResRAM'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::ResRAM::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::ResRAM::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::ResRAM::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::ResRAM' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::ResRAM::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"ResRAM",
+ "platform"=>"amiga",
+ "priority"=>530,
+ "download"=>"ResRAM.lha",
+ "link-source file"=>"ResRAM.asm",
+ "link-aminet README"=>"ResRAM.README",
+ "summary"=>"Reset-persisent bootable RAM filesystem",
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"680x0 asm",
+ "description"=><<"HERE",
+<p>ResRAM is generally used for the RAM disks which are not required to be
+written to. They are being used for fast booting when no harddisk is
+available. On ResRAM execution it scans the given files which are loaded to the
+memory and a reset-surviving resident module is installed.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/ResRAM/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+Short: Reset surviving RAM FileSys (V37+&ss.lib)
+
+Description:
+ ResRAM is generally used for the RAM disks which are not required to be
+written to - for example RAD disks used for fast booting when no harddisk is
+available. When ResRAM is run, it scans given files which are loaded to the
+memory and a reset-surviving resident module is installed.
+
+Requirements:
+ ResRAM executable requires Kickstart version 37 (2.0) or higher and the
+ss.library V5.0 or higher (from package SSLib*.lha).
--- /dev/null
+;DEBUG equ 1
+;DEBUGX equ 1 ;Requires silly CPU (680[01]0)
+;WaitDbg equ 1 ;Wait for RMB after each debug message
+;ModDebug equ 1 ;Do (Abs|Img)Module debugging
+
+PathLen equ 256
+StdBootPri equ 15
+StdTaskPri equ 10
+StdStackSize equ 512
+
+GV_DosBase equ $204
+
+ ifd ModDebug
+waitit macro
+ opt nochkimm
+ push d0
+\@a move.w d0,$dff180
+ addq.w #1,d0
+ btst.b #2,$dff016
+ bne.s \@a
+\@b move.w d0,$dff180
+ subq.w #1,d0
+ btst.b #2,$dff016
+ beq.s \@b
+ pop d0
+ opt chkimm
+ endm
+ else
+waitit macro
+ endm
+ endc
+
+ ifd DEBUGX
+amsg macro ;Text
+ opt w-
+ bsr DPrintf
+ opt w+
+ bra.s \@a
+\@b dc.b '\1'
+ ifeq NARG-1
+ dc.b 10
+ endc
+ dc.b 0
+ even
+\@a
+ endm
+ else
+amsg macro
+ endm
+ endc
+
+ include "SSMac.h"
+
+_LVOAddBootNode equ _LVOexpansionUnused
+
+;Main part:
+;My ResidentTag#
+;Word NULL - LongAlign#
+;Code#
+;Temporary variables
+;Static variables#
+;ResCmds SegLists+checksums#
+;NULL - stop of ResCmds#
+;Resident SegLists+checksums#
+;MyResident pointer#
+;Resident pointers#
+;ResidentList successor
+;KickMemHeader successor
+;KickMemHeader(w/o successor)#
+;KickMem(|s) [1-3]#
+;RES disk data#
+;DosHandler name#
+;Volume name#
+;ResCmds names#
+
+MyFORBID macro ;[exec]
+ ifne NARG
+ move.l 4.w,a6
+ endc
+ addq.b #1,TDNestCnt(a6)
+ endm
+
+ rsreset ;FileChain for ReadFiles
+FC_MinNode rs.b MLN_SIZE
+FC_FileSize rs.b 0 ;FileSize (1 Long)
+FC_DirList rs.b MLH_SIZE
+FC_ProtBits rs.b 1 ;Protection Bits (b7=1 -> dir)
+FC_FileName rs.b 0 ;FileName (ASCIIZ)
+FC_SIZEOF rs.b 0 ;w/o FileName
+
+ rsreset
+RFC_FileSize rs.l 1 ;Size of file/dir in bytes
+RFC_ProtBits rs.b 1 ;Protection bits (b7=1 -> dir)
+RFC_FileName rs.b 0 ;FileName (ASCIIZ)
+RFC_SIZEOF rs.b 0 ;w/o FileName
+
+ rsreset ;Resident chain
+RC_Next rs.l 1 ;^Next chain or NULL
+RC_Type rs.w 1 ;Type RCT_#?
+RC_CmdName rs.b 0 ;RCT_Cmd -> ^FileName of the PathName
+RC_Resident rs.b 0 ;!=RCT_Cmd -> ^ResidentTag
+RC_Tracker rs.l 1 ;File tracker
+RC_CheckSum rs.b 0 ;Segment values sum (LONG)
+RC_CheckSummed rs.w 1 ;BOOL value for summing
+RC_Hunks rs.w 1 ;# of hunks
+RC_SIZEOF rs.b 0 ;w/o (hunk sizes|hunk pointers)
+
+RCT_Cmd equ -1
+RCT_Lib equ 0
+RCT_KickMod equ 1
+
+ dbuf Anchor,ap_SIZEOF+PathLen
+ dv.l AnyTrk ;A! - Must be first
+ dv.l ChipTrk ;A!
+ dv.l ResMemory ;A! - Tracker of handler's memory
+ dbuf Root,FC_SIZEOF+1
+ dv.l RootLock
+ dv.l ResList ;Fwd-Linked list of residents
+ dv.l VolName ;B!
+ dv.l DevName ;B!
+ dv.l BootPri ;B!
+ dv.l OldCurDir
+ dv.l InhibitEnd ;Address of terminating 0/':' or NULL
+ dv.l LinPool
+ dbuf.l EOFRegs,9
+HunkBuf equ EOFRegs ;Size=20 bytes
+ dbuf AbsHeader,56
+ dv.w MEntries
+ dv.w UnitNum
+ dbuf StDevName,6
+ dbuf StVolName,9
+ dv.b Advisory
+
+ start
+
+ get.l sv_thistask,a0
+ put.l pr_CurrentDir(a0),OldCurDir
+ get.l Arg_Verbose,d0
+ beq.s NoneVerbose
+ move.l d0,a2
+ moveq #0,d2
+VerbParseMLoop move.b (a2)+,d0
+ beq.s VerbParseDone
+ move.b d0,d3
+ call utility,ToUpper
+ gett VerbParseTab,a1
+VerbParseCLoop move.b (a1)+,d1
+ bne.s VerbParseChar
+ dtl <Unrecognised VERBOSE char: ''%c''>,a0
+ move.w d3,-(sp) ;I hope RawDoFmt'll ignore b8-b15...
+ bra ErrorA1SS
+
+VerbParseChar cmp.b (a1)+,d0
+ bne.s VerbParseCLoop
+ or.b d1,d2
+ addq.b #2,d1
+ sne d1
+ and.b d1,d2 ;Clear if 254 (None)
+ bra.s VerbParseMLoop
+
+VerbParseDone put.l d2,Arg_Verbose
+NoneVerbose geta BootPri+4,a4
+ moveq #StdBootPri,d1
+ get.l Arg_BootPri,d0
+ beq.s BootPriStd
+ move.l d0,a0
+ move.l (a0),d1
+BootPriStd move.l d1,-(a4)
+ ext.w d1
+ ext.l d1
+ cmp.l (a4),d1
+ dtl <BootPri value %ld out of range (-128..127)>,a0
+ bne.s ErrorSSA4
+ move.l #RT_SIZE+2+ResidentCode+ResidentVars+12+ML_SIZE+ME_SIZE+RFC_SIZEOF+1,d6 ;RAM disk size
+ geta StDevName,a3
+ moveq #'0',d4
+ moveq #'0'-1,d5
+ moveq #LDF_DEVICES!LDF_READ,d1
+ moveq #LDF_DEVICES!LDF_READ,d3
+ call dos,LockDosList
+ move.l d0,d7
+ get.l Arg_Device,d0
+ beq DeviceStd
+ move.l d0,a2
+ dt InvalidName,<Invalid device name "%s">
+ tpea InvalidName
+ move.l a2,-(a4)
+TestDevNameLoop tst.b (a2)
+ beq.s TestDevError
+ cmp.b #':',(a2)+
+ bne.s TestDevNameLoop
+ tst.b (a2)
+ beq.s TestDevTerm
+TestDevError moveq #LDF_DEVICES!LDF_READ,d1
+ call UnLockDosList
+ pop a0
+ErrorSSA4 move.l a4,a1
+ bra ErrorSS
+
+TestDevTerm sub.l (a4),d6
+ add.l a2,d6 ;ASCIIZ name length
+ clr.b -(a2) ;Cut out ':'
+ move.l (a4),d2
+ move.l d7,d1
+ call FindDosEntry
+ tst.l d0
+ dt DevExists,<Device %s: already exists>
+ tpea DevExists
+ bne.s TestDevError
+ addq #8,sp
+ bsr.s DevNumDigit
+ bra DevStdOkay
+
+FindFreeNum move.l 4.w,a6
+ MyFORBID
+ move.l KickTagPtr(a6),d0
+ beq.s DevNumNoTags
+DevNumTagLoop bclr.l #31,d0
+ move.l d0,a0
+DevNumTgLoop move.l (a0)+,d0
+ beq.s DevNumNoTags
+ bmi.s DevNumTagLoop
+ move.l d0,a1
+ move.l RT_NAME(a1),a1
+ moveq #ResNumOne-ResName-1,d0
+ lea ResName(pc),a2
+ResNameLoop move.b (a1)+,d1
+ beq.s DevNumTgLoop
+ cmp.b (a2)+,d1
+ dbne d0,ResNameLoop
+ bne.s DevNumTgLoop
+ cmp.b (a2)+,d4
+ bne.s DevNumTgLoop
+ cmp.b (a2)+,d5
+ bne.s DevNumTgLoop
+ tst.b (a2)
+ bne.s DevNumTgLoop
+DevNumNoTags call Permit
+ get.l dosbase,a6
+ tst.w d0
+ beq Return
+DevNumDigit cmp.b #'9',d5
+ bne.s DevNumDigitL
+ cmp.b #'9',d4
+ bne.s DevNumDigitH
+ dt MaxDisks,<Max. # of RES disks reached>
+ tpea MaxDisks
+ bra TestDevError
+
+DevNumDigitH addq.b #1,d4
+ moveq #'0'-1,d5
+DevNumDigitL addq.b #1,d5
+ bra.s FindFreeNum
+
+DeviceStd move.l a3,-(a4)
+ move.l MyDiskTypeAddr(pc),(a3)
+DevNumLoop bsr.s DevNumDigit
+ lea 3(a3),a2
+ cmp.b #'0',d4
+ beq.s DevNum1Null
+ move.b d4,(a2)+
+ bra.s Digit2Force
+
+DevNum1Null cmp.b d4,d5
+ beq.s Digit2Null
+Digit2Force move.b d5,(a2)
+Digit2Null move.l a3,d2
+ move.l d7,d1
+ call FindDosEntry
+ tst.l d0
+ bne.s DevNumLoop
+DevNumOkay move.l a3,a2
+DevNumLength tst.b (a2)+
+ bne.s DevNumLength
+ sub.l (a4),a2
+ add.l a2,d6
+DevStdOkay moveq #LDF_DEVICES!LDF_READ,d1
+ call UnLockDosList
+ put.b d4,UnitNum
+ put.b d5,UnitNum+1
+ get.l Arg_Name,d0
+ move.l d0,a0
+ bne.s VolumeCustom
+ geta StVolName,a0
+ move.l a0,a1
+ move.l #'ResR',(a1)+ ;Standard volume name
+ move.w #'am',(a1)+
+ lea 3(a3),a2
+VolNameEnd move.b (a2)+,(a1)+
+ bne.s VolNameEnd
+VolumeCustom move.l a0,-(a4)
+TestVolName tst.b (a0)+
+ bne.s TestVolName
+ sub.l (a4),a0
+ add.l a0,d6
+
+ moveq #64,d0
+ lsl.l #6,d0 ;4KBytes Quantum
+ moveq #MEMF_PUBLIC,d1
+ call ss,TrackLinPool
+ put.l d0,LinPool
+ geta Root+LN_PRED,a1
+ move.l a1,-(a1)
+ addq #FC_DirList,a1
+ bsr InitDir ;@A4=Parent/Current dir
+ getad Anchor,a0,d2
+ move.l #(APF_DOWILD!APF_DODOT)<<24!PathLen,ap_Flags(a0)
+ get.l Arg_Files,d1
+ call dos,MatchFirst
+ tst.l d0
+ beq.s FileScanFirst
+ cmp.l #ERROR_NO_MORE_ENTRIES,d0
+ErrNoMorePtr equ *-4
+ bne.s ErrorScan
+ vpush Arg_Files
+ dtl <No files match %s>,a0
+ErrorA1SS move.l sp,a1
+ErrorSS jump ss,ExitError
+
+ErrorScan dtl <Error scanning files %s>,a0
+ vpush Arg_Files
+SSDosErrorA1 move.l sp,a1
+ jump ss,DosError
+
+PrintDirName btstv.b #VerbB_Dirs,Arg_Verbose+3
+ beq Return
+ vpea Anchor+ap_Buf
+ dtl <Scanning directory %s ...',13,$9B,'K>,a0
+ move.l sp,a1
+ call ss,Printf
+ReturnSPinc addq #4,sp
+ rts
+
+FileScanFirst get.l Anchor+ap_Current,a0
+ move.l an_Lock(a0),d1
+ call DupLock
+ put.l d0,RootLock
+ beq.s ErrorScan
+ tstv.l Arg_Verbose
+ beq.s FileScanLoop
+ dtl <',$9B,'0 p>,a0
+ call ss,Puts
+
+FileScanLoop tstv.l Anchor+ap_Info+fib_DirEntryType
+ bpl.s IsDir
+ btstv.b #VerbB_Files,Arg_Verbose+3
+ sne d7
+ beq.s FileVerbOff
+ bsr.s FileHeader
+FileVerbOff tstv.b Anchor+ap_Info+fib_Protection+3
+ bpl IsFile
+ tst.b d7
+ beq.s NextFile
+ dtl <Skipped>,a0
+ call PutsNL
+ bra.s NextFile
+
+FileHeader geta Anchor+ap_Buf,a0
+ call ss,Puts
+ dtl < - >,a0
+ jump Puts
+
+IsDir bclrv.b #APB_DIDDIR,Anchor+ap_Flags
+ bne WasDir
+ bsetv.b #APB_DODIR,Anchor+ap_Flags
+ tstv.b Anchor+ap_Info+fib_FileName
+ beq.s ClimbedUp
+ bsr AllocateFC
+ call ss,TestStack
+ push a4
+ bsr InitDir
+ClimbedUp bsr PrintDirName
+
+NextFile call ss,TestBreak
+ getad Anchor,a0,d1
+ call dos,MatchNext
+ tst.l d0
+ beq.s FileScanLoop
+ cmp.l ErrNoMorePtr(pc),d0
+ bne ErrorScan
+ bsr FlushStdout
+ get.l ResList,d3
+ beq ListPreNull ;No resident modules -> No detaching
+;Calculate size of the parts for detaching
+ geta ResMemory,a4
+ListPreSize move.l d3,a2
+ move.l (a2)+,d3 ;RC_Next
+ addq #RC_Hunks-RC_Type,a2
+ move.w (a2)+,d0 ;RC_Hunks
+ bra.s HunkSizeInto
+
+HunkSize move.l (a2)+,d1
+ addq.l #2,d1
+ move.l a4,a0
+ lsl.l #2,d1
+ bcs.s HunkSizeChip
+ subq #4,a0
+HunkSizeChip add.l d1,-(a0)
+HunkSizeInto dbra d0,HunkSize
+ tst.l d3
+ bne.s ListPreSize
+;Allocate detach part
+ moveq #MEMF_CHIP,d1
+ move.l sp,a2
+ dtl <CHIP>,a3
+ dt PublicMsg,<PUBLIC>
+GetDetaches push d1
+ move.l -(a4),d2
+ beq.s NoPart
+ addq.l #ME_SIZE,d6 ;(Any|Chip)Detach entry
+ gett DetachMsg,a0
+ move.l a3,a1
+ bsr AllocMemTopF
+ move.l d1,(a4)
+ move.l (sp),d1
+ move.l d0,(sp)
+ addq #5,a3
+NoPart subq.l #MEMF_CHIP,d1 ;CHIP,void
+ bcc.s GetDetaches
+;Fill in hunk pointers
+ get.l ResList,d2
+NextPtrMain move.l d2,a0
+ move.l (a0)+,d2 ;RC_Next
+ addq #RC_Hunks-RC_Type,a0
+ move.w (a0)+,d0
+ geta ResMemory,a2 ;Trashed long
+ bra.s HunkPtrsInto
+
+HunkPtrsLoop move.l (a0),d1
+ move.l sp,a3
+ lsl.l #2,d1
+ bcc.s HunkPtrsAny
+ addq #4,a3
+HunkPtrsAny move.l (a3),a1
+ move.l d1,(a1)
+ addq.l #8,(a1)+
+ move.l a1,d3
+ lsr.l #2,d3
+ move.l d3,(a2)
+ move.l a1,a2
+ clr.l (a1)+
+ move.l a1,(a0)+
+ add.l d1,a1
+ move.l a1,(a3)
+HunkPtrsInto dbra d0,HunkPtrsLoop
+ tst.l d2
+ bne.s NextPtrMain
+ addq #8,sp ;Trash destination addresses
+;LoadSeg the file
+ vmovev.l ResList,EOFRegs
+LoadSegLoop get.l EOFRegs,a4 ;previously D2
+ addq.l #8,d6 ;SegList+Checksum
+ move.l (a4)+,d4 ;RC_Next
+ move.w (a4)+,d3 ;RC_Type
+ bmi.s LoadSegCmd
+ addq.l #4,d6 ;^ResidentTag
+LoadSegCmd move.l (a4),a2 ;RC_Tracker
+ lea trk_ext(a2),a2
+ move.l (v),a6
+ btstv.b #VerbB_LoadFiles,Arg_Verbose+3
+ beq.s SkipLoadSegInfo
+ move.l a2,a1
+ dtl <LoadSeg of the file %s ...',13,$9B,'K>,a0
+ call Printf
+SkipLoadSegInfo move.l (a2),a0 ;trk_ext
+ move.l -(a2),d2 ;trk_data
+ moveq #OPEN_OLD,d0
+ moveq #0,d1
+ call TrackOpenBufFH
+ move.l d4,d2
+ move.l d0,a2
+ addq #RC_SIZEOF-RC_Tracker,a4
+ movemv.l d2-d6/a2/a4/a6/sp,EOFRegs
+ moveq #0,d4
+ moveq #0,d5
+;A4=Hunk pointer table
+;A2=File tracker
+;D2=Next RC
+;D3.W=Type
+;D4=Current hunk #*4 - modifiable
+;D5=Ptr to current hunk - (A2,D4.l) or NULL for no current hunk - modifiable
+HunkMainLoop movemv.l d4/d5,EOFRegs+2*4
+ vmovem.l EOFRegs+5*4,a2/a4/a6
+ lea FileEnd(pc),a0
+ move.l a0,bh_eofhook(a2)
+ call BGetLong
+ lea HunkError(pc),a0
+ move.l a0,bh_eofhook(a2)
+ bclr.l #HUNKB_ADVISORY,d0
+ snev Advisory
+ sub.w #HUNK_NAME,d0
+ bcs BadHunk
+ cmp.w #HUNK_RELRELOC32-HUNK_NAME+1,d0
+ bcc BadHunk
+ lsl.l #1,d0
+ move.w HunkTable(pc,d0.w),d1
+ swap d0
+ lsl.w #2,d0
+ bne HunkError
+ jsr HunkTable(pc,d1.w)
+ bra.s HunkMainLoop
+
+hunk macro ;HUNK_#?[,<routine>]
+ ifne _hunk-\1
+ fail Mismatched hunk numbers!
+ endc
+ ifeq NARG-1
+ dc.w BadHunk-HunkTable
+ else
+ dc.w hunk_\2-HunkTable
+ endc
+_hunk set _hunk+1
+ endm
+_hunk set 1000
+HunkTable
+ hunk HUNK_NAME,skipcnt ;1000
+ hunk HUNK_CODE,main ;1001
+ hunk HUNK_DATA,main ;1002
+ hunk HUNK_BSS,main ;1003
+ hunk HUNK_RELOC32,rel32 ;1004
+ hunk HUNK_RELOC16 ;1005
+ hunk HUNK_RELOC8 ;1006
+ hunk HUNK_EXT ;1007
+ hunk HUNK_SYMBOL,symbol ;1008
+ hunk HUNK_DEBUG,skipcnt ;1009
+ hunk HUNK_END,end ;1010
+ hunk HUNK_HEADER ;1011
+ hunk 1012 ;????
+ hunk HUNK_OVERLAY ;1013
+ hunk HUNK_BREAK ;1014
+ hunk HUNK_DREL32,rel16 ;1015
+ hunk HUNK_DREL16 ;1016
+ hunk HUNK_DREL8 ;1017
+ hunk HUNK_LIB ;1018
+ hunk HUNK_INDEX ;1019
+ hunk HUNK_RELOC32SHORT,rel16 ;1020
+ hunk HUNK_RELRELOC32,rrel16 ;1021
+ ifne _hunk-HUNK_RELRELOC32-1
+ fail Invalid number of hunks!
+ endc
+
+FileEnd vmovem.l EOFRegs,d2-d6/a2/a4/a6/sp
+ tst.l d5
+ bne HunkError
+ move.l a4,a3
+ lsr.l #2,d4
+ cmp.w -(a4),d4 ;RC_Hunks
+ bne HunkError
+ subq #RC_Hunks-RC_Tracker,a4
+ move.l (a4),a0 ;RC_Tracker
+ call FreeObject ;Non-buffered tracker
+ move.w d4,d7
+ tst.w d3 ;RC_Type
+ bmi.s LoadEndCmd
+ move.l a3,d5
+FindResInto dbra d4,FindResLoop
+ push bh_name(a2)
+ dtl <No resident tag found in file "%s">,a0
+ bra ErrorA1SS
+
+LoadEndCmd move.l bh_name(a2),d1
+ call dos,FilePart
+ move.l d0,(a4)+ ;RC_CmdName
+ bra.s LoadEnd
+
+FindResLoop move.l (a3)+,a0
+ move.l -8(a0),d0 ;Size of the hunk
+ moveq #RT_SIZE+8,d1
+ sub.l d1,d0
+ bcs.s FindResInto
+ lsr.l #1,d0
+ move.w d0,d1
+ swap d0
+FindResTag1 cmp.w #RTC_MATCHWORD,(a0)+
+FindResTag2 dbeq d1,FindResTag1
+ dbeq d0,FindResTag1
+ bne.s FindResInto
+ move.l a0,d0
+ subq.l #2,d0
+ cmp.l (a0),d0
+ bne.s FindResTag2
+ tst.w d3 ;RC_Type
+ bne.s KickMod
+ move.b RT_FLAGS-RT_MATCHTAG(a0),d0
+ and.b #$80,d0
+ or.b #RTF_AFTERDOS,d0
+ move.b d0,RT_FLAGS-RT_MATCHTAG(a0)
+ move.b #-128,RT_PRI-RT_MATCHTAG(a0)
+KickMod move.l (a0),(a4)+ ;RC_Resident
+ move.l d5,a3
+LoadEnd move.l a2,a0
+ call ss,FreeObject
+ moveq #0,d3
+ tst.w (a4)
+ beq.s CalcNoSum
+ subq.w #1,d7
+CalcSumMod move.l (a3)+,a0
+ move.l -8(a0),d0
+ lsr.l #2,d0
+ subq.l #3,d0
+ bmi.s CalcSumModInto
+ move.w d0,d1
+ swap d0
+CalcSumIt add.l (a0)+,d3
+ dbra d1,CalcSumIt
+ dbra d0,CalcSumIt
+CalcSumModInto dbra d7,CalcSumMod
+ seq d0
+ sub.b d0,d3
+CalcNoSum move.l d3,(a4)+ ;RC_CheckSum
+ move.l (a4),d0
+ lsr.l #2,d0
+ subq.l #1,d0
+ move.l d0,(a4)
+ tst.l d2
+ bne LoadSegLoop
+ bsr FlushStdout
+ListPreNull move.l d6,d2
+ gett BlockMsg,a0
+ dtl <Main>,a1
+ bsr AllocMemTop
+ put.l d1,ResMemory
+ move.l d0,d5
+ move.l d0,a1
+ move.w #RTC_MATCHWORD,(a1)+ ;RT_MATCHWORD
+ move.l #(RTF_COLDSTART<<24)!(1<<16),d7 ;RT_[FVTP]#?
+ lea ResName-ResidentPart+RT_SIZE-RT_MATCHTAG+2(a1),a0
+ move.l a0,d2
+ lea ResID-ResidentPart+RT_SIZE-RT_MATCHTAG+2(a1),a2
+ lea ResInit-ResidentPart+RT_SIZE-RT_MATCHTAG+2(a1),a3
+ movem.l d0/d4/d7/a0/a2/a3,(a1)
+ lea RT_SIZE-RT_MATCHTAG+2(a1),a1
+ lea ResidentPart(pc),a0
+ move.l #ResidentCode,d0
+ lea ResidentCode+ResidentVars(a1),a3
+ call exec,CopyMem
+ get.w UnitNum,ResNumOne-V-ResidentVars(a3)
+ get.w UnitNum,ResNumTwo-V-ResidentVars(a3)
+ lea -ds_SIZEOF(a3),a2
+ move.l a2,d1
+ call dos,DateStamp ;dosbase used below!
+ get.l ResList,d0
+ beq.s NoList1
+Cmds1Loop move.l d0,a0
+ move.l (a0)+,d0 ;RC_Next
+ tst.w (a0)+ ;RC_Type
+ bpl.s NoCmdNode1
+ addq #RC_SIZEOF-RC_CmdName,a0
+ move.l (a0),(a3)+ ;RC_SIZEOF - SegList
+ move.l -(a0),(a3)+ ;RC_CheckSum
+NoCmdNode1 tst.l d0
+ bne.s Cmds1Loop
+NoList1 clr.l (a3)+
+ get.l ResList,d0
+ beq.s NoList3
+Libs2Loop move.l d0,a0
+ move.l (a0)+,d0 ;RC_Next
+ tst.w (a0)+ ;RC_Type
+ bmi.s NoLibNode2
+ addq #RC_SIZEOF-RC_Resident,a0
+ move.l (a0),(a3)+ ;SegList
+ move.l -(a0),(a3)+ ;LibChkSum
+NoLibNode2 tst.l d0
+ bne.s Libs2Loop
+NoList3 push a3 ;STACK=^Resident list
+ move.l a3,-(a2) ;ResListPtr
+ move.l d5,(a3)+ ;My resident struct
+
+ get.l ResList,d0
+ beq.s NoList2
+Libs1Loop move.l d0,a0
+ move.l (a0)+,d0 ;RC_Next
+ tst.w (a0)+ ;RC_Type
+ bmi.s NoResMod
+ move.l (a0),(a3)+ ;RC_Resident
+NoResMod tst.l d0
+ bne.s Libs1Loop
+NoList2 move.l a3,-(a2) ;ResListSucc
+ clr.l (a3)+
+ clr.l (a3)+ ;LN_SUCC
+ push a3 ;STACK=^Resident list succ
+ clr.l (a3)+ ;LN_PRED
+ move.w #NT_KICKMEM<<8,(a3)+ ;LN_TYPE+LN_PRI
+ move.l d2,(a3)+ ;LN_NAME
+ get.w MEntries,(a3)+ ;ME_NUMENTRIES
+ geta AnyTrk,a0
+ moveq #2,d0
+MEntryLoop move.l (a0)+,d1
+ beq.s NoMEntry
+ move.l d1,a4
+ move.l trk_data(a4),(a3)+ ;ME_ADDR
+ move.l trk_ext(a4),(a3)+ ;ME_LENGTH
+NoMEntry dbra d0,MEntryLoop
+ move.l a3,-(a2) ;RootPtr
+ clr.l -(a2) ;NumLocks
+ clr.l -(a2) ;VolumeNode
+ move.l MyDiskTypeAddr(pc),-(a2) ;id_DiskType
+ moveq #64,d0
+ lsl.l #3,d0
+ move.l d0,-(a2) ;id_BytesPerBlock
+ move.l a3,a1
+ move.l -(a1),d0 ;Length
+ move.l d0,d7
+ add.l -(a1),d7
+ lsr.l #8,d0
+ lsr.l #1,d0 ;BlockSize=512
+ addq.l #1,d0
+ move.l d0,-(a2) ;id_NumBlocksUsed
+ move.l d0,-(a2) ;id_NumBlocks
+ moveq #ID_WRITE_PROTECTED,d0
+ move.l d0,-(a2) ;id_DiskState
+ clr.l -(a2) ;id_UnitNumber
+ clr.l -(a2) ;id_NumSoftErrors
+
+ mpush a1/a2
+ get.l RootLock,d1
+ call dos,CurrentDir
+ geta Root,a2
+ bsr ReadFiles
+ bsr FlushStdout
+ mpop a1/a2
+
+ move.l a3,-(a2) ;DosHName
+ geta DevName,a1
+ move.l (a1),a0
+LenDosHName tst.b (a0)+
+ bne.s LenDosHName
+ sub.l (a1),a0
+ move.w a0,d0
+ subq.w #1,d0
+ move.b d0,(a3)+
+ move.l (a1),a0
+ bra.s CopyDosHNameI
+
+CopyDosHNameL move.b (a0)+,(a3)+
+CopyDosHNameI dbra d0,CopyDosHNameL
+
+ move.l a3,-(a2) ;VolumeName
+ move.l -(a1),a0 ;VolName
+CopyVolName move.b (a0)+,(a3)+
+ bne.s CopyVolName
+
+ move.l a3,-(a2) ;CmdsNames
+ get.l ResList,d0
+ beq.s NoCmdsNoNames
+CmdNamesLoop move.l d0,a0
+ move.l (a0)+,d0
+ tst.w (a0)+ ;RC_Type
+ bpl.s NoCmdName
+ move.l (a0)+,a0 ;RC_CmdName
+CopyCmdName move.b (a0)+,(a3)+
+ bne.s CopyCmdName
+NoCmdName tst.l d0
+ bne.s CmdNamesLoop
+NoCmdsNoNames
+ move.l d5,a0
+ move.w #(RT_SIZE+2+ResidentCode)>>2-1,d1
+ moveq #0,d0
+GenSumMain sub.l (a0)+,d0
+ dbra d1,GenSumMain
+ move.l a2,a0
+GenSumMainE sub.l (a0)+,d0
+ cmp.l a0,d7
+ bne.s GenSumMainE
+ move.l d0,-(a2) ;AnySum
+ get.l BootPri,-(a2) ;VarBootPri
+
+;### Write out the AbsModule (if wished) ###
+;-HEADER- 00000000 00000001 00000000 00000000 *Length* --CODE--
+;*Length* 74Ln6014 0000ABCD 00000000 00000000 00000000 00000000
+ move.l (v),a6
+ pop a4 ;-(A4)=KickMem, ResListSucc
+ get.l Arg_GenAbs,d0
+ beq GenDisk
+ btstv.b #VerbB_SizeMod,Arg_Verbose+3
+ beq.s NoModVerb
+ push d0
+ dtl <Writing AbsModule to the file %s ...>,a0
+ move.l sp,a1
+ call Printf
+ bsr FlushStdout
+ move.l (v),a6
+ pop d0
+NoModVerb move.l d0,a0
+ moveq #OPEN_NEW,d0
+ moveq #0,d1
+ call TrackOpenBuf
+ move.l d0,a3
+ geta AbsHeader,a0
+ move.l HeaderPtr(pc),(a0)
+ addq.w #1,10(a0)
+ moveq #AbsHdrLength+3,d0
+ geta AnyTrk,a2
+ moveq #2,d1
+ move.l #$60147400!(21+AbsRawLength>>2),d2
+OutAbsLenLoop tst.l (a2)+
+ beq.s OutAbsLenInto
+ addq.w #2,d0
+ addq.b #2,d2
+OutAbsLenInto dbra d1,OutAbsLenLoop
+ move.w d0,22(a0)
+ subq.w #1,d0
+ move.w d0,30(a0)
+ move.w #HUNK_CODE,26(a0)
+ swap d2
+ move.l d2,32(a0)
+ move.w #$ABCD,38(a0)
+ moveq #56,d0
+ call BWrite
+ lea AbsModule(pc),a0
+ move.l #AbsRawLength,d0
+ call BWrite
+ lea _LVOBPutLong(a6),a1
+ bsr GenerateEnd
+ move.l #HUNK_END,(a0)+
+ move.l #HUNK_OVERLAY,(a0)+
+ clr.l (a0)+
+ clr.l (a0)+
+ move.l #HUNK_BREAK,(a0)+
+ move.l a0,d0
+ sub.l d3,d0
+ move.l d3,a0
+ call BWrite
+ bsr ClosenCleanup
+
+;### Generate AbsModule to the disk (if wished) ###
+GenDisk get.l Arg_GenDisk,d2
+ beq PrepHandler
+ moveq #LDF_DEVICES+LDF_READ,d1
+ call dos,LockDosList
+ move.l d0,d1
+ move.l d2,a3
+ moveq #':',d4
+ moveq #LDF_DEVICES,d3
+NextChar move.b (a3)+,d0
+ beq DiskErrorSP
+ cmp.b d4,d0
+ bne.s NextChar
+ clr.b -(a3)
+ call FindDosEntry
+ tst.l d0
+ beq NoDosEntry
+ move.l d0,a0
+ move.l dn_Startup(a0),d0
+ beq NoDosEntry
+ lsl.l #2,d0
+ move.l d0,a0
+ push (a0)+ ;fssm_Unit
+ push (a0)+ ;fssm_Device
+ move.l (a0)+,d0 ;fssm_Environ
+ push (a0) ;fssm_Flags
+ lsl.l #2,d0
+ move.l d0,a0
+ move.l (a0)+,d6 ;de_TableSize
+ cmp.l #128,(a0) ;de_SizeBlock
+ bne.s NoDosEntry
+ push de_HighCyl-de_SizeBlock(a0)
+ push de_LowCyl-de_SizeBlock(a0)
+ push de_Surfaces-de_SizeBlock(a0)
+ moveq #MEMF_PUBLIC,d0
+ subq.l #8,d6
+ subq.l #4,d6
+ bmi.s NoBufMemType
+ move.l de_BufMemType-de_SizeBlock(a0),d0
+NoBufMemType put.l d0,sv_memattr
+ move.l de_BlocksPerTrack-de_SizeBlock(a0),d0
+ moveq #3,d1 ;Min. are 3 Blocks/Track
+ cmp.l d1,d0
+ bcs.s NoDosEntry
+ lsl.l #8,d0
+ lsl.l #1,d0
+ move.l d0,d6 ;TrackBuffer size
+ get.l utilitybase,a0
+ lea _LVOUMult32(a0),a0
+ pop d1 ;de_Surfaces
+ jsr (a0)
+ pop d1 ;de_LowCyl
+ move.l d0,d7 ;Cylinder size
+ jsr (a0)
+ exg.l d0,d7 ;Position offset<->Cylinder size
+ pop d1 ;de_HighCyl
+ addq.l #1,d1
+ jsr (a0)
+ sub.l d7,d0
+ moveq #64,d5
+ lsl.l #3,d5 ;BootBlock size 512
+ geta AnyTrk,a0
+ moveq #2,d3
+LoopDiskTrk move.l (a0)+,d1
+ beq.s NoDiskTrk
+ move.l d1,a1
+ add.l trk_ext(a1),d5
+ subq.l #8,d5
+NoDiskTrk dbra d3,LoopDiskTrk
+ mpush d0/d5
+ push d2
+ dtl <Not enough disk space on the device %s (size %luB, needed %luB)>,a0
+ cmp.l d5,d0
+ bcs ErrorA1SS
+ lea 12(sp),sp
+ moveq #0,d3
+NoDosEntry moveq #LDF_DEVICES+LDF_READ,d1
+ call UnLockDosList
+DiskErrorSP push d2
+DiskError moveq #err_lock,d0
+ move.l (sp),a1
+ subq.l #LDF_DEVICES,d3
+ beq ReportSS
+ move.b d4,(a3)
+ move.l d2,d1
+ moveq #DOSTRUE,d2
+ call Inhibit
+ tst.l d0
+ beq.s DiskError
+ move.l (v),a6
+ put.l a3,InhibitEnd
+ tstv.l Arg_NoDiskReq
+ bne.s SkipDiskReq
+ dtl.lc <Insert disk for the boot image>,a0
+ dt.lc <into drive %s>
+ dt.l <All data on it will be overwritten!>
+ move.l sp,a1
+ dtl <Okay|Cancel>,a2
+ call ss,SimpleRequest
+ move.l d0,d1
+ moveq #err_break,d0
+ tst.l d1
+ beq ReportSS
+SkipDiskReq btstv.b #VerbB_SizeMod,Arg_Verbose+3
+ beq.s NoDiskModVerb
+ dtl <Generating boot image to the drive %s ...>,a0
+ move.l sp,a1
+ call Printf
+ bsr FlushStdout
+NoDiskModVerb addq #4,sp
+ move.l d6,d1
+ moveq #OPEN_NEW,d0
+ move.l d2,a0
+ call ss,TrackBufHandle
+ move.l d0,a3
+ lea RawDiskWrite(pc),a0
+ move.l a0,bh_writefunc(a3)
+ mpop d1/a0 ;fssm_Flags,fssm_Device
+ pop d0 ;fssm_Unit
+ add.l a0,a0
+ add.l a0,a0
+ addq.l #1,a0
+ sub.l a1,a1
+ sub.l a2,a2
+ call TrackDevice
+ move.l d1,bh_handle(a3)
+ move.w #TD_FORMAT,IO_COMMAND(a1)
+ move.l d7,IO_OFFSET(a1)
+ lea _LVOBPutLong(a6),a1
+ moveq #(ImgResList-BootImage)>>2,d0
+ lsl.l #2,d0
+ lea BootImage(pc),a0
+ call BWrite
+ bsr.s GenerateEnd
+ move.l a0,d0
+ move.l d3,a0
+ sub.l a0,d0
+ moveq #512-(ImgResList-BootImage)-4,d3
+ sub.l d0,d3
+ call BWrite
+ lsr.l #2,d3
+FillBoot moveq #0,d0
+ call BPutLong
+ dbra d3,FillBoot
+ bsr.s ClosenCleanup
+
+;### Prepare handler to be resident ###
+PrepHandler pop a3 ;^ResList
+ get.l Arg_Reboot,d0
+ beq.s NoReboot
+ pea ImgRebootNow(pc)
+NoReboot tstv.l Arg_NoRun
+ bne Return
+ tst.l d0
+ bne.s WellReboot
+ pea AbsNextRes(pc)
+WellReboot geta AnyTrk,a0
+ moveq #2,d1
+KillMemTrks move.l (a0)+,d0
+ beq.s NoMemTrk
+ move.l d0,a1
+ clr.b trk_type(a1)
+NoMemTrk dbra d1,KillMemTrks
+ move.l 4.w,a6
+ lea KickMemPtr(a6),a2
+ MyFORBID
+ move.l (a2),-(a4) ;KickMemPtr
+ move.l a4,(a2)+
+ move.l (a2),d0 ;KickTagPtr
+ beq.s NoNextReses
+ bset.l #31,d0
+NoNextReses move.l d0,-(a4)
+ bra EndMainInit
+
+ ifd DEBUG
+EXIT jump ss,ExitCleanup
+ endc
+
+;################
+;### Routines ###
+;################
+
+GenerateEnd geta HunkBuf,a0
+ move.l a0,d3
+ move.l 4(sp),(a0)+
+ move.l a4,(a0)+
+ moveq #2,d7
+ geta AnyTrk,a2
+ push a3
+OutAddrLoop move.l (a2)+,d0
+ beq.s OutAddrNo
+ move.l d0,a3
+ move.l trk_ext(a3),(a0)+
+ move.l trk_data(a3),(a0)+
+OutAddrNo dbra d7,OutAddrLoop
+ pop a3
+ rts
+
+ClosenCleanup geta AnyTrk,a2
+ moveq #2,d7
+OutDataLoop move.l (a2)+,d0
+ beq.s OutNoTrk
+ move.l d0,a0
+ move.l trk_ext(a0),d0
+ subq.l #8,d0
+ move.l trk_data(a0),a0
+ addq #8,a0
+ call BWrite
+OutNoTrk dbra d7,OutDataLoop
+ btstv.b #VerbB_SizeMod,Arg_Verbose+3
+ beq.s NoModSizeVerb
+ move.l a3,a2
+ call BTell
+ move.l d0,d1
+ lsr.l #8,d1
+ addq.l #2,d1
+ lsr.l #2,d1
+ mpush d0/d1
+ move.l sp,a1
+ dtl.l < %lu bytes (%luKB)>,a0
+ call Printf
+ addq #8,sp
+NoModSizeVerb move.l a3,a0
+ jump FreeObject
+
+;Inputs: A2=Source A3=Destination
+ReadFiles tst.l (a2)
+ beq Return
+ move.l (v),a6
+ReadFilesRout move.l a3,a4 ;As ptr where to fill in DirSize
+ lea FC_FileSize(a2),a1
+ move.l (a1)+,d2
+ moveq #3,d1
+PutLongA rol.l #8,d2
+ move.b d2,(a3)+
+ dbra d1,PutLongA
+ addq #MLH_SIZE-MLH_TAIL,a1
+ move.b (a1)+,(a3)+
+ move.l a3,a0
+CopyReadName move.b (a1)+,(a3)+
+ bne.s CopyReadName
+ tst.b FC_ProtBits(a2) ;FileSize (-1 for dir)
+ bmi.s CopyDir
+ btstv.b #VerbB_LoadFiles,Arg_Verbose+3
+ beq.s SkipLoadInfo
+ push a0
+ move.l sp,a1
+ dtl <Loading data file %s ...',13,$9B,'K>,a0
+ call Printf
+ pop a0
+SkipLoadInfo moveq #OPEN_OLD,d0
+ call TrackOpen
+ move.l d1,a0 ;Copy tracker for ChkRead
+ move.l d2,d0 ;Prepare FileSize
+ move.l d1,d2 ;Copy tracker for FreeObject
+ move.l a3,a1 ;Get dest
+ add.l d0,a3 ;Add FileSize to dest
+ call ChkRead
+ move.l d2,a0
+ call FreeObject
+NextObject move.l (a2),a2
+ bra.s ReadFiles
+
+CopyDir call TestStack
+ moveq #ACCESS_READ,d0
+ call TrackLock
+ push d1
+ move.l d0,d1
+ call dos,CurrentDir
+ mpush d0/a2/a4
+ push a3
+ move.l d2,a2
+ bsr.s ReadFiles
+ ; a3/d0/a2/a4
+ mpop d0/d1/a2/a4
+ sub.l a3,d0
+ neg.l d0
+ moveq #3,d2
+PutLongB rol.l #8,d0
+ move.b d0,(a4)+
+ dbra d2,PutLongB ;DirSize filled
+
+ call dos,CurrentDir
+ pop a0
+ call ss,FreeObject
+ bra.s NextObject
+
+IsFile moveq #-1,d3 ;Do checksumming flag
+ geta Anchor+ap_Info+fib_Comment,a2
+ move.l a2,a1
+PreCommentLoop tst.b (a2)
+ beq.s CommentEnd
+ cmp.b #':',(a2)+
+ bne.s PreCommentLoop
+ clr.b -1(a2)
+ dtl <4ResRAM>,a0
+ bsr CompareString
+ tst.l d0
+ bne.s CommentEnd
+CommentSpcLoop cmp.b #' ',(a2)+
+ beq.s CommentSpcLoop
+ subq #1,a2
+ move.l a2,a0
+CommentEndLoop tst.b (a2)
+ beq.s CommentEndOK
+ cmp.b #'!',(a2)+
+ bne.s CommentEndLoop
+ clr.b -(a2)
+ moveq #0,d3 ;'!'=>No checksumming
+CommentEndOK tst.b (a0)
+ beq.s CommentEnd
+ dt FullExtTable,<Data>
+ dt PureCmdMsg,<ResCmd> ;RCT_Cmd
+ dt MinExtTable,<Library> ;RCT_Lib
+ dt <Device> ;RCT_Lib
+ dt.c <KickMod> ;RCT_KickMod
+ dt WordNull,<',0,'>
+ gett FullExtTable,a3
+ bsr.s GetExtNum
+ tst.b (a3)
+ beq.s CommentEnd
+ tst.l d5
+ beq MakeFile
+ subq.l #2,d5
+ bra.s ChecknCorrect
+
+GetExtNum move.l a0,a2
+ moveq #0,d5
+GetExtNumLoop move.l a3,a0
+ move.l a2,a1
+ bsr CompareString
+ tst.l d0
+ beq Return
+ addq.l #1,d5
+SkipExtName tst.b (a3)+
+ bne.s SkipExtName
+ tst.b (a3)
+ bne.s GetExtNumLoop
+ rts
+
+CommentEnd moveq #FIBF_PURE!FIBF_EXECUTE,d0
+ vand.b Anchor+ap_Info+fib_Protection+3,d0
+ moveq #RCT_Cmd,d5
+ gett PureCmdMsg,a3
+ cmp.b #FIBF_PURE,d0
+ beq.s CheckResident
+ geta Anchor+ap_Info+fib_FileName,a0
+ call ss,GetExtension
+ gett MinExtTable,a3
+ bsr.s GetExtNum
+ tst.b (a3)
+ beq MakeFile
+ tst.l d5
+ChecknCorrect shi d0
+ add.b d0,d5 ;Library=Device
+CheckResident geta Anchor+ap_Buf,a2
+ moveq #0,d1
+ bsr LinAlloc
+ move.l d0,a0
+CopyOpen move.b (a2)+,(a0)+
+ bne.s CopyOpen
+ move.l d0,d2
+ get.l Anchor+ap_Last,a0
+ move.l an_Lock(a0),d1
+ call dos,CurrentDir
+ geta Anchor+ap_Info+fib_FileName,a0
+ moveq #OPEN_OLD,d0
+ call ss,TrackOpen
+ push d1
+ move.l d1,a0
+ move.l d2,trk_ext(a0) ;Full PathName of the file
+ geta HunkBuf,a1
+ move.l a1,a2
+ moveq #20,d0
+ call ChkTryRead
+ moveq #20,d1
+ cmp.l d0,d1
+ bne TryHunksFail
+ cmp.l #HUNK_HEADER,(a2)+
+HeaderPtr equ *-4
+ bne TryHunksFail
+ tst.l (a2)+
+ bne TryHunksFail
+ tst.w (a2)
+ bne TryHunksFail
+ move.l (a2)+,d1
+ beq TryHunksFail
+ tst.l (a2)+
+ bne TryHunksFail
+ addq.l #1,(a2)
+ cmp.l (a2),d1
+ bne TryHunksFail
+ move.l d1,d4
+ lsl.l #2,d1
+ move.l d1,d2
+ addq.l #8,d1
+ addq.l #RC_SIZEOF-8,d1
+ bsr LinAllocInt
+ move.l d0,a1
+ geta ResList,a2
+ move.l (a2),(a1)+ ;RC_Next
+ move.w d5,(a1)+ ;RC_Type
+ move.l (sp),(a1)+ ;RC_Tracker
+ move.w d3,(a1)+ ;RC_CheckSummed
+ move.w d4,(a1)+ ;RC_Hunks
+ move.l d0,d3
+ move.l d2,d0
+ move.l (sp),a0
+ push a1
+ call ChkTryRead
+ pop a0
+ cmp.l d0,d2
+ bne TryHunksFail
+ moveq #8,d1 ;SegList+CheckSum
+ move.w d4,d2
+ subq.l #1,d4
+TestHunkFlg move.l (a0)+,d0
+ rol.l #2,d0
+ add.l d0,d1
+ and.w #3,d0
+ sub.l d0,d1
+ addq.l #8,d1
+ subq.l #3,d0
+ dbeq d4,TestHunkFlg
+ beq TryHunksFail
+ move.l d3,(a2)
+ btstv.b #VerbB_LoadSeg,Arg_Verbose+3
+ beq.s NoFileInfo
+ move.w d2,-(sp)
+ push d1
+ tst.b d7
+ bne.s HeaderWritten
+ bsr FileHeader
+HeaderWritten bsr.s WriteFileInfo
+ dtl <; LoadSeg=%lu; Hunks=%u>,a0
+ move.l sp,a1
+ call Printf
+ pop d0
+ vcmp.l Anchor+ap_Info+fib_Size,d0
+ bls.s LoadSegSqueeze
+ dtl <; Large BSS part!!!>,a0
+ call Puts
+LoadSegSqueeze addq #2,sp
+ bra.s DoMsgCR
+
+NoFileInfo tst.b d7
+ beq.s NoMsgCR
+ bsr.s WriteFileInfo
+DoMsgCR bsr.s WriteOutCR
+NoMsgCR tst.w d5
+ bpl.s NotCmdIsNoName
+ geta Anchor+ap_Info+fib_FileName,a0
+ move.l a0,d0
+TestResNameLen tst.b (a0)+
+ bne.s TestResNameLen
+ sub.l d0,a0
+ add.l a0,d6
+NotCmdIsNoName addq #4,sp ;Discard the file tracker
+ bra NextFile
+
+WriteOutCR gett WordNull,a0
+ jump PutsNL
+
+WriteFileInfo move.l a3,a0
+ call Puts
+ tst.l d3
+ bne.s HasChkSum
+ dtl < (don''t checksum)>,a0
+ call Puts
+HasChkSum dtl <; Size=%lu>,a0
+ geta Anchor+ap_Info+fib_Size,a1
+ jump Printf
+
+LinAlloc move.l a2,a0
+TestGlobLen tst.b (a0)+
+ bne.s TestGlobLen
+ sub.l a2,a0
+ add.l a0,d1
+LinAllocInt get.l LinPool,a0
+ jump ss,LinearAlloc ;1/3 may be LinearAllocN, but ...
+
+TryHunksFail pop a0
+ call FreeObject
+MakeFile tst.b d7
+ beq.s NoFileVerbose
+ moveq #-1,d3
+ gett FullExtTable,a3
+ bsr.s WriteFileInfo
+ bsr.s WriteOutCR
+NoFileVerbose bsr.s AllocateFC
+ get.l Anchor+ap_Info+fib_Size,(a1) ;FC_FileSize
+ add.l (a1),d6
+ bra NextFile
+
+AllocateFC geta Anchor+ap_Info+fib_FileName,a2
+ moveq #FC_SIZEOF,d1
+ bsr.s LinAlloc
+ move.l a4,a0
+ move.l d0,a1
+ lea FC_ProtBits(a1),a2
+ call exec,AddTail
+ lea FC_DirList-FC_ProtBits(a2),a1
+ move.l a2,d0
+ get.b Anchor+ap_Info+fib_Protection+3,(a2)+
+ geta Anchor+ap_Info+fib_FileName,a0
+CopyFileNameA move.b (a0)+,(a2)+
+ bne.s CopyFileNameA
+ sub.l d0,a2
+ add.l a2,d6
+ addq.l #RFC_ProtBits,d6
+ rts ;A1=FC_FileSize/FC_DirList
+
+WasDir tstv.b Anchor+ap_Info+fib_FileName
+ beq ClimbedUp
+ tstv.l Arg_EmptyDirs
+ bne.s ClimbUp
+ cmp.l LH_TAILPRED(a4),a4 ;Is list empty?
+ beq.s RemoveThatNode
+ClimbUp move.l a4,a0
+ lea DirItemCmp(pc),a1
+ call ss,SortList
+NoDirLength pop a4
+ geta Anchor+ap_Buf,a2
+ move.l a2,d1
+ call dos,FilePart
+ cmp.l d0,a2
+ bne.s LongerPath
+ clr.b (a2)
+ bra ClimbedUp
+
+LongerPath move.l d0,a0
+ clr.b -(a0)
+ bra ClimbedUp
+
+RemoveThatNode lea -FC_DirList(a4),a1
+ call exec,Remove
+ lea FC_FileName-FC_DirList(a4),a0
+DirNameLength tst.b (a0)+
+ bne.s DirNameLength
+ sub.l a4,a0
+ sub.l a0,d6
+ addq.l #FC_SIZEOF-FC_DirList-RFC_SIZEOF,d6
+ bra.s NoDirLength
+
+;Inputs: A1=FC_DirList
+InitDir move.l a1,a4
+ addq #4,a1
+ move.l a1,(a4)
+ clr.l (a1)+
+ move.l a4,(a1)+
+ bset.b #7,(a1)
+ rts
+
+;Inputs: A0=^^Node1 A1=^^Node2, Results: D0=-1/0/1 (Node1<=>Node2)
+DirItemCmp move.l (a0),a0
+ move.l (a1),a1
+ lea FC_ProtBits(a0),a0
+ lea FC_ProtBits(a1),a1
+ tst.b (a0)+
+ smi d0
+ tst.b (a1)+
+ smi d1
+ sub.b d1,d0
+ beq.s CompareString
+ bpl Return
+ moveq #-1,d0
+ rts
+
+CompareString push a6
+ call utility,Stricmp
+ pop a6
+ rts
+
+AllocMemTop moveq #0,d1
+AllocMemTopF addqv.w #1,MEntries
+ addq.l #8,d2
+ addq.l #MEM_BLOCKMASK,d2
+ and.w #~MEM_BLOCKMASK,d2
+ or.l #MEMF_PUBLIC!MEMF_REVERSE!MEMF_KICK,d1
+ mpush d1/a0/a1
+ bclrv.b #err_memory,sv_errsw+3
+ move.l d2,d0
+ call ss,TrackAllocMem
+ bsetv.b #err_memory,sv_errsw+3
+ tst.l d0
+ bne.s AllocMemTopE
+ move.l d2,d0
+ move.l (sp),d1
+ eor.w #MEMF_KICK!MEMF_LOCAL,d1
+ call TrackAllocMem
+AllocMemTopE addq #4,sp
+ mpop a0/a1
+ btstv.b #VerbB_Mem,Arg_Verbose+3
+ beq.s NoMemVerbose
+ push d1
+ mpush d0/d2
+ push a1
+ dt.c DetachMsg,<Detachable >
+ dt.l BlockMsg,<%s memory block allocated at $%08lx, size $%08lx>
+ move.l sp,a1
+ call Printf
+ addq #4,sp
+ mpop d0/d2
+ pop d1
+NoMemVerbose addq #8,d0
+ rts
+
+FlushStdout get.l stdout,d1
+ jump dos,Flush
+
+Cleanup get.l OldCurDir,d1
+ call dos,CurrentDir
+ get.l RootLock,d1
+ call UnLock
+ getad Anchor,a0,d1
+ call MatchEnd ;after CurrentDir!
+ tstv.l Arg_Verbose
+ beq.s C_NoVerb
+ dtl <',$9B,' p>,a0
+ call ss,Puts
+ bsr.s FlushStdout
+C_NoVerb get.l InhibitEnd,d0
+ beq Return
+ move.l d0,a0
+ move.b #':',(a0)
+ get.l Arg_GenDisk,d1
+ moveq #DOSFALSE,d2
+ jump Inhibit
+
+hunk_main tst.l d5
+ bne HunkError
+ move.l (a4,d4.l),d5
+ push d0
+ call BGetLong
+ move.l d5,a3
+ move.l -8(a3),d6
+ cmp.l #(HUNK_BSS-HUNK_NAME)<<17,(sp)+
+ beq.s DoBSS
+ lsl.l #2,d0
+ sub.l d0,d6
+ add.l d0,a3
+ move.l d5,a0
+ call BRead
+DoBSS lsr.l #2,d6
+ subq.l #2,d6
+ move.w d6,d0
+ swap d6
+ bra.s CPUClearInto
+CPUClearLoop clr.l (a3)+
+CPUClearInto dbra d0,CPUClearLoop
+ dbra d6,CPUClearLoop
+ rts
+
+hunk_end tst.l d5
+ beq HunkError
+ moveq #0,d5 ;No CurrHunk
+ addq.l #4,d4 ;HunkNum+=4
+ rts
+
+hunk_rrel16 moveq #-1,d0
+ bra.s HunkReloc
+hunk_rel16 moveq #1,d0
+ bra.s HunkReloc
+hunk_rel32 moveq #0,d0
+HunkReloc tst.l d5
+ beq.s HunkError
+ move.l d5,a3
+ move.l -8(a3),d6
+ subq.l #8,d6
+ move.l d0,d2 ;RelocType
+ lea _LVOBGetLong(a6),a1
+ beq.s MainRelocLoop
+ addq #6,a1
+MainRelocLoop jsr (a1)
+ tst.l d0
+ beq.s RelocDone
+ move.l d0,d2
+ jsr (a1)
+ lsl.l #2,d0
+ move.l (a4,d0.l),d3
+ bra.s RelocInto
+
+RelocLoop2 swap d2
+RelocLoop1 jsr (a1)
+ cmp.l d6,d0
+ bcc.s HunkError
+ lea (a3,d0.l),a0
+ tst.w d2
+ bpl.s NotRelRel
+ move.l a3,d0
+ sub.l d0,(a0)
+NotRelRel add.l d3,(a0)
+RelocInto dbra d2,RelocLoop1
+ swap d2
+ dbra d2,RelocLoop2
+ bra.s MainRelocLoop
+
+RelocDone call BTell
+ ror.b #2,d0
+ bcc Return
+ jump BGetWord
+
+hunk_symbol call BGetLong
+ tst.l d0
+ beq Return
+ addq.l #1,d0
+ bsr.s RelSeekLongs
+ bra.s hunk_symbol
+
+BadHunk tstv.b Advisory
+ beq.s HunkError
+hunk_skipcnt call BGetLong
+RelSeekLongs lsl.l #2,d0
+ jump BRelSeek
+
+HunkError moveq #err_read,d0
+ get.l EOFRegs+5*4,a0 ;A2=BufFH
+ move.l bh_name(a0),a1
+ReportSS jump ss,ReportError
+
+RawDiskWrite move.l bh_bufsize(a0),d1
+ cmp.l d1,d0
+ bcc.s RDW_Larger
+ move.l d1,d0
+RDW_Larger move.l a1,d1
+ mpush d0/d2/a2/a4
+ bset.b #0,bh_arg1+3(a0)
+ bne.s RDW_OtherWrite
+ move.w #255,d2
+ moveq #0,d0
+RDW_SumLoop add.l (a1)+,d0
+ bcc.s RDW_SkipX
+ addq.l #1,d0
+RDW_SkipX dbra d2,RDW_SumLoop
+ not.l d0
+ move.l d0,-1020(a1)
+RDW_OtherWrite move.l bh_handle(a0),a1 ;DeviceTracker
+ move.l trk_data(a1),a2 ;IoRequest
+ move.l d1,IO_DATA(a2) ;^Buffer
+ move.l (sp),IO_LENGTH(a2)
+ sub.l a0,a0
+ call ss,ChkDoIO
+ pop d0
+ add.l d0,IO_OFFSET(a2)
+ mpop d2/a2/a4
+ rts
+
+;### AbsModule header ###
+AbsModule ;D2=Position in file to seek/2
+AbsModFH equ AbsModule-16
+ ifd ModDebug
+ lea AbsDosName(pc),a1
+ call exec,OldOpenLibrary
+ move.l d0,d6
+ else
+ move.l GV_DosBase(a2),d6
+ endc
+ move.l AbsModFH(pc),d7
+ moveq #OFFSET_BEGINNING,d3
+ move.l d7,d1
+ lsl.l #2,d2
+ move.l d6,a6
+ call Seek
+ call IoErr
+ tst.l d0
+ bne.s AbsExitErr
+ lea AbsModTab(pc),a3
+ move.l sp,d5
+ clr.l -(sp)
+AbsAllocLoop move.l (a3)+,d0
+ beq.s AbsAllocEnd
+ move.l (a3)+,a1
+ move.l d0,d3
+ call exec,AllocAbs
+ move.l d6,a6
+ move.l d0,d2
+ beq.s AbsAllocFail
+ push d0
+ push d3
+ move.l d7,d1
+ addq #8,d2
+ subq #8,d3
+ call Read
+ cmp.l d0,d3
+ beq.s AbsAllocLoop
+AbsExitErrFree pop d0
+ beq.s AbsExitErr
+ pop a1
+ call exec,FreeMem
+ bra.s AbsExitErrFree
+
+AbsExitErr moveq #-1,d0
+ rts
+
+AbsAllocFail moveq #103,d1
+ call SetIoErr
+ bra.s AbsExitErrFree
+
+EndMainInit move.l a3,(a2)+
+ call SumKickData
+ move.l d0,(a2)
+ call Permit
+ jump CacheClearU
+
+AbsAllocEnd move.l d5,sp
+ move.l 4.w,a6
+ lea KickMemPtr(a6),a2
+ MyFORBID
+ move.l AbsKickSucc(pc),a0
+ move.l (a2),-(a0) ;KickMemPtr
+ move.l a0,(a2)+
+ move.l (a2),d0 ;KickTagPtr
+ beq.s AbsNoNextReses
+ bset.l #31,d0
+AbsNoNextReses move.l d0,-(a0)
+ move.l AbsResList(pc),a3
+ bsr.s EndMainInit
+
+AbsNextRes move.l (a3)+,d0
+ ble.s AbsNoNextRes
+ move.l d0,a2
+ move.l RT_NAME(a2),d2
+ move.l d2,a1
+ call FindResident
+ bsr.s AbsChkEnd
+ lea LibList(a6),a0
+ bsr.s AbsChkList
+ lea DeviceList(a6),a0
+ bsr.s AbsChkList
+ move.l a2,a1
+ moveq #0,d1
+ call InitResident
+ bra.s AbsNextRes
+
+AbsChkList move.l d2,a1
+ MyFORBID
+ call FindName
+ call Permit
+AbsChkEnd tst.l d0
+ beq.s AbsReturn
+ addq #4,sp
+ bra.s AbsNextRes
+
+AbsNoNextRes moveq #0,d0
+AbsReturn rts
+
+ ifd ModDebug
+AbsDosName dc.b 'dos.library',0
+ even
+ endc
+
+AbsResList equ *+(*-AbsModule)&2
+AbsKickSucc equ AbsResList+4
+AbsModTab equ AbsKickSucc+4
+
+AbsHdrLength equ (AbsResList-AbsModule+24)>>2
+AbsRawLength equ AbsResList-AbsModule
+
+;### BootBlock of the bootimage disk ###
+
+BootImage dc.l 'DOS'<<8,0,0
+ move.l a1,d4 ;IoRequest
+ move.w #CMD_READ,IO_COMMAND(a1)
+ move.l #1024,IO_OFFSET(a1)
+ lea ImgModTab(pc),a3
+ lea BootImage+512(pc),a4
+ lea BootImage+1024(pc),a5
+ move.l 4.w,a6
+ImgAllocLoop move.l (a3)+,d0
+ beq ImgAllocEnd
+ move.l (a3)+,a1
+ move.l a1,d2
+ move.l d0,d3
+ call AllocAbs
+ tst.l d0
+ beq.s ImgAllocFail
+ addq #8,d2
+ subq #8,d3
+ move.l a5,d0
+ sub.l a4,d0
+ cmp.l d0,d3
+ bcc.s ImgCopyBuf
+ move.l d3,d0
+ImgCopyBuf move.l a4,a0
+ add.l d0,a4
+ move.l d2,a1
+ add.l d0,d2
+ sub.l d0,d3
+ call CopyMemQuick
+ move.l d3,d7
+ and.w #~511,d3
+ eor.l d3,d7
+ bsr.s ImgReadDisk
+ cmp.l a4,a5
+ bne.s ImgAllocLoop
+ push d2
+ lea BootImage+512(pc),a4
+ move.l a4,d2
+ moveq #64,d3
+ lsl.l #3,d3 ;One sector
+ bsr.s ImgReadDisk
+ pop d2
+ move.l d2,a1
+ move.l a4,a0
+ add.l d7,a4
+ move.l d7,d0
+ call CopyMemQuick
+ bra.s ImgAllocLoop
+
+ImgReadDisk move.l d4,a1
+ move.l d2,IO_DATA(a1)
+ add.l d3,d2
+ move.l d3,IO_LENGTH(a1)
+ call DoIO
+ move.l d4,a1
+ move.l IO_OFFSET(a1),d1
+ add.l d3,IO_OFFSET(a1)
+ tst.l d0
+ beq ImgReturn
+ push d0
+ mpush d1/d3
+ lea ImgReadFailMsg(pc),a0
+ bra.s ImgDoAlert
+
+ImgAllocFail mpush d2/d3
+ lea ImgAllocFailMsg(pc),a0
+;A0=Printf-string, SP=Printf-data
+ImgDoAlert move.l sp,a1
+ lea -80(sp),sp
+ move.l sp,a3
+ lea ImgAlertHdr(pc),a2
+ImgAlertPrefix move.b (a2)+,(a3)+
+ bne.s ImgAlertPrefix
+ subq.l #1,a3
+ call RawDoFmt
+ move.l d0,a0
+ clr.b (a0)
+ sub.l sp,d0
+ moveq #82,d1
+ sub.l d0,d1
+ lsl.w #2,d1
+ move.w d0,-(sp)
+ lea ImgIntuiName(pc),a1
+ call OldOpenLibrary
+ move.l d0,a6
+ moveq #-1,d0
+ moveq #29,d1
+ move.l sp,a0
+ call DisplayAlert
+ move.l 4.w,a6
+ bra.s ImgRebootNow
+
+ImgAllocEnd lea KickMemPtr(a6),a2
+ move.l ImgKickSucc(pc),a0
+ MyFORBID
+ move.l (a2),-(a0) ;KickMemPtr
+ move.l a0,(a2)+
+ move.l (a2),d0 ;KickTagPtr
+ beq.s ImgNoNextReses
+ bset.l #31,d0
+ImgNoNextReses move.l d0,-(a0)
+ move.l ImgResList(pc),(a2)+
+ call SumKickData
+ move.l d0,(a2)
+ call CacheClearU
+ImgRebootNow jump ColdReboot
+
+ImgReadFailMsg dc.b 'Read(offs=%lu, len=%lu) error %ld!',0
+ImgAlertHdr dc.b 16,'ResRAM boot: ',0
+ImgPutChar move.b d0,(a3)+
+ clr.b (a3)
+ImgReturn rts
+
+ImgAllocFailMsg dc.b 'AllocAbs($%08lx,$%08lx) fail!',0
+ImgIntuiName dc.b 'intuition.library',0
+
+ImgResList equ *+(4-(*-BootImage)&3)&3
+ImgKickSucc equ ImgResList+4
+ImgModTab equ ImgKickSucc+4
+
+ ifgt ImgResList-BootImage+36-512
+ fail <Bootblock too big!>
+ endc
+
+;### Code, which will be copied to the resident memory ###
+lerr macro
+ moveq #255-ERROR_\1,d1
+ endm
+
+ResidentPart dc.l 16
+ResSegList dc.l 0
+
+Res move.l 4.w,a6
+ amsg <Entering handler''s code>
+ lea V(pc),v
+
+ move.l ThisTask(a6),a0
+ lea pr_MsgPort(a0),a0
+ move.l a0,(v) ;ProcPort
+
+ bsr GetPacketInt
+
+ lsl.l #2,d4
+ move.l d4,a0
+ move.l (v),dn_Task(a0)
+ moveq #-1,d0
+ moveq #0,d1
+ bsr ReplyInt
+
+ amsg <Startup packet replied>
+
+ lea DosName(pc),a1
+ call OldOpenLibrary
+ put.l d0,DOSbase
+ beq DoOpenDOSAlert ;ZF=1!
+ move.l d0,a6
+ get.l VolumeName,d1
+ moveq #DLT_VOLUME,d2
+ call MakeDosEntry
+ lea HInitFail1(pc),a3
+ bsr AlertD0Mem
+ move.l d0,a0
+ move.l d0,d1
+ lsr.l #2,d0
+ geta VolumeNode,a1
+ move.l d0,(a1)
+ addq #dl_Task,a0
+ move.l (v),(a0)
+ addq #dl_VolumeDate-dl_Task,a0
+ movem.l GDateStamp(v),d0/d2-d3
+ movem.l d0/d2-d3,(a0)
+ move.l -(a1),dl_DiskType-dl_VolumeDate(a0) ;id_DiskType
+ call AddDosEntry
+ bsr AlertD0
+ amsg <Volume node added>
+
+ get.l CmdsNames,a2
+ lea SkipCmdName(pc),a3 ;Okay, we may ignore it
+ geta FirstSegment,a4
+AddSegLoop move.l (a4),d2
+ beq.s OpenUtil
+ amsg <Adding one resident command>
+ addq #8,a4 ;Skip ResCmd checksum
+ move.l a2,d1
+ moveq #CMD_INTERNAL,d3
+ call AddSegment
+ bsr AlertD0
+SkipCmdName tst.b (a2)+
+ bne.s SkipCmdName
+ bra.s AddSegLoop
+
+OpenUtil lea UtilName(pc),a1
+ call exec,OldOpenLibrary
+ addq.l #AO_UtilityLib-AO_DOSLib,d7
+ lea HInitFail2(pc),a3 ;VolumeNode from DosList
+ bsr AlertD0
+ put.l d0,UTILITYbase
+
+MainLoop pea MainLoop(pc)
+ put.l sp,ErrSP
+ amsg <Calling GetPacket>
+ bsr.s GetPacket
+ amsg <Packet received>
+ lea FuncTable(pc),a2
+TableLoop move.w (a2)+,d7
+ move.w (a2)+,d0
+ beq.s NotInTable
+ ext.l d0
+ cmp.l d0,d1
+ bne.s TableLoop
+ amsg <Packet is known>
+NotInTable jmp (a2,d7.w)
+
+;Returns: D0/A1=ExecMsg, A2=DosPacket, D1=dp_Type, D2-D4=dp_Arg[1-3]
+GetLoop move.l (v),a0
+ call WaitPort
+GetPacket move.l (v),a0
+GetPacketInt call GetMsg
+ tst.l d0
+ beq.s GetLoop
+ move.l d0,a0
+ move.l LN_NAME(a0),a0
+ move.l dp_Type(a0),d1
+ movem.l dp_Arg1(a0),d2-d4
+ put.l a0,CurrPacket
+ rts
+
+;---------------
+F_INFO ;(lock,info):bool
+ ifd DEBUGX
+ amsg <INFO(>,0
+ bsr PrintLockName
+ amsg <)>
+ endc
+ move.l d3,d2
+;---------------
+F_DISK_INFO ;(info):bool
+ amsg <DISK_INFO>
+ lsl.l #2,d2
+ move.l d2,a0
+ movem.l MyInfoData(v),d0-d7/a1
+ movem.l d0-d7/a1,(a0)
+;---------------
+F_IS_FILESYSTEM ;():bool
+ amsg <IS_FILESYSTEM>
+ReplyF0 moveq #-1,d0
+ReplyX0 moveq #0,d1
+;---------------
+ReplyPacket mpush d0/d1
+ move.l sp,a1
+ amsg <Packet value: $%08lx, $%08lx>
+ get.l ErrSP,sp
+ReplyInt amsg <Replying packet>
+ get.l CurrPacket,a2
+ move.l (a2),a1 ;dp_Link (ExecMsg)
+ReplyDie move.l d0,dp_Res1(a2)
+ move.l d1,dp_Res2(a2)
+ move.l dp_Port(a2),a0 ;Port for replying
+ move.l (v),dp_Port(a2)
+ jump PutMsg
+;---------------
+F_CURRENT_VOLUME ;(arg1):volume
+ ifd DEBUGX
+ amsg <CURRENT_VOLUME(>,0
+ bsr PrintLockName
+ amsg <)>
+ endc
+ get.l VolumeNode,d0
+ bra.s ReplyX0
+;---------------
+F_SAME_LOCK ;(lock1,lock2):bool
+ ifd DEBUGX
+ amsg <SAME_LOCK(>,0
+ bsr PrintLockName
+ amsg <,>,0
+ move.l d3,a0
+ bsr PrintLockNameX
+ amsg <)>
+ endc
+ lsl.l #2,d2
+ move.l d2,a0
+ move.l fl_Key(a0),d0
+ lsl.l #2,d3
+ move.l d3,a0
+ cmp.l fl_Key(a0),d0
+ beq.s ReplyF0
+Reply00 moveq #0,d0
+ bra.s ReplyX0
+;---------------
+F_NIL
+ ifd DEBUGX
+ move.w d1,-(sp)
+ move.l sp,a1
+ amsg <ERROR_ACTION_NOT_KNOWN: #%d>
+ addq #2,sp
+ endc
+ lerr ACTION_NOT_KNOWN
+Reply0XN not.b d1
+Reply0X moveq #0,d0
+ bra.s ReplyPacket
+;---------------
+F_FINDOUTPUT ;(fh,lock,name):bool
+F_DELETE_OBJECT ;(lock,name):bool
+F_CREATE_DIR ;(lock,name):lock
+F_SET_PROTECT ;(,lock,name,mask):bool
+F_SET_COMMENT ;(,lock,name,comment):bool
+F_RENAME_OBJECT ;(slock,sname,dlock,dname):bool
+F_RENAME_DISK ;(name):bool
+F_SET_DATE ;(,lock,name,stamp):bool
+F_SET_OWNER ;(,,lock,userinf):bool
+F_MAKE_LINK ;(lock,name,dest!#,soft):bool
+ lerr DISK_WRITE_PROTECTED
+ bra.s Reply0XN
+;---------------
+F_FINDUPDATE ;(fh,lock,name):bool
+ moveq #-1,d6
+ bra.s FindUpdateJmp
+;---------------
+F_FINDINPUT ;(fh,lock,name):bool
+ amsg <FINDINPUT>
+ moveq #0,d6
+FindUpdateJmp push d2
+ move.l d3,d2
+ move.l d4,d3
+ bsr.s LocateMain
+ pop a1
+JumpFhFromLock ;D0=arg1 A1=fh, A0=^DiskObject
+ tst.b RFC_ProtBits(a0)
+ bpl.s FindInputFile
+ move.l d0,d2
+ bsr.s FreeLockMain
+ObjWrongType lerr OBJECT_WRONG_TYPE
+ bra.s Reply0XN
+
+FindInputFile add.l a1,a1
+ add.l a1,a1
+ clr.l fh_Interactive(a1)
+ move.l d0,fh_Arg1(a1)
+ bra.s ReplyF0
+;---------------
+F_FREE_LOCK ;(lock):bool
+ amsg <FREE_LOCK>
+F_END ;(arg1):bool
+ ifd DEBUGX
+ amsg <END(>,0
+ bsr PrintLockName
+ amsg <)>
+ endc
+ pea ReplyF0(pc)
+;---------------
+FreeLockMain subqv.l #1,NumLocks
+ lsl.l #2,d2
+ move.l d2,a1
+ jump FreeVec
+;---------------
+F_LOCATE_OBJECT ;(lock,name,mode):lock
+ amsg <LOCATE_OBJECT>
+ lerr OBJECT_IN_USE
+ addq.l #-ACCESS_READ,d4
+ bne.s Reply0XN
+ pea ReplyX0(pc)
+;---------------
+;Inputs: D2=^Lock D3=Name D6=FindUpdate?
+LocateMainNoUpd moveq #0,d6
+LocateMain
+ ifd DEBUGX
+ amsg <LocateMain(>,0
+ bsr PrintLockName
+ move.l d3,a0
+ add.l a0,a0
+ add.l a0,a0
+ moveq #0,d0
+ move.b (a0)+,d0
+ lea -30(sp),sp
+ move.l sp,a1
+ bra.s CopyDbgInto
+CopyDbgLoop move.b (a0)+,(a1)+
+CopyDbgInto dbra d0,CopyDbgLoop
+ clr.b (a1)
+ push sp
+ move.l sp,a1
+ amsg <,%s)>
+ lea 34(sp),sp
+ endc
+
+ lsl.l #2,d3
+ move.l d3,a1
+ moveq #0,d3
+ move.b (a1)+,d3
+
+ move.l a1,a0
+ move.w d3,d0
+ bra.s ColInto
+ColLoop cmp.b #':',(a0)+
+ColInto dbeq d0,ColLoop
+ bne.s ColSkip
+ move.l a0,a1
+ move.w d0,d3
+ColSkip
+ get.l RootPtr,a0
+ lsl.l #2,d2
+ beq.s LockInRoot
+ amsg <Lock in UserDir>
+ move.l d2,a2
+ move.l fl_Key(a2),a0
+LockInRoot tst.b RFC_ProtBits(a0)
+ bpl.s ObjWrongType ;Given lock is to file
+
+NextComponent amsg <NextComponent:>
+ moveq #108,d4 ;Name buffer size
+ geta NameBuffer,a2
+ move.l a2,a4
+ lerr INVALID_COMPONENT_NAME
+ bra.s NameLoopInto
+
+NameLoop move.b (a1)+,d5
+ cmp.b #'/',d5
+ beq.s SlashFound
+ subq.l #1,d4
+ beq Reply0XN
+ move.b d5,(a2)+
+NameLoopInto dbra d3,NameLoop
+ amsg <End of FilePath reached>
+ cmp.l a2,a4
+ beq.s LockInternal
+ amsg <Locking file in CurrDir>
+ bsr.s FindDirItem
+ amsg <FindDirItem returned>
+;---------------
+;Inputs: A0=^Object, Results: D0=Lock (BPTR)
+LockInternal mpush d1/a0-a1
+ ifd DEBUGX
+ amsg <LockInternal(>,0
+ push a2
+ bsr PrintObjName
+ pop a2
+ amsg <)>
+ endc
+ moveq #fl_SIZEOF,d0
+ moveq #MEMF_PUBLIC,d1
+ call AllocVec
+ moveq #ERROR_NO_FREE_STORE,d1
+ tst.l d0
+ beq Reply0X
+ addqv.l #1,NumLocks
+ move.l d0,a0
+ clr.l (a0)+ ;fl_Link
+ move.l 4(sp),(a0)+ ;fl_Key
+ moveq #ACCESS_READ,d1
+ move.l d1,(a0)+ ;fl_Access
+ move.l (v),(a0)+ ;fl_Task
+ get.l VolumeNode,(a0) ;VolumeNode->fl_Volume
+ lsr.l #2,d0
+ mpop d1/a0-a1
+ amsg <LockInternal end>
+ rts
+;---------------
+;End>Empty>Lock CurrDir (A0)
+; Else >Lock FileName in CurrDir
+;/ >Empty>Parent of CurrDir->A0
+; Else >Find FileName in CurrDir->A0 (must be DIR)
+
+SlashFound amsg <SlashFound:>
+ cmp.l a2,a4
+ bne.s NoParent
+ amsg <Getting Parent>
+ bsr.s GetEntryParent
+ beq.s ObjNotFound
+ amsg <GetEntryParent returned>
+ bra.s NextComponent
+
+NoParent amsg <Switching to sub-directory>
+ bsr.s FindDirItem
+ amsg <FindDirItem returned>
+ bra.s LockInRoot
+
+;---------------
+;Inputs: A2=^End of filename A4=^NameBuffer A0=CurrDir D6=FindUpdate?
+;Results: D0/A0=^DirEntry D5=Size A4=LastDir, Destroys: D2/D4
+FindDirItem clr.b (a2)
+ ifd DEBUGX
+ mpush a0-a2
+ push a4
+ move.l sp,a1
+ amsg <FindDirItem(%s,>,0
+ addq #4,sp
+ bsr PrintObjName
+ amsg <)>
+ mpop a0-a2
+ endc
+ moveq #3,d2
+GetLongC lsl.l #8,d5
+ move.b (a0)+,d5
+ dbra d2,GetLongC
+ tst.b (a0)+ ;RFC_ProtBits
+ bpl ObjWrongType
+SkipNameB tst.b (a0)+
+ bne.s SkipNameB
+ move.l d5,d4
+ add.l a0,d4
+
+FindFileLoop cmp.l d4,a0 ;D4=Address after current dir
+ bcs.s StillInDir
+ lerr DISK_WRITE_PROTECTED
+ tst.l d6
+ bne Reply0XN
+ObjNotFound lerr OBJECT_NOT_FOUND
+ bra Reply0XN
+
+StillInDir move.l a0,d0
+ moveq #3,d2
+GetLongA lsl.l #8,d5
+ move.b (a0)+,d5
+ dbra d2,GetLongA
+ addq #RFC_FileName-RFC_ProtBits,a0
+ mpush d0-d1/a0-a1/a6
+ move.l a4,a1
+ call UTILITY,Stricmp
+ move.l d0,d2
+ mpop d0-d1/a0-a1/a6
+SkipNameC tst.b (a0)+
+ bne.s SkipNameC
+ add.l d5,a0
+ tst.l d2
+ bne.s FindFileLoop
+ move.l d0,a0
+ rts
+;---------------
+;Inputs: A0=^Entry, Results: A0=^Parent entry, ZF=EQ if no parent
+GetEntryParent mpush d0-d2/a1-a2
+ get.l RootPtr,a2
+ sub.l a1,a1 ;Parent of Root is 0
+NextEntry amsg <NextEntry:>
+ cmp.l a0,a2
+ beq.s ParentReturn
+ move.l a2,d2
+ moveq #3,d0
+GetLongB lsl.l #8,d1
+ move.b (a2)+,d1
+ dbra d0,GetLongB
+ move.b (a2)+,d0 ;RFC_ProtBits
+ReachEndName tst.b (a2)+
+ bne.s ReachEndName
+ amsg <Name skipped>
+ add.l d1,a2
+ tst.b d0
+ bpl.s NextEntry
+ amsg <Obj is directory>
+ cmp.l a2,a0
+ bcc.s NextEntry
+ amsg <Walking into...>
+ sub.l d1,a2
+ move.l d2,a1 ;Current is parent
+ bra.s NextEntry
+
+ParentReturn amsg <ParentReturn:>
+ move.l a1,a0
+ move.l a0,d0
+ mpop d0-d2/a1-a2
+ rts
+;---------------
+F_FH_FROM_LOCK ;(fh,lock):bool
+ amsg <FH_FROM_LOCK>
+ exg d2,d3
+F_PARENT_FH ;(arg1):lock
+ amsg <PARENT_FH>
+F_PARENT ;(lock):lock
+ amsg <PARENT>
+F_COPY_DIR_FH ;(arg1):lock
+ amsg <COPY_DIR_FH>
+F_COPY_DIR ;(lock):lock
+ ifd DEBUGX
+ amsg <COPY_DIR(>,0
+ bsr PrintLockName
+ amsg <)>
+ endc
+ lsl.l #2,d2
+ move.l d2,a0
+ move.l fl_Key(a0),a0
+ move.w d1,d0
+ lsl.w #2,d0
+ and.w d1,d0
+ beq.s DoCopyDir ;COPY_DIR(|_FH)
+ amsg <Getting parent of the lock> ;PARENT(|_FH)
+ bsr.s GetEntryParent
+ beq Reply00
+ amsg <GetEntryParent returned>
+DoCopyDir bsr LockInternal
+ amsg <PARENT/COPY_DIR locked>
+ cmp.w #ACTION_FH_FROM_LOCK,d1
+ bne ReplyX0
+ move.l d3,a1
+ bra JumpFhFromLock
+;---------------
+F_SEEK ;(arg1,pos,mode):oldpos/-1
+ amsg <SEEK>
+F_READ ;(arg1,&buf,len):len/-1
+ ifd DEBUGX
+ amsg <READ(>,0
+ bsr PrintLockName
+ amsg <)>
+ endc
+ lsl.l #2,d2
+ move.l d2,a1
+ move.l (a1)+,d5 ;fl_Link - Current position
+ move.l (a1),a0 ;fl_Key
+ moveq #3,d2
+GetLongD lsl.l #8,d0
+ move.b (a0)+,d0
+ dbra d2,GetLongD
+ tst.b (a0)+ ;RFC_ProtBits
+ bpl.s ObjIsFile
+ amsg <Wrong type!>
+ lerr OBJECT_WRONG_TYPE
+ReplyFXN not.b d1
+ReplyFX moveq #-1,d0
+ bra ReplyPacket
+;---------------
+F_WRITE ;(arg1,&buf,len):len
+ lerr DISK_WRITE_PROTECTED
+ bra.s ReplyFXN
+;---------------
+ObjIsFile cmp.w #ACTION_SEEK,d1
+ beq.s ActionIsSeek
+ sub.l d5,d0 ;D0=Remaining bytes
+SkipNameA tst.b (a0)+
+ bne.s SkipNameA
+ add.l d5,a0 ;a0=^1st byte for copy
+ cmp.l d0,d4
+ bcc.s DoReadFile
+ amsg <Read in range>
+ move.l d4,d0
+DoReadFile add.l d0,-(a1)
+ move.l d0,d2
+ move.l d3,a1
+ call CopyMem
+ amsg <Copied>
+ move.l d2,d0
+ bra ReplyX0
+
+ActionIsSeek lerr SEEK_ERROR
+ addq.l #1,d4
+ beq.s SeekDone ;OFFSET_BEGINNING=-1
+ subq.l #1,d4
+ beq.s SeekCurrent ;OFFSET_CURRENT=0
+ subq.l #1,d4
+ bne.s ReplyFXN ;OFFSET_END=1
+ amsg <offset_end>
+ add.l d0,d3 ;End-of-File
+SeekDone cmp.l d3,d0
+ bcs.s ReplyFXN
+ move.l -(a1),d0 ;Old position
+ move.l d3,(a1) ;fl_Link
+ bra ReplyX0
+
+SeekCurrent amsg <SeekCurrent:>
+ add.l d5,d3 ;fl_Link
+ bra.s SeekDone
+;---------------
+F_EXAMINE_FH ;(arg1,fib):bool
+ amsg <EXAMINE_FH>
+F_EXAMINE_OBJECT ;(lock,fib):bool
+ amsg <EXAMINE_OBJECT>
+F_EXAMINE_NEXT ;(lock,fib):bool
+ ifd DEBUGX
+ amsg <EXAMINE_NEXT(>,0
+ bsr PrintLockName
+ amsg <)>
+ endc
+ lsl.l #2,d2
+ move.l d2,a0
+ lsl.l #2,d3
+ move.l d3,a1
+ move.l fl_Key(a0),a2
+ pea ReplyF0(pc)
+ cmp.w #ACTION_EXAMINE_NEXT,d1
+ bne.s ExamineMain
+ lerr NO_MORE_ENTRIES
+ move.l (a1),d3 ;fib_DiskKey
+ beq Reply0XN ;ExNext without Examine
+ moveq #3,d2
+GetLongF lsl.l #8,d0
+ move.b (a2)+,d0
+ dbra d2,GetLongF
+ tst.b (a2)+ ;RFC_ProtBits
+ bpl ObjWrongType
+SkipNameD tst.b (a2)+
+ bne.s SkipNameD
+ add.l a2,d0 ;D0=End of this directory
+ cmp.l fl_Key(a0),d3
+ beq.s FirstEntryIn ;A2=Entry to process
+ move.l d3,a2
+ moveq #3,d2
+GetLongG lsl.l #8,d3
+ move.b (a2)+,d3
+ dbra d2,GetLongG
+ addq #RFC_FileName-RFC_ProtBits,a2
+SkipNameE tst.b (a2)+
+ bne.s SkipNameE
+ add.l d3,a2
+FirstEntryIn cmp.l a2,d0
+ beq Reply0XN ;No more entries
+
+;Inputs: A2=^DirEntry A1=^FileInfoBlock
+ExamineMain move.l a2,(a1)+ ;fib_DiskKey
+ moveq #3,d1
+GetLongE lsl.l #8,d0
+ move.b (a2)+,d0
+ dbra d1,GetLongE
+ moveq #ST_FILE,d1
+ moveq #0,d2
+ move.b (a2)+,d2
+ move.l d0,d4
+ subq.l #1,d4
+ asr.l #8,d4
+ asr.l #1,d4
+ addq.l #1,d4
+ bclr.l #7,d2
+ beq.s EntryTypeDone
+ moveq #0,d0 ;Size of directory is zero...
+ moveq #1,d4 ;... but the block size is 1 <- Magic
+ moveq #ST_USERDIR,d1
+ tst.b (a2)
+ bne.s EntryTypeDone
+ moveq #ST_ROOT,d1
+ get.l VolumeName,a2
+EntryTypeDone move.l d1,(a1)+ ;fib_DirEntryType
+ lea fib_Protection-fib_FileName(a1),a3
+ move.l a2,d3
+TestNameLength tst.b (a2)+
+ bne.s TestNameLength
+ sub.l d3,a2
+ exg d3,a2
+ move.b d3,(a1)+
+CopyFileNameB move.b (a2)+,(a1)+ ;RFC_FileName->fib_FileName
+ bne.s CopyFileNameB
+ move.l d2,(a3)+ ;fib_Protection /vvv-MORE MAGIC!!!
+ move.l d1,(a3)+ ;fib_EntryType (=fib_DirEntryType???)
+ move.l d0,(a3)+ ;fib_Size
+ move.l d4,(a3)+ ;fib_NumBlocks
+ geta GDateStamp,a0
+ move.l (a0)+,(a3)+ ;GDateStamp->fib_DateStamp
+ move.l (a0)+,(a3)+
+ move.l (a0),(a3)+
+ clr.b (a3) ;fib_Comment
+ bra ReplyF0
+;---------------
+F_DIE ;():bool
+ amsg <DIE>
+ lerr OBJECT_IN_USE
+ tstv.l NumLocks
+ bne Reply0XN
+ amsg <Replying the DIE packet to my killer>
+ moveq #-1,d0
+ moveq #0,d1
+ bsr ReplyInt
+ amsg <Death packet replied, closing UtilLib>
+ get.l UTILITYbase,a1
+ call exec,CloseLibrary
+HInitFail2 moveq #LDF_VOLUMES!LDF_WRITE,d1
+ call DOS,LockDosList
+ amsg <LockDosList OK>
+ get.l VolumeNode,d2
+ lsl.l #2,d2
+ move.l d2,d1
+ amsg <Calling RemDosEntry>
+ call RemDosEntry
+ amsg <VolumeNode removed>
+ moveq #LDF_VOLUMES!LDF_WRITE,d1
+ call UnLockDosList
+ amsg <DosList freed>
+HInitFail1 amsg <Forbidding>
+ MyFORBID exec
+ amsg <DieResMod regs load>
+ get.l ResListPtr,a2
+ move.l (a2),d1
+ moveq #31,d2
+ move.l ResModules(a6),d0
+ beq.s DieResModEnd
+DieResModChunk amsg <DieResModChunk:>
+ move.l d0,a0
+DieResModLoop amsg <DieResModLoop:>
+ move.l (a0),d0
+ beq.s DieResModEnd
+ amsg <Some entry>
+ bclr.l d2,d0
+ bne.s DieResModChunk
+ amsg <Resident pointer>
+ cmp.l (a0)+,d1
+ bne.s DieResModLoop
+ amsg <Resident is mine>
+ move.l a0,d0
+ bset.l d2,d0
+ move.l d0,-(a0)
+DieResModEnd amsg <DieTag regs load>
+ get.l ResListSucc,a1
+ lea KickTagPtr(a6),a0
+ move.l (a0)+,d0
+ bne.s DieTagInto
+ amsg <Empty KickTagPtr>
+DieTagNotFound amsg <DieTagNotFound:>
+ and.w #$7FFF,KickTagPtr(a6)
+ addq #4,a1
+ lea KickMemPtr(a6),a0
+DieMemLoop amsg <DieMemLoop:>
+ move.l (a0),d0 ;LN_SUCC
+ beq.s DieSumKick
+ cmp.l d0,a1
+ beq.s DieMemFound
+ move.l d0,a0
+ bra.s DieMemLoop
+
+DieTagFound amsg <DieTagFound:>
+ move.l (a1),-(a0)
+ bra.s DieTagNotFound
+
+DieTagLoop amsg <DieTagLoop:>
+ move.l (a0)+,d0
+ beq.s DieTagNotFound
+ bpl.s DieTagLoop
+ bclr.l d2,d0
+DieTagInto amsg <DieTagInto:>
+ cmp.l d0,a2
+ beq.s DieTagFound
+ move.l d0,a0
+ bra.s DieTagLoop
+
+DieMemFound amsg <DieMemFound:>
+ move.l (a1),(a0)
+DieSumKick call SumKickData
+ move.l d0,KickCheckSum(a6)
+ call CacheClearU
+ amsg <KickCheckSum rewritten>
+DiePortLoop amsg <DiePortLoop:>
+ move.l (v),a0
+ call GetMsg
+ tst.l d0
+ beq.s DiePortOK
+ amsg <Some packet got>
+ move.l d0,a1 ;ExecMsg
+ move.l LN_NAME(a1),a2 ;DosPacket
+ moveq #0,d0
+ lerr OBJECT_IN_USE
+ not.b d1
+ amsg <Replying...>
+ bsr ReplyDie
+ amsg <ReplyDie returned>
+ bra.s DiePortLoop
+
+DiePortOK amsg <DiePortOK:>
+ get.l DevNode,a0
+ clr.l dn_Task(a0)
+ clr.l dn_SegList(a0)
+ amsg <dn_(Task|SegList) cleared>
+ call Permit
+ amsg <Permit succeeded>
+ get.l VolumeNode,d1
+ lsl.l #2,d1
+ call DOS,FreeDosEntry
+ amsg <VolumeNode deallocated>
+ move.l a6,a1
+ call exec,CloseLibrary
+ amsg <DosLib closed>
+ get.l ErrSP,sp
+ addq #4,sp
+ amsg <The Final Forbid>
+ MyFORBID
+ get.l RootPtr,a0
+ move.l -(a0),d0 ;ME_LENGTH
+ move.l -(a0),a1 ;ME_ADDR
+ amsg <Calling FreeMem for myself>
+ call FreeMem
+ amsg <Running in non-allocated memory!>
+ moveq #0,d0
+ amsg <Final RTS... shutting down....>
+ rts
+
+;---------------
+func macro ;Function
+ dc.w F_\1-*-4,ACTION_\1
+ endm
+FuncTable
+; ACTION_#? ;Arg1 Arg2 Arg3 Res1
+; --------------------------------------------
+; STARTUP ;? startup devnode bool
+ func FINDINPUT ;fh lock name bool
+ func FINDUPDATE ;fh lock name bool
+ func READ ;arg1 &buf len len
+ func END ;arg1 bool
+ func SEEK ;arg1 pos mode oldpos
+ func EXAMINE_NEXT ;lock fib bool
+ func EXAMINE_OBJECT ;lock fib bool
+ func INFO ;lock info bool
+ func DISK_INFO ;info bool
+ func PARENT ;lock lock
+ func LOCATE_OBJECT ;lock name mode lock
+ func COPY_DIR ;lock lock
+ func FREE_LOCK ;lock bool
+ func CURRENT_VOLUME ;arg1 volume
+ func SAME_LOCK ;lock1 lock2 bool
+ func IS_FILESYSTEM ; bool
+ func FH_FROM_LOCK ;fh lock bool
+ func PARENT_FH ;arg1 lock
+ func EXAMINE_FH ;arg1 fib bool
+ func COPY_DIR_FH ;arg1 lock
+;Write-protected functions
+ func WRITE ;arg1 &buf len len
+ func FINDOUTPUT ;fh lock name bool
+ func DELETE_OBJECT ;lock name bool
+ func CREATE_DIR ;lock name lock
+ func SET_PROTECT ; lock name mask bool
+ func SET_COMMENT ; lock name comment bool
+ func RENAME_OBJECT ;slock sname dlock dname bool
+ func RENAME_DISK ;name bool
+ func SET_DATE ; lock name stamp bool
+ func SET_OWNER ; lock userinf bool
+ func MAKE_LINK ;lock name dest!# soft bool
+
+ func DIE ; bool
+ func NIL ;End-of-table mark
+
+;A0=Module with the checksum error
+SumError mpush a0/a6
+ lea ResIntuiName(pc),a1
+ call exec,OldOpenLibrary
+ move.l #AT_DeadEnd!AG_OpenLib!AO_Intuition,d7
+ bsr AlertD0
+ move.l d0,a6
+ move.l (sp),a0
+ link a2,#-$100
+ lea -252(sp),sp
+ move.l sp,a1
+SumErrLoop1 move.b (a0)+,(a1)+
+ bne.s SumErrLoop1
+ moveq #53,d0
+ add.l sp,d0
+ sub.l a1,d0
+ lsl.b #2,d0
+ clr.b (a1)
+ moveq #(SumErrMsgEnd-SumErrMsg)>>2-1,d1
+ lea SumErrMsgEnd(pc),a0
+SumErrLoop2 push -(a0)
+ dbra d1,SumErrLoop2
+ move.b d0,SumErrCenter-SumErrMsg(sp)
+ move.l sp,a0
+ moveq #0,d0 ;Recovery
+ moveq #61,d1
+ call DisplayAlert
+ tst.l d0
+ beq.s UserReboot
+ unlk a2
+ mpop a0/a6
+ rts
+
+UserReboot move.l 4.w,a6
+ not.l ChkBase(a6)
+ call CacheClearU
+ jump ColdReboot
+
+ResInit mpush d6/d7/a2/a3/a6
+ ifd DEBUGX
+ call RawIOInit
+ endc
+ amsg <ResidentInit started>
+
+ move.l ResListSucc+V(pc),a0
+ move.l (a0)+,d0 ;ResListSucc
+ add.l (a0),d0 ;KickMemSucc
+ lea ResidentPart-2-RT_SIZE(pc),a1
+ move.w #(RT_SIZE+2+ResidentCode)>>2-1,d1
+ResSumLoop sub.l (a1)+,d0
+ dbra d1,ResSumLoop
+ move.l RootPtr+V(pc),a0
+ move.l -(a0),d1 ;ME_LENGTH
+ add.l -(a0),d1 ;ME_ADDR
+ lea AnySum+V(pc),a1
+ clr.l VolumeNode-AnySum(a1)
+ clr.l NumLocks-AnySum(a1)
+ResSumLoopE sub.l (a1)+,d0
+ cmp.l a1,d1
+ bne.s ResSumLoopE
+ tst.l d0
+ beq.s ResSumOkay
+ lea ResName(pc),a0
+ bsr SumError
+
+ResSumOkay amsg <ResRAM checksumming passed, checksumming ResCmds...>
+ lea FirstSegment+V(pc),a2
+ move.l CmdsNames+V(pc),a0
+CmdSumsLoop move.l (a2)+,d0
+ beq.s CmdSumsDone
+ bsr.s SumModInit
+SkipResCmdName tst.b (a0)+
+ bne.s SkipResCmdName
+ bra.s CmdSumsLoop
+
+SumModInit
+ ifd DEBUGX
+ push a0
+ move.l sp,a1
+ amsg <CheckSumming module "%s">
+ addq #4,sp
+ endc
+ moveq #0,d7
+ tst.l (a2)
+ beq.s SumIncRet
+ amsg <This ResModule HAS checksum>
+SumOneModule lsl.l #2,d0
+ move.l d0,a1
+ move.l (a1)+,d0
+ move.l -8(a1),d1
+ lsr.l #2,d1
+ subq.l #3,d1
+ bmi.s SumOneHunkEnd
+ move.w d1,d6
+ swap d1
+SumOneHunkLoop add.l (a1)+,d7
+ dbra d6,SumOneHunkLoop
+ dbra d1,SumOneHunkLoop
+SumOneHunkEnd tst.l d0
+ bne.s SumOneModule
+ tst.l d7
+ seq d1
+ sub.b d1,d7
+SumIncRet cmp.l (a2)+,d7
+ bne SumError
+ amsg <CheckSum okay!>
+ rts
+
+CmdSumsDone amsg <Checksumming libraries and kickmods...>
+ move.l ResListPtr+V(pc),a3
+ addq #4,a3 ;Skip ^MyResident struct
+ResSumsLoop move.l (a3)+,d0
+ ble.s ResSumsDone
+ move.l d0,a0
+ move.l RT_NAME(a0),a0
+ move.l (a2)+,d0
+ bsr.s SumModInit
+ bra.s ResSumsLoop
+
+ResSumsDone amsg <All checksums done!>
+ move.l DosHName+V(pc),a2
+ moveq #0,d0
+ move.b (a2),d0
+ addq.l #2,d0
+ moveq #MEMF_PUBLIC,d1
+ call AllocVec
+ lea ResInitFail(pc),a3
+ bsr AlertD0Mem
+ amsg <DosHandler name allocated>
+ move.l d0,a0
+ move.l d0,d6
+ moveq #0,d0
+ move.b (a2),d0
+DosNCopy move.b (a2)+,(a0)+
+ clr.b (a0)
+ dbra d0,DosNCopy
+ amsg <DosHandler name copied>
+
+ moveq #(DeviceNode_SIZEOF+FileSysStartupMsg_SIZEOF+de_Baud+1+DeviceNameEnd-DeviceName)>>1,d0
+ lsl.l #1,d0
+ move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
+ call AllocVec
+ bsr AlertD0
+ amsg <DeviceNode allocated>
+ move.l d0,a0
+ exg d0,d6
+ lea dn_StackSize+2(a0),a0
+ move.w #StdStackSize,(a0)+ ;dn_StackSize
+ addq.l #8,(a0)
+ addq.l #StdTaskPri-8,(a0)+ ;dn_Priority
+ lea DeviceNode_SIZEOF-dn_Startup(a0),a1
+ move.l a1,d1
+ lsr.l #2,d1
+ move.l d1,(a0)+ ;dn_Startup
+ lea ResSegList(pc),a1
+ move.l d6,DevNode+V-ResSegList(a1)
+ move.l a1,d1
+ lsr.l #2,d1
+ move.l d1,(a0)+ ;dn_SegList
+ not.l (a0)+ ;dn_GlobalVec
+ lsr.l #2,d0
+ move.l d0,(a0) ;dn_Name
+ addq #DeviceNode_SIZEOF-dn_Name+fssm_Device-FileSysStartupMsg,a0
+ lea FileSysStartupMsg_SIZEOF-fssm_Device+de_Baud-DosEnvec(a0),a1
+ move.l a1,d0
+ lsr.l #2,d0
+ move.l d0,(a0)+ ;fssm_Unit
+ lea FileSysStartupMsg_SIZEOF-fssm_Environ+DosEnvec(a0),a1
+ move.l a1,d0
+ lsr.l #2,d0
+ move.l d0,(a0) ;fssm_Environ
+ moveq #DE_DOSTYPE,d0
+ move.l d0,(a1)+ ;de_TableSize
+ lsl.l #3,d0 ;DE_DOSTYPE(=16)<<3=128
+ move.l d0,(a1) ;de_SizeBlock
+ addq #de_Surfaces-de_SizeBlock,a1
+ addq.l #1,(a1)+ ;de_Surfaces
+ addq.l #1,(a1)+ ;de_SectorPerBlock
+ addq.l #1,(a1) ;de_BlocksPerTrack
+ lea de_HighCyl-de_BlocksPerTrack(a1),a0
+ move.l MyInfoData+id_NumBlocks+V(pc),(a0)
+ subq.l #1,(a0)+ ;de_HighCyl
+ addq.l #5,(a0)+ ;de_NumBuffers
+ addq.l #MEMF_PUBLIC,(a0)+ ;de_BufMemType
+ move.l #1<<31-1,(a0)+ ;de_MaxTransfer
+ not.l (a0)+ ;de_Mask
+ move.l VarBootPri+V(pc),(a0)+ ;de_BootPri
+ move.l #'RES'<<8,(a0)+ ;de_DosType
+MyDiskTypeAddr equ *-4
+ lea DeviceName(pc),a1
+CopyDevName move.b (a1)+,(a0)+
+ bne.s CopyDevName
+ amsg <DeviceNode filled>
+
+ lea ExpName(pc),a1
+ call OldOpenLibrary
+ move.l #AG_OpenLib!AO_ExpansionLib,d7
+ bsr.s AlertD0
+ move.l d0,a6
+ amsg <Expansion opened>
+
+ call AllocConfigDev
+ lea ResInitCFail(pc),a3
+ bsr.s AlertD0Mem
+ amsg <AllocConfigDev succeeded>
+ move.l d0,a1
+ lea ResName(pc),a0
+ move.l a0,LN_NAME(a1)
+ move.b #ERT_NEWBOARD!ERTF_DIAGVALID,cd_Rom+er_Type(a1)
+ lea MyDiagArea(pc),a0
+ move.l a0,cd_Rom+er_Reserved0c(a1) ;er_Reserved0[c-f]
+ amsg <ConfigDev filled>
+
+ move.l d6,a0
+ move.b VarBootPri+3+V(pc),d0
+ moveq #ADNF_STARTPROC,d1
+ call AddBootNode
+ bsr.s AlertD0
+ amsg <AddBootNode succeeded>
+ResInitCFail move.l a6,a1
+ call exec,CloseLibrary
+ResInitFail amsg <Initialization finished>
+ mpop d6/d7/a2/a3/a6
+Return rts
+
+;### Debug part of the detach zone ###
+
+ ifd DEBUGX
+DPrintf mpush d0-d1/a0-a3/a6
+ move.l 28(sp),a0
+ addq #2,a0
+ move.l 4.w,a6
+ lea _LVORawPutChar(a6),a2
+ MyFORBID
+ call RawDoFmt
+ call Permit
+ ifd WaitDbg
+Wait1 btst.b #2,$dff016
+ bne.s Wait1
+Wait2 btst.b #2,$dff016
+ beq.s Wait2
+ endc
+ mpop d0-d1/a0-a3/a6
+ rts
+
+;Inputs: D2=Lock
+PrintLockName tst.l d2
+ bne.s LockNonNull
+ amsg <NULL>,0
+ rts
+
+LockNonNull push d2
+ move.l sp,a1
+ amsg <$%08lx/>,0
+ addq #4,sp
+ move.l d2,a0
+;Inputs: A0=Lock
+PrintLockNameX add.l a0,a0
+ add.l a0,a0
+ move.l fl_Key(a0),a0
+
+;Inputs: A0=^Object, Destroys: A0-A2 !!! VERY BIG STACK !!!
+PrintObjName lea -30(sp),sp
+ move.l sp,a2
+ lea RFC_FileName(a0),a1
+ move.b #':',(a2)+
+CopyName move.b (a1)+,(a2)+
+ bne.s CopyName
+ lea DPrintf(pc),a1
+ move.w #$4E75,(a1)
+ bsr GetEntryParent
+ beq.s ReachedRoot
+ vcmp.l RootPtr,a0
+ beq.s ReachedRoot
+ move.b #'/',(sp)
+ bsr.s PrintObjName
+ReachedRoot lea DPrintf(pc),a1
+ move.w #$48E7,(a1)
+ push sp
+ move.l sp,a1
+ amsg <%s>,0
+ lea 34(sp),sp
+ rts
+ endc
+
+; ### MyDiagArea - ptr to it is in ConfigDev structure ###
+MyDiagArea dc.b DAC_BOOTTIME,0 ;da_Config,da_Flags
+ dc.w DiagAreaEnd-MyDiagArea ;da_Size
+ dc.w 0,DiagBootUp-MyDiagArea ;da_DiagPoint,da_BootPoint
+ dc.w ResName-MyDiagArea ;da_Name
+ dc.w 0,0 ;da_Reserved01,da_Reserved02
+
+AlertD0Mem moveq #AG_NoMemory>>16,d7
+ swap d7
+AlertD0 tst.l d0
+ bne.s Return
+ move.l a6,(sp)
+ call exec,Alert
+ pop a6
+ jmp (a3)
+
+DiagBootUp amsg <DiagBootUp started>
+ lea DosName(pc),a1
+ call exec,FindResident
+DoOpenDOSAlert move.l #AT_DeadEnd!AG_OpenLib!AO_DOSLib,d7
+ bsr.s AlertD0
+ move.l d0,a0
+ move.l RT_INIT(a0),a0
+ amsg <DiagBootUp - Initializing DOS>
+ jmp (a0)
+DosName dc.b 'dos.library',0
+
+ResName dc.b 'ResRAM-Handler'
+ ifne (*-DosName)&1
+ fail <Odd length!>
+ endc
+ResNumOne dc.b 0,0,0
+ even
+DiagAreaEnd
+ dc.b '$VER: '
+ResID dc.b 'ResRAM-Handler 1.0 (5.2.95)',0
+ExpName dc.b 'expansion.library',0
+UtilName dc.b 'utility.library',0
+DeviceName dc.b DeviceNameEnd-DeviceName-2,'none.device',0
+DeviceNameEnd
+ ifne (DeviceNode_SIZEOF+FileSysStartupMsg_SIZEOF+de_Baud+1+DeviceNameEnd-DeviceName)&1
+ fail <Odd length!>
+ endc
+ResIntuiName dc.b 'intuition.library',0
+ even
+SumErrMsg dc.b 0,96,28,'!! SYSTEM IS NOW UNRELIABLE -'
+ dc.b ' COLD REBOOT RECOMMENDED !!',0,-1
+ dc.b 0,32,48,'LMB - Continue',0,-1
+ dc.b 480>>8,480&$FF,48,'RMB - ColdReboot',0,-1,0
+SumErrCenter dc.b 0,16,'ResRAM #'
+ ifne (*-SumErrMsg)&1
+ fail <Odd length!>
+ endc
+ResNumTwo dc.b 0,0,': Invalid checksum on '
+SumErrMsgEnd
+ ifne (SumErrMsgEnd-SumErrMsg)&3
+ fail <SumErr not long aligned!!>
+ endc
+V equ ResidentPart+(*-ResidentPart+3)&~3
+ResidentCode equ V-ResidentPart
+SYSCNTold equ SYSCNT
+SYSCNT set 0
+ dv.l ProcPort
+ dv.l UTILITYbase
+ dv.l CurrPacket
+ dv.l ErrSP
+ dv.l DOSbase
+ dv.l DevNode
+
+ dbuf NameBuffer,108
+ dv.l VarBootPri
+ dv.l AnySum ;Checksum of the main part
+ dv.l CmdsNames ;^1st name of Resident Command
+ dv.l VolumeName ;APTR to ASCIIZ of volume name
+ dv.l DosHName ;APTR to BSTR of dos handler name
+ dbuf MyInfoData,id_SIZEOF
+VolumeNode equ MyInfoData+id_VolumeNode ;BPTR
+NumLocks equ MyInfoData+id_InUse
+ dv.l RootPtr ;APTR to root entry
+ dv.l ResListSucc ;ResidentList successor
+ dv.l ResListPtr ;^^MyResidentStruct
+ dbuf GDateStamp,ds_SIZEOF ;Global DateStamp
+ dbuf FirstSegment,0 ;Label of seg of first ResCmd
+
+ResidentVars equ SYSCNT
+SYSCNT set SYSCNTold
+
+VerbOpt macro ;<name>,<letter>,<description>
+ ifc '\1','All'
+VerbF_\1 equ 255
+ else
+ ifc '\1','None'
+VerbF_\1 equ 254
+ else
+VerbB_\1 equ _VerbOpt
+VerbF_\1 equ 1<<_VerbOpt
+_VerbOpt set _VerbOpt+1
+ endc
+ endc
+ dt.c <',VerbF_\1,'\2>
+ dc.b ' \2: \3',10
+ endm
+_VerbOpt set 0
+
+ tags
+ template <FILES/A,DEVICE,NAME,PRI=BOOTPRI/N/K,EMPTYDIRS/S,GENABS/K,GENDISK/K,NODISKREQ/S,NORUN/S,REBOOT/S,VERBOSE/K>
+ dv.l Arg_Files
+ dv.l Arg_Device
+ dv.l Arg_Name
+ dv.l Arg_BootPri
+ dv.l Arg_EmptyDirs
+ dv.l Arg_GenAbs
+ dv.l Arg_GenDisk
+ dv.l Arg_NoDiskReq
+ dv.l Arg_NoRun
+ dv.l Arg_Reboot
+ dv.l Arg_Verbose
+ extrahelp
+ dc.b 'Resident RAM-Disk loader v1.0 --- (c) 1995 Short Software',10,10
+ dc.b 'FILES - Directory/pattern for files to load',10
+ dc.b ' (Wildcards in directory names aren''t supported)',10
+ dc.b 'DEVICE - DOS device name of RES-Disk (def. RES:)',10
+ dc.b 'NAME - Volume name of RES-Disk (def. ResRAM)',10
+ dc.b 'BOOTPRI - Boot priority (def. 15)',10
+ dc.b 'EMPTYDIRS - Don''t discard empty directories',10
+ dc.b 'GENABS - Filename where an AbsModule should be written',10
+ dc.b 'GENDISK - DOS device name for a boot image (e.g. DF0:)',10
+ dc.b 'NODISKREQ - Suppress ''Insert disk...'' requester (only for GENDISK)',10
+ dc.b 'NORUN - Don''t mount RES-Disk',10
+ dc.b 'REBOOT - Reboot machine when the load succeeds',10
+ dc.b ' (Doesn''t apply to AbsModules or boot images)',10
+ dc.b 'VERBOSE - Verbosity switches (seq. of following letters):',10
+ dt.c VerbParseTab,<>
+ VerbOpt All,A,<Turn all switches on>
+ VerbOpt None,N,<Turn all switches off>
+ VerbOpt Dirs,D,<Scanned directories>
+ VerbOpt Files,F,<Scanned file names & types>
+ VerbOpt LoadSeg,I,<Scan phase LoadSeg info>
+ VerbOpt LoadFiles,L,<Files being loaded>
+ VerbOpt Mem,M,<Memory being allocated>
+ VerbOpt SizeMod,G,<Sizes of modules being generated>
+ endhelp
+ dt <>
+ defvar <ResRAM>
+ exitrout Cleanup
+ finish
+ end
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::SClock'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::SClock::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::SClock::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::SClock::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::SClock' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::SClock::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"SClock",
+ "platform"=>"amiga",
+ "priority"=>140,
+ "download"=>"SClock.lha",
+ "link-source file"=>"SClock.asm",
+ "link-aminet README"=>"SClock.README",
+ "summary"=>"Detect disk device name from its volume name",
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"680x0 asm",
+ "description"=><<"HERE",
+<p>SClock reads the current date and time from the remote machine and sets this
+time on the local machine. You can save this time to battery backed up clock,
+if present.</p>
+<p>In fact this is the same work as does the standard AmiTCP command SynClock,
+but SClock has no need for the TCP: device, the inet-handler and is much faster
+(no REXX).</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/SClock/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+Short: Better AmiTCP SynClock (V37+&ss.lib)
+
+Description:
+ SClock reads the current date and time from the remote machine and sets
+this time on the local machine. You can save this time to battery backed up
+clock, if present.
+ In fact this is the same work as does the standard AmiTCP command
+SynClock, but SClock has no need for the TCP: device, the inet-handler and
+is much faster (no REXX).
+
+Requirements:
+ Kickstart version V37 (2.04) or higher and ss.library V5.0 or higher (from
+package SSLib*.lha).
--- /dev/null
+;DEBUG equ 1
+
+TimePort equ 13 ;Port of the "daytime" service
+
+ include "SSMac.h"
+
+ dbuf Date,dat_SIZEOF
+ dbuf DateStr,10
+ dbuf TimeStr,9
+
+ start
+
+ get.l Arg_Host,a0
+ call bsdsocket,GetHostByName
+ moveq #2,d2
+ tst.l d0
+ beq NetErrorVar
+ move.l d0,a1
+ addq #8,a1 ;h_(name|aliases)
+ move.l (a1)+,d0 ;h_addrtype
+ subq.l #2,d0 ;PF_INET
+ dtl <Network protocol not supported>,a0
+ bne.s ErrorSSNE1
+ move.l (a1)+,d0 ;h_length
+ subq.l #4,d0
+ErrorSSNE1 bne ErrorSS
+ move.l (a1),a1 ;h_addr_list
+ move.l (a1),a1
+ move.l (a1),d3 ;Address
+ moveq #2,d0 ;AF_INET
+ moveq #1,d1 ;SOCK_STREAM
+ moveq #0,d2 ;?Why???
+ call bsdsocket,Socket
+ move.l d0,d4
+ bmi.s NetErrorNE
+ clr.l -(sp) ;sin_zero
+ clr.l -(sp) ;sin_zero
+ push d3 ;sin_addr.s_addr
+ move.l #(4<<24)!(2<<16)!TimePort,-(sp) ;sin_(len|family|port)
+ move.l sp,a0 ;sockaddr_in
+ moveq #16,d1 ;sizeof(sockaddr_in)
+ call Connect
+ tst.l d0
+NetErrorNE bne NetError
+ lea -24(sp),sp
+ move.l sp,a0
+ moveq #24,d1
+ moveq #0,d2
+ move.l d4,d0
+ call Recv
+ move.l d0,d2
+ addq.l #1,d0
+ beq NetError
+ moveq #24,d1
+ dtl <Invalid data received>,a0
+ cmp.l d1,d0
+ bcs.s ErrorSSNE1
+ lea 8(sp),a2
+ geta DateStr,a1
+ put.l a1,Date+dat_StrDate
+ move.w (a2),(a1)+
+ move.l -(a2),d0
+ moveq #'-',d1
+ move.b d1,d0
+ ror.l #8,d0
+ move.l d0,(a1)+
+ move.b d1,(a1)+
+ lea 18(a2),a2
+ move.b (a2)+,(a1)+
+ move.b (a2),(a1)
+ addq #2,a1
+ put.l a1,Date+dat_StrTime
+ lea 11(sp),a2
+ moveq #7,d0
+CopyTime move.b (a2)+,(a1)+
+ dbra d0,CopyTime
+ geta Date,a2
+ move.l a2,d1
+ call dos,StrToDate
+ tst.l d0
+ bne.s ConvOkay
+ dtl <StrToDate("%s","%s")>,a0
+ geta Date+dat_StrDate,a1
+ jump ss,DosError
+
+ConvOkay move.l (a2)+,d0 ;ds_Days
+ move.l #1440>>3,d1
+ lsl.l #3,d1
+ call utility,UMult32
+ add.l (a2)+,d0 ;ds_Minute
+ moveq #60,d1
+ call UMult32
+ move.l (a2),d1 ;ds_Tick
+ divu #50,d1
+ ext.l d1
+ add.l d1,d0
+ move.l d0,d2
+ dtl <timer.device>,a0
+ move.w #IOTV_SIZE,a1
+ moveq #UNIT_VBLANK,d0
+ moveq #0,d1
+ sub.l a2,a2
+ call ss,TrackDevice
+ move.w #TR_SETSYSTIME,IO_COMMAND(a1)
+ move.l d2,IOTV_TIME+TV_SECS(a1)
+ move.l a1,a0
+ move.l d1,a1
+ call ChkDoIO
+ tstv.l Arg_Save
+ beq.s EXIT
+ dtl <battclock.resource>,a1
+ push a1
+ call exec,OpenResource
+ move.l sp,a1
+ dtl <%s not found>,a0
+ tst.l d0
+ beq.s ErrorSS
+ move.l d0,a6
+ move.l d2,d0
+ call WriteBattClock
+EXIT jump ss,ExitCleanup
+
+NetError moveq #0,d2
+NetErrorVar clr.l -(sp)
+ call bsdsocket,Errno
+ push d0
+ push #$8000001C
+ add.l d2,(sp)
+ move.l sp,a0
+ call SocketBaseTagList
+ addq #4,sp
+ pop a0
+ tst.l d0
+ beq.s ErrorSS
+ErrorUnknown dtl <Unknown net subsystem error>,a0
+ErrorSS jump ss,ExitError
+
+ tags
+ template <HOST/A,SAVE/S>
+ dv.l Arg_Host
+ dv.l Arg_Save
+ library bsdsocket,3
+ finish
+ end
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::ShortRel'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::ShortRel::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::ShortRel::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::ShortRel::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::ShortRel' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::ShortRel::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"ShortRel",
+ "platform"=>"amiga",
+ "priority"=>280,
+ "download"=>"ShortRel.lha",
+ "link-source file"=>"ShortRel.asm",
+ "link-aminet README"=>"ShortRel.README",
+ "aminet"=>"util/cli/ShortRel",
+ "summary"=>"Executable file relocations compressor",
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"680x0 asm",
+ "description"=><<"HERE",
+<p>ShortRel loads the input file (must be an executable), converts relocations
+(32-bit to 16-bit or vice versa), strips debug informaion (if requested) and
+writes out the result. 16-bit relocations use 2 bytes per each one and 32-bit
+relocations use 4 bytes. So conversion of any executable with many relocations
+from 32-bit to 16-bit relocations saves 2 bytes per each one.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/ShortRel/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl \
+ ShrotRel.lha \
+ ShortRel.asm
--- /dev/null
+Short: 32bit relocations <-> 16bit
+Author: short@k332.feld.cvut.cz (Jan Kratochvil)
+Uploader: short@k332.feld.cvut.cz (Jan Kratochvil)
+Type: util/cli
+
+Description:
+ ShortRel loads the input file (must be an executable), converts
+relocations (32-bit to 16-bit or vice versa), strips debug informaion (if
+requested) and writes out the result. 16-bit relocations use 2 bytes per
+each one and 32-bit relocations use 4 bytes. So conversion of any executable
+with many relocations from 32-bit to 16-bit relocations saves 2 bytes per
+each one.
+
+Requirements:
+ Kickstart version 37 (2.04) or higher and ss.library V5.0 or higher (from
+package SSLib*.lha).
--- /dev/null
+;DEBUG equ 1
+
+ include "SSMac.h"
+
+ dv.l FileStart
+ dv.l Hunks
+ dv.l OldKeepDebug
+ dv.l RelocPool
+ dv.l BackupA2
+ dv.l FirstInsert
+ dv.l LastInsert
+ dv.b FlgBufEnd
+ dv.b Advisory
+
+ start
+
+ get.l Arg_File,a0
+ call LoadFile
+ put.l d0,FileStart
+ move.l d0,a2
+ add.l -(a2),d0
+ move.l d0,d7
+ moveq #20,d0
+ cmp.l (a2)+,d0
+ bhi.s InvalidNE1
+ lea (a2,d0.l),a3
+ cmp.l #HUNK_HEADER,(a2)+
+ bne.s InvalidNE1
+ tst.l (a2)+
+ bne.s InvalidNE1
+ move.l (a2)+,d2
+ beq Invalid
+ tst.l (a2)+
+ bne.s InvalidNE1
+ move.l (a2)+,d0
+ addq.l #1,d0
+ cmp.l d0,d2
+ bne.s InvalidNE1
+ dtl <hunk>,a6
+ bsr.s CheckWordLimit
+ swap d0
+ put.l d0,Hunks
+ lsl.l #3,d0
+ call ss,TrackAllocPub
+ move.l d0,a4
+ move.l d2,d0
+ moveq #0,d4
+ bsr CopyLongs
+
+ moveq #0,d3
+MainHunkLoop
+ ifd DEBUG
+ push d4
+ push d3
+ push a2
+ dtl <A2=%08lx, D3=%08lx, D4=%08lx - >,a0
+ move.l sp,a1
+ call ss,Printf
+ lea 12(sp),sp
+ endc
+ cmp.l a2,d7
+ beq.s FileEnd
+ move.l (a2)+,d0
+ push d0
+ ifd DEBUG
+ dtl.l <Got %08lx>,a0
+ move.l sp,a1
+ call Printf
+ move.l (sp),d0
+ endc
+ bclr.l #HUNKB_ADVISORY,d0
+ snev Advisory
+ sub.w #HUNK_NAME,d0
+ bcs.s BadHunk
+ cmp.w #HUNK_RELRELOC32-HUNK_NAME+1,d0
+ bcc.s BadHunk
+ lsl.l #1,d0
+ move.w HunkTable(pc,d0.w),d1
+ swap d0
+ lsl.w #2,d0
+InvalidNE1 bne Invalid
+ pop d0
+ jsr HunkTable(pc,d1.w)
+ bra.s MainHunkLoop
+
+CheckWordLimit swap d0
+ tst.w d0
+ beq Return5
+ push a0
+ dtl <Too many %ss>,a0
+ bra ErrorSSA1
+
+BadHunk tstv.b Advisory
+ beq Invalid
+ tst.l d4
+ bne.s AdviSkip
+ move.l d0,(a3)+
+AdviSkip bsr GetLong
+
+FileEnd tstv.l Arg_NoEnd
+ beq.s PatchNoEnd
+ addq #4,a3
+PatchNoEnd geta Arg_To,a0
+ move.l (a0),d0
+ bne.s ArgToSpecified
+ move.l -4(a0),d0
+ move.l d0,(a0)
+ArgToSpecified move.l d0,a0
+ moveq #OPEN_NEW,d0
+ call ss,TrackOpen
+ move.l d1,d2
+ get.l FileStart,a2
+ move.l -4(a2),d4
+ get.l FirstInsert,d3
+ moveq #0,d5
+
+FlushLoop tst.l d3
+ beq.s FlushNoInsertX
+ move.l d3,a1
+ move.l (a1)+,d1 ;Next
+ move.l (a1)+,d0 ;Point
+ sub.l a2,d0
+ bne.s FlushNoInsert
+ move.l d1,d3
+ move.l (a1)+,d0 ;Length
+ bra.s FlushSkip
+
+hunk macro ;HUNK_#?[,<routine>]
+ ifne _hunk-\1
+ fail Mismatched hunk numbers!
+ endc
+ ifeq NARG-1
+ dc.w BadHunk-HunkTable
+ else
+ dc.w hunk_\2-HunkTable
+ endc
+_hunk set _hunk+1
+ endm
+_hunk set 1000
+HunkTable
+ hunk HUNK_NAME,skipcnt ;1000
+ hunk HUNK_CODE,main ;1001
+ hunk HUNK_DATA,main ;1002
+ hunk HUNK_BSS,bss ;1003
+ hunk HUNK_RELOC32,rel32 ;1004
+ hunk HUNK_RELOC16 ;1005
+ hunk HUNK_RELOC8 ;1006
+ hunk HUNK_EXT ;1007
+ hunk HUNK_SYMBOL,symbol ;1008
+ hunk HUNK_DEBUG,skipcnt ;1009
+ hunk HUNK_END,end ;1010
+ hunk HUNK_HEADER ;1011
+ hunk 1012 ;????
+ hunk HUNK_OVERLAY ;1013
+ hunk HUNK_BREAK ;1014
+ hunk HUNK_DREL32,rel16 ;1015
+ hunk HUNK_DREL16 ;1016
+ hunk HUNK_DREL8 ;1017
+ hunk HUNK_LIB ;1018
+ hunk HUNK_INDEX ;1019
+ hunk HUNK_RELOC32SHORT,rel16 ;1020
+ hunk HUNK_RELRELOC32,rrel16 ;1021
+ ifne _hunk-HUNK_RELRELOC32-1
+ fail Invalid number of hunks!
+ endc
+
+FlushNoInsertX move.l a3,d0
+ sub.l a2,d0
+FlushNoInsert move.l a2,a1
+ add.l d0,a2
+FlushSkip move.l d2,a0
+ add.l d0,d5
+ call ss,ChkWrite
+ cmp.l a2,a3
+ bne.s FlushLoop
+
+ tstv.l Arg_Quiet
+ bne.s Return5
+
+ move.l d5,d0
+ moveq #100,d1
+ get.l utilitybase,a0
+ jsr _LVOUMult32(a0)
+ move.l d4,d1
+ jsr _LVOUDivMod32(a0)
+ pop d1
+ move.w d0,-(sp)
+ get.l Arg_To,d3
+ get.l Arg_File,d2
+ mpush d1-d5
+ lea 4(sp),a1
+ dtl.l <%s =',62,' %s: %lu =',62,' %lu (%u%%)>,a0
+ jump Printf
+
+hunk_rel16 moveq #-31,d2
+ bra.s HunkReloc
+
+RelocRead16 moveq #0,d0
+ move.w (a2)+,d0
+Return5 rts
+
+hunk_rel32 moveq #2,d2
+HunkReloc tst.l d3
+ beq.s InvalidEQ1
+RelocLoop bsr.s RelocRead
+ beq.s RelocReturn
+ move.l d0,d1
+ bsr.s RelocRead
+ vcmp.l Hunks,d0
+ bcc Invalid
+ lsl.l #2,d0
+ lea (a4,d0.l),a0
+ move.l d1,d0
+ tst.l d4
+ bne.s RelocScan
+ lsl.l #2,d0
+ move.l (a0),a1
+ add.l d0,(a0)
+ tst.l d2
+ bmi.s RelocCopy16
+ move.l a2,a0
+ add.l d0,a2
+ call exec,CopyMemQuick
+ bra.s RelocLoop
+
+RelocCopy16 subq.l #1,d1
+RC16Loop clr.w (a1)+
+ move.w (a2)+,(a1)+
+ dbra d1,RC16Loop
+ bra.s RelocLoop
+
+RelocScan add.l d1,(a0)
+ rol.l d2,d0
+ bsr SkipBytes
+ bra.s RelocLoop
+
+RelocRead cmp.l a2,d7
+ beq InvalidEnd
+ tst.l d2
+ bmi.s RelocRead16
+ move.l (a2)+,d0
+ rts
+
+RelocReturnRR cmp.l a3,d7
+ beq.s InvalidEQ1
+ clr.w (a3)
+ move.l a3,d0
+ addq.l #3,d0
+ and.w #~3,d0
+ move.l d0,a3
+RelocReturn move.l a2,d0
+ addq.l #3,d0
+ and.w #~3,d0
+ move.l d0,a2
+ rts
+
+hunk_rrel16 tst.l d3
+InvalidEQ1 beq Invalid
+ moveq #-1,d2
+ tst.l d4
+ bne.s RRel16Loop
+ move.l d0,(a3)+
+RRel16Loop bsr.s RelocRead
+ tst.l d4
+ bne.s SkipCpNum16
+ move.w d0,(a3)+
+SkipCpNum16 tst.w d0
+ beq.s RelocReturnRR
+ addq.l #1,d0
+ lsl.l #1,d0
+ bsr.s CopyBytes ;or SkipBytes if d4\ne0
+ bra.s RRel16Loop
+
+hunk_skipcnt bsr.s SymInit
+ moveq #0,d2
+ bsr.s RelocRead
+ tst.l d6
+ beq.s SymbolSkip
+ move.l d0,(a3)+
+SymbolSkip push d4
+ move.l d6,d4
+ subq.l #1,d4
+ subx.l d4,d4
+ bsr.s CopyLongs
+ pop d4
+Return1 rts
+
+SymInit get.l Arg_KeepDebug,d6
+ beq.s Return6
+PutnRet move.l d0,(a3)+
+Return6 rts
+
+hunk_symbol moveq #0,d2
+ bsr.s SymInit
+SkipSymbol bsr.s RelocRead
+ tst.l d6
+ beq.s KeepNull
+ move.l d0,(a3)+
+KeepNull tst.l d0
+ beq.s Return1
+ addq.l #1,d0
+ bsr.s SymbolSkip
+ bra.s SkipSymbol
+
+CopyLongs lsl.l #2,d0
+CopyBytes tst.l d4
+ bne SkipBytes
+ move.l d7,d1
+ sub.l a2,d1
+ cmp.l d0,d1
+ bcs InvalidEnd
+ move.l a2,a0
+ move.l a3,a1
+ add.l d0,a2
+ add.l d0,a3
+ cmp.l a0,a1
+ beq.s Return1
+ cmp.l a3,a0
+ bcc.s JumpCopyMem
+ lsr.l #2,d0
+ bcc.s CopyQuad
+ move.w (a0)+,(a1)+
+CopyQuad move.w d0,d1
+ swap d0
+ bra.s MyCopyInto
+
+MyCopyLoop move.l (a0)+,(a1)+
+MyCopyInto dbra d1,MyCopyLoop
+ dbra d0,MyCopyLoop
+ rts
+
+JumpCopyMem jump exec,CopyMem
+
+hunk_end tst.l d3
+ beq Invalid
+HunkEndJump tst.l d4
+ beq.s Pass1Done
+ ifd DEBUG
+ dtl <HunkEnd - Pass 1>,a0
+ call ss,PutsNL
+ endc
+ moveq #64,d0
+ lsl.l #4,d0
+ moveq #96,d1
+ lsl.l #3,d1
+ moveq #0,d2
+ call ss,TrackPool
+ put.l d0,RelocPool
+ push d3
+ move.l d0,d3
+ get.l Hunks,d2
+ move.l d2,d0
+ lsl.l #2,d0
+ lea (a4,d0.l),a2
+ push a4
+ bra.s AllocRelocInto
+
+AllocRelocLoop move.l (a4),d0
+ lsl.l #2,d0
+ move.l d0,(a2)+
+ beq.s NoAllocReloc
+ move.l d3,a0
+ call PoolAlloc
+NoAllocReloc move.l d0,(a4)+
+AllocRelocInto dbra d2,AllocRelocLoop
+ pop a4
+ pop d3
+ move.l d4,a2
+ moveq #0,d4
+ vmovev.l OldKeepDebug,Arg_KeepDebug
+ rts
+
+Pass1Done
+ ifd DEBUG
+ push d0
+ dtl <HunkEnd - Pass 1 done>,a0
+ call ss,PutsNL
+ pop d0
+ endc
+ put.l a2,BackupA2
+ mpush d0/d7/a4
+ get.l Hunks,d6
+ move.l d6,d3
+ lsl.l #2,d6
+ move.l (v),a6
+ lea (a4,d6.l),a2 ;A2=RelLengths, A4=RelEnds
+ moveq #0,d4 ;define to 16 if at least 1 32bit
+ moveq #0,d5 ;saved bytes by 16bit header
+ tstv.l Arg_Reloc32
+ bne.s Only32Fake
+ get.l RelocPool,a0
+ move.l d6,d0
+ call PoolAlloc
+ push a3
+ move.l d0,a3
+ add.l d6,a3
+ push a3
+ bra.s NormalPtrsInto
+
+NormalPtrsLoop move.l (a2)+,d0
+ sub.l d0,(a4)
+ move.l d0,d7
+ move.l (a4)+,a0
+ beq.s EmptyHunk
+ move.l a0,d2
+ lsr.l #2,d0
+ call SortLongs
+ moveq #0,d0
+ move.l d2,a0
+ move.l d7,d1
+EdgeLoop move.l d0,d2
+ add.l d1,d2
+ lsr.l #1,d2
+ and.w #~3,d2
+ cmp.l d0,d2
+ beq.s EdgeFound
+ tst.w (a0,d2.l)
+ bne.s EdgeDown
+ move.l d2,d0
+ move.l d1,d2
+EdgeDown move.l d2,d1
+ bra.s EdgeLoop
+
+Only32Fake subq.l #1,d3
+Only32Loop move.l (a4),a0
+ move.l (a2)+,d0
+ sub.l d0,a0
+ move.l a0,(a4)+
+ lsr.l #2,d0
+ call SortLongs
+ dbra d3,Only32Loop
+ bra.s FromFaked32
+
+EdgeFound tst.w (a0,d0.l)
+ bne.s EdgeFix
+ addq.l #4,d0
+EdgeFix add.l d0,d5
+ addq.l #8,d5
+EmptyHunk move.l d0,-(a3) ;real # of 16bit relocs
+ beq.s NormalPtrsInto
+ moveq #16,d4
+ subq.l #8,d0
+ bhi.s MoreThatTwo
+ sub.l d0,d5
+ subq.l #8,d5
+ subq.l #8,d5
+ clr.l (a3)
+MoreThatTwo sub.l d4,d5
+NormalPtrsInto dbra d3,NormalPtrsLoop ;A2=TotalEnd, A4=RelLengths
+ mpop a0/a3
+FromFaked32 move.l d6,d3
+ lsr.l #2,d3
+ subq.l #1,d3
+ sub.l d6,a2
+ sub.l d6,a2 ;A2=RelStarts, A4=RelLengths
+ sub.l d4,d5
+ bmi.s Hunks32
+ beq.s Hunks32
+ tst.l d4
+ beq.s Hunks32
+ mpush d3/a0/a2/a4
+ moveq #8,d0
+H16SizeLoop move.l -(a0),d1
+ beq.s H16SizeSkip
+ lsr.l #1,d1
+ addq.l #4,d1
+ add.l d1,d0
+H16SizeSkip dbra d3,H16SizeLoop
+ and.w #~3,d0
+ bsr ReserveReloc
+ movem.l 4(sp),d3/a0/a2/a4
+ move.l #HUNK_DREL32,(a3)+
+ dtl <reloc>,a6
+H16Loop move.l -(a0),d0
+ sub.l d0,(a4)+
+ lsr.l #2,d0
+ move.l (a2),a1
+ beq.s H16SkipAll
+ move.w d0,(a3)+
+ subq.w #1,d0
+ move.w 6(sp),(a3) ;Desthunk
+ sub.w d3,(a3)+
+
+H16InLoop addq #2,a1
+ move.w (a1)+,(a3)+
+ dbra d0,H16InLoop
+ bsr CheckWordLimit ;# of relocs>65535 ?!?
+H16SkipAll move.l a1,(a2)+
+ dbra d3,H16Loop
+ clr.w (a3)+
+ move.w a3,d0
+ ror.w #2,d0
+ bcc.s H16Aligned
+ clr.w (a3)+
+H16Aligned pop a3
+ mpop d3/a0/a2/a4
+Hunks32 moveq #0,d0
+ move.l d3,d2
+ push a4
+H32SizeLoop move.l (a4)+,d1
+ beq.s H32SizeInto
+ addq.l #8,d1
+ add.l d1,d0
+H32SizeInto dbra d2,H32SizeLoop
+ pop a4
+ tst.l d0
+ beq.s HunksDone
+ addq.l #8,d0
+ bsr.s ReserveReloc
+ move.l #HUNK_RELOC32,(a3)+
+ move.l d3,d2
+ moveq #0,d5 ;Current DestHunk
+H32Loop move.l (a2)+,a0
+ move.l (a4)+,d0
+ beq.s H32Skip
+ move.l d0,d1
+ lsr.l #2,d1
+ move.l d1,(a3)+
+ move.l d5,(a3)+
+ move.l a3,a1
+ add.l d0,a3
+ call exec,CopyMemQuick
+H32Skip addq.l #1,d5
+ dbra d2,H32Loop
+ clr.l (a3)+
+ pop a3
+HunksDone get.l RelocPool,a0
+ call ss,FreeObject
+ get.l BackupA2,a2
+ moveq #0,d3
+ moveq #0,d4
+ pop (a3)
+ tstv.l Arg_NoEnd
+ bne.s IsNoEnd
+ addq #4,a3
+IsNoEnd mpop d7/a4
+Return4 rts
+
+ReserveReloc add.l a3,d0
+ vcmp.l BackupA2,d0
+ bls.s ReserveReturn
+ sub.l a3,d0
+ push d0
+ addq.l #8,d0
+ addq.l #4,d0
+ call ss,TrackAllocPub
+ geta FirstInsert,a0
+ get.l LastInsert,d1
+ beq.s NoLastInsert
+ move.l d1,a0
+NoLastInsert move.l d0,(a0)
+ put.l d0,LastInsert
+ move.l d0,a1
+ clr.l (a1)+ ;^NextInsert
+ move.l a3,(a1)+ ;^InsertPoint
+ pop (a1)+ ;^InsertLength
+ move.l a3,d0
+ move.l a1,a3
+ReserveReturn move.l (sp),a0
+ move.l d0,(sp)
+ jmp (a0)
+
+hunk_main bsr.s HunkMainInit
+ push a3
+ bsr.s GetLong
+ move.l d0,d2
+ bsr CopyLongs
+ move.w d2,d0
+ swap d2
+ move.l a3,d1
+ cmp.l d0,d0 ;ZF=1
+ bra.s SqueezeInto
+
+GetLong cmp.l a2,d7
+ beq.s Invalid
+ move.l (a2)+,d0
+ tst.l d4
+ bne.s Return2
+ move.l d0,(a3)+
+Return2 rts
+
+HunkMainInit tst.l d3
+ beq.s WereFree
+ push d0
+ move.l #HUNK_END,d0
+ bsr HunkEndJump
+ pop d0
+ tst.l d3
+ bne.s HMI_Skip
+WereFree tst.l d4
+ beq PutnRet
+HMI_Skip addq #4,sp
+ rts
+
+SqueezeLoop tst.l -(a3)
+SqueezeInto dbne d0,SqueezeLoop
+ dbne d2,SqueezeLoop
+ beq.s TotalSqueeze
+ addq #4,a3
+TotalSqueeze sub.l a3,d1
+ lsr.l #2,d1
+ pop a0
+ sub.l d1,(a0)
+JumpFromBSS get.l Hunks,d0
+ move.l a4,a0
+ bra.s ClrHunkTabInto
+
+hunk_bss bsr.s HunkMainInit
+ bsr.s GetLong
+ bra.s JumpFromBSS
+
+ClrHunkTabLoop clr.l (a0)+
+ClrHunkTabInto dbra d0,ClrHunkTabLoop
+ move.l a2,d4
+ vmovev.l Arg_KeepDebug,OldKeepDebug
+ clrv.l Arg_KeepDebug
+ moveq #-1,d3
+Return3 rts
+
+SkipBytes add.l d0,a2
+ cmp.l a2,d7
+ bcc.s Return3
+InvalidEnd move.l d7,a2
+Invalid vsub.l FileStart,a2
+ push a2
+ dtl <Invalid structure of file "%s" near offset $%06lx>,a0
+ vpush Arg_File
+ErrorSSA1 move.l sp,a1
+ jump ss,ExitError
+
+ ifd DEBUG
+EXIT jump ss,ExitCleanup
+ endc
+
+ tags
+ template <FROM/A,TO,KEEPDEBUG/S,RELOC32/S,NOEND/S,QUIET/S>
+ dv.l Arg_File
+ dv.l Arg_To
+ dv.l Arg_KeepDebug
+ dv.l Arg_Reloc32
+ dv.l Arg_NoEnd
+ dv.l Arg_Quiet
+ finish
+ end
+ShortRel dvitype /bin.new.exp/dvitype RELOC32
+ShortRel gftodvi /bin.new.exp/gftodvi RELOC32
+ShortRel gftopk /bin.new.exp/gftopk RELOC32
+ShortRel gftype /bin.new.exp/gftype RELOC32
+ShortRel inimf /bin.new.exp/inimf RELOC32
+ShortRel initex /bin.new.exp/initex RELOC32
+ShortRel mft /bin.new.exp/mft RELOC32
+ShortRel pltotf /bin.new.exp/pltotf RELOC32
+ShortRel tftopl /bin.new.exp/tftopl RELOC32
+ShortRel vftovp /bin.new.exp/vftovp RELOC32
+ShortRel virmf /bin.new.exp/virmf RELOC32
+ShortRel virtex /bin.new.exp/virtex RELOC32
+ShortRel vptovf /bin.new.exp/vptovf RELOC32
+ShortRel MakeInfo /bin.new.exp/MakeInfo RELOC32
+ShortRel tr2tex /bin.new.exp/tr2tex RELOC32
+ShortRel dvi2tty /bin.new.exp/dvi2tty RELOC32
+ShortRel disdvi /bin.new.exp/disdvi RELOC32
+ShortRel DVIprint /bin.new.exp/DVIprint RELOC32
+ShortRel flib /bin.new.exp/flib RELOC32
+ShortRel PToFront /bin.new.exp/PToFront RELOC32
+ShortRel TeXindex /bin.new.exp/TeXindex RELOC32
+ShortRel ShowDVI /bin.new.exp/ShowDVI RELOC32
+ShortRel SpecialHost /bin.new.exp/SpecialHost RELOC32
+ShortRel bm2font /bin.new.exp/bm2font RELOC32
+
+
+A2=000EEE44, D3=00000000, D4=00000000 - Got HUNK_CODE
+A2=00102524, D3=FFFFFFFF, D4=00102524 - Got HUNK_DREL32
+A2=00102E08, D3=FFFFFFFF, D4=00102524 - Got HUNK_RELOC32
+A2=00102E1C, D3=FFFFFFFF, D4=00102524 - Got HUNK_DATA
+A2=00102524, D3=FFFFFFFF, D4=00000000 - Got HUNK_DREL32
+A2=00102E08, D3=FFFFFFFF, D4=00000000 - Got HUNK_RELOC32
+A2=00102E1C, D3=FFFFFFFF, D4=00000000 - Got HUNK_DATA
+A2=00103308, D3=FFFFFFFF, D4=00103308 - Got HUNK_RELOC32
+A2=00103320, D3=FFFFFFFF, D4=00103308 - Got HUNK_BSS
+A2=00103308, D3=FFFFFFFF, D4=00000000 - Got HUNK_RELOC32
+A2=00103320, D3=FFFFFFFF, D4=00000000 - Got HUNK_BSS
+A2=00103328, D3=FFFFFFFF, D4=00103328 - Got HUNK_END
+A2=00103328, D3=FFFFFFFF, D4=00000000 - Got HUNK_END
+A2=0010332C, D3=00000000, D4=00000000 - bm2font => :t/shortrel.res: 83208 => 80888 (97%)
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::TraceFS'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::TraceFS::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::TraceFS::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::TraceFS::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+@{[ centerimg "/project/captive/doc/ntdebug-windbg-boot","TraceFS Initialization" ]}
+@{[ vskip "1ex" ]}
+@{[ centerimg "/project/captive/doc/dia/TraceFS","TraceFS Hooking" ]}
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::TraceFS' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::TraceFS::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"TraceFS",
+ "platform"=>"w32",
+ "priority"=>610,
+ "icon"=>"TraceFS-icon",
+ "cvs"=>"captive/src/TraceFS",
+ "link-Documentation"=>"/project/captive/doc/CacheManager.html.pl#TraceFS",
+ "summary"=>"Microsoft Windows Kernel API Tracer",
+ "license"=>"GPL",
+ "maintenance"=>"ready",
+ "language"=>"C",
+ "description"=><<"HERE",
+<p>Project allows wrapping of Microsoft Windows Kernel API calls of your chosen
+kernel driver by your custom function code.</p>
+<p>Although TraceFS was up to now used only for tracing of Windows NT Cache
+Manager it can be easily used ever for any other NT kernel API tracing. You
+need to provide appropriate function wrappers in the main source file.
+Framework for thread synchronizations and debug tracing is provided to prevent
+mangling of messages while running by multiple threads at once.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/TraceFS/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::badblock_guess::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::badblock_guess::ListItem;
+Wuse 'My::Project';
+Wuse 'project::badblock_guess::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::badblock_guess::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::badblock_guess::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::badblock_guess;
+package project::badblock_guess::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Recovery of Data from a Damaged Disk",
- "priority"=>7,
+
+our @ListItem=(
+ "name"=>"badblock-guess",
+ "platform"=>"unixuser",
+ "priority"=>590,
+ "icon"=>"hdd-icon.jpeg",
"download-compiled static binary"=>"badblock-guess",
"download-gzipped compiled static binary"=>"badblock-guess.gz",
- "link-CVS repository"=>"http://cvs.jankratochvil.net/viewcvs/badblock-guess/",
- "download-CVS snapshot"=>"http://cvs.jankratochvil.net/viewcvs/badblock-guess/badblock-guess.tar.gz?tarball=1",
- "link-README"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/badblock-guess/README?rev=HEAD",
- "summary"=>"Data recovery",
+ "cvs"=>"badblock-guess",
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "link-README"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/badblock-guess/README?rev=HEAD",
+ "summary"=>"Data recovery from a damaged disk",
"license"=>"GPL",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C",
- "description"=>""
- .'<p>badblock-guess will try to find all readable sectors of the disk in minimal time.</p>'
+ "description"=><<"HERE",
+<p>badblock-guess will recover all readable sectors of the disk in minimal time
+while trying to prevent disk read retrying head recalibrations.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# CVS page of 'My::Project::captive'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::CVS;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::captive::ListItem';
+
+
+my $W=My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::captive::ListItem::ListItem,
+ "before_project_data"=>
+ '<h2 align="center">'.a_href('./','Captive Main Page').'</h2>'."\n",
+ );
+
+
+print <<"HERE";
+<h2>CVS Checkout Instructions</h2>
+<pre>
+cvs -d :pserver:pserver@{[ '@' ]}cvs.jankratochvil.net:/cvs login
+ Just hit ENTER (empty password)
+cvs -d :pserver:pserver@{[ '@' ]}cvs.jankratochvil.net:/cvs -z3 checkout captive
+cd captive
+cvs -d :pserver:pserver@{[ '@' ]}cvs.jankratochvil.net:/cvs -z3 checkout -r captive -kk reactos
+./autogen.pl
+make
+./src/client/cmdline/captive-cmdline --load-module=/var/lib/captive/ntoskrnl.exe --filesystem=/var/lib/captive/ntfs.sys --disk --blind /dev/hda1
+</pre>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::captive'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::captive::ListItem';
+
+
+# Redirect foreign visitors to our root with that disgusting introduction ad.
+{
+ my $r=Apache->request();
+ if (my $referer=$r->header_in("Referer")) {
+ Wuse 'WebConfig';
+ require URI;
+ my $refuri=URI->new_abs($referer,$r->uri());
+ if (1
+ && $refuri->host() ne "localhost"
+ && $refuri->host() ne &{$WebConfig::WebConfig{"web_hostname_sub"}}) {
+ use Apache::Constants qw(REDIRECT);
+ $r->status(REDIRECT);
+ $r->header_out("Location"=>"http://".&{$WebConfig::WebConfig{"web_hostname_sub"}}());
+ exit 0;
+ }
+ }
+ }
+
+
+my $W=My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::captive::ListItem::ListItem,
+ "no_project_data"=>1,
+ "head_css"=>"
+.reqpkg { font-style: italic; }
+.stuff { font-style: italic; font-size: larger; margin-left: 20%; margin-right: 10%; }
+.re { font-style: italic; }
+table.mailman > * /* FIXME: What is it? */ > tr > th,
+table.mailman > * /* FIXME: What is it? */ > tr > td { padding: 1ex; text-align: center; }
+",
+ );
+
+
+print <<"HERE";
+<h1>The First Read/Write NTFS for Free Operating Systems</h1>
+<h1>The First Open Source MS-Windows Kernel API for Free OS</h1>
+HERE
+
+my @stuff=(
+ "A lot of people claim to be Windows Programmers.\n"
+ ." Now, I can join them at last - I have also written my own Microsoft Windows.",
+ "Why do they need ".a_href('http://www.winsupersite.com/reviews/winserver2k3_gold2.asp','5,000 developers')
+ ." to write Microsoft Windows when it can be just a One Man Show?",
+
+
+
+ "My first Microsoft Windows program ever written? Some 'helloworld'?"
+ ." <span class=\"quote\">hal.dll</span>.",
+ );
+
+print rightimg((map("<p class=\"stuff\">$_</p>\n",($stuff[int rand @stuff])))[0],
+ 'captive-install-acquire-small','[ Captive Microsoft Windows Drivers Acquire Illustration ]',
+ "a_href_img"=>'captive-install-acquire');
+
+print <<"HERE";
+
+
+@{[ vskip "3ex" ]}
+
+<p class="stuff">
+ Why did I install Microsoft Windows and write such a disgusting piece of code?<br />
+ Expecting @{[ a_href $W->{"resume_url"},"yet another challenging task" ]}!
+</p>
+
+@{[ vskip "3ex" ]}
+
+
+<table border="1" align="center" style="text-align: center;" width="100%"><tr><th>Distribution</th>
+ <th>Installation Case #1<br />Filesystem and installer<br />(recommended)</th>
+ <th>Installation Case #2<br />Manual installation<br />(filesystem, expert user)</th>
+ <th>Installation Case #3<br />Command-line client<br />(no filesystem access)</th></tr>
+HERE
+my %pkg=(
+ 1=>[qw(captive captive-lufs captive-install lufs gnome-vfs-httpcaptive ntfsprogs ntfsprogs-gnomevfs)],
+ 2=>[qw(captive captive-lufs lufs)],
+ 3=>[qw(captive)],
+ );
+my %reqpkg=(
+ 1 =>[qw(glib2 gnome-vfs2 ORBit2 libxml2 openssl popt readline libgnomeui)],
+ 23=>[qw(glib2 gnome-vfs2 ORBit2 libxml2 openssl popt readline)],
+ );
+my %version=(
+ map(($_=>["1.0","0"]),qw(captive captive-lufs captive-install)),
+ "lufs"=>["0.9.6","1captive6"],
+ "gnome-vfs-httpcaptive"=>["2.3.8captive2","0"],
+ "ntfsprogs"=>["200309071734","1captive1"],
+ "ntfsprogs-gnomevfs"=>["1.0.2","0"],
+ );
+my %has_rh8=(map(($_=>1),qw(
+ gnome-vfs-httpcaptive
+ captive
+ captive-lufs
+ captive-install
+ )));
+my %has_mdk91=(map(($_=>1),qw(
+ gnome-vfs-httpcaptive
+ lufs
+ captive
+ captive-lufs
+ captive-install
+ )));
+my %has_devel=(map(($_=>1),qw(
+ ntfsprogs
+ )));
+my %pkg_nosrc=(map(($_=>1),qw(
+ captive-lufs
+ captive-install
+ )));
+
+my $case;
+my $a_href_arch=sub ($$%)
+{
+my($file_base,$text,%args)=@_;
+
+ $text=~s/[._]\D.*$// if $case!=1 && $text!~/^[.]/;
+ return a_href $file_base,$text,"size"=>($case==1),%args;
+};
+
+my @libxml2_rh8_pkgs=qw(libxml2-2.5.4-1.i386.rpm libxml2-python-2.5.4-1.i386.rpm libxml2-devel-2.5.4-1.i386.rpm);
+
+my @dist=(
+ {
+ "name"=>"Red Hat 9<br />Shrike i386",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ my $file="$pkg-$version_base-$version_ext.i386.rpm";
+ my $r=&$a_href_arch("dist/$file",$file);
+ (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
+ $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
+ return $r;
+ },
+ },
+ {
+ "name"=>"Red Hat 8<br />Psyche i386<br />"
+ ."(".a_href("#libxml2_rh8","libxml2 upgrade note").")",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ my $file="$pkg-$version_base-$version_ext".(!$has_rh8{$pkg} ? "" : "rh8").".i386.rpm";
+ my $r=&$a_href_arch("dist/$file",$file);
+ (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
+ $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
+ if ($pkg eq "captive-install") {
+ for (@libxml2_rh8_pkgs) {
+ $r.="<br />".&$a_href_arch('ftp://ftp.redhat.com/pub/redhat/linux/9/en/os/i386/RedHat/RPMS/'.$_,$_)." of Red Hat 9";
+ }
+ }
+ return $r;
+ },
+ },
+ {
+ "name"=>"Mandrake 9.1<br />Bamboo i586",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ my $file="$pkg-$version_base-$version_ext".(!$has_mdk91{$pkg} ? ".i386.rpm" : "mdk91.i586.rpm");
+ my $r=&$a_href_arch("dist/$file",$file);
+ (my $filedev=$file)=~s/^\Q$pkg\E-/${pkg}-devel-/;
+ $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
+ return $r;
+ },
+ },
+ {
+ "name"=>"Debian GNU/Linux<br />'unstable' i386",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ $version_ext=~s/^\d+//;
+ my $file="${pkg}_$version_base".($version_ext=~/^\d+$/ ? "" : $version_ext)."_i386.deb";
+ my $r=&$a_href_arch("dist/$file",$file);
+ (my $filedev=$file)=~s/^\Q$pkg\E_/${pkg}-dev_/;
+ $r.="<br />".&$a_href_arch("dist/$filedev",$filedev) if $has_devel{$pkg};
+ return $r;
+ },
+ },
+ {
+ "name"=>"Sources (.tar.gz)",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ return () if $pkg_nosrc{$pkg};
+ $version_ext=~s/^\d+//;
+ my $file="$pkg-$version_base".($version_ext=~/^\d+$/ ? "" : $version_ext).".tar.gz";
+ return $file,$file;
+ },
+ },
+ {
+ "name"=>"Sources (.src.rpm)<br />(Red Hat 9 - Shrike)",
+ "out"=>sub {
+ my($pkg,$version_base,$version_ext)=@_;
+ return () if $pkg_nosrc{$pkg};
+ my $file="$pkg-$version_base-$version_ext.src.rpm";
+ return $file,$file;
+ },
+ },
+ );
+
+for my $dist (@dist) {
+ print "<tr>";
+ print "<td>".$dist->{"name"}."</td>";
+ for my $casel (1,2,3) {
+ $case=$casel;
+ print "<td>";
+ print join("<br />",map({ my $pkg=$_;
+ my($file,$text)=&{$dist->{"out"}}($pkg,@{$version{$pkg}});
+ (!defined $text ? ($file) || () : (&$a_href_arch("dist/$file",$text)));
+ } @{$pkg{$case}}));
+ print "</td>";
+ }
+ print "</tr>\n";
+ }
+print "<tr style=\"height: 2ex;\"></tr>\n";
+print "<tr>";
+ print "<td>Package Requirements</td>";
+ for my $case (1,23) {
+ print "<td".($case==23 ? ' colspan="2"' : '').">";
+ print join(", ",map("<span class=\"reqpkg\">$_</span>",@{$reqpkg{$case}}));
+ print "</td>";
+ }
+print "</tr>\n";
+print <<"HERE";
+</table>
+
+<blockquote>
+ <p><a name="libxml2_rh8"><b><i>Red Hat 8 Psyche</i> upgrade of <i>libxml2</i> package:</b></a>
+ Upgrade only the packages already installed on your system to prevent
+ many dependency requirements - do not use "<code>rpm -U</code>",
+ use "<code>rpm -F</code>" instead:</p>
+ <blockquote><p class="quote">
+ <code>rpm -F @{[ join(" ",@libxml2_rh8_pkgs) ]}</code>
+ </p></blockquote>
+</blockquote>
+
+@{[ vskip "3ex" ]}
+
+
+<h1>Installation Notes</h1>
+
+<p>You should first run <b>captive-install-acquire</b> command to check your
+available Microsoft Windows drivers versions. Now you can execute:</p>
+
+<blockquote>
+ <p class="quote">
+ # mkdir /mnt/dosc<br />
+ # mount -t captive-ntfs /dev/hda1 /mnt/dosc
+ </p>
+</blockquote>
+
+
+<h2>Overview</h2>
+
+<p>'<b>captive</b>' is the base package. It contains debugging '<b>captive-cmdline</b>' client.<br />
+'<b>captive-lufs</b>' permits mounting NTFS as regular filesystem. It needs '<b>lufs</b>'.<br />
+'<b>lufs</b>' is a daemon to enable userland process to provide filesystem functions.</p>
+
+<p>Any errors from '<b>captive-lufs</b>' are written to '<b>/var/log/messages</b>'.</p>
+
+<p>Needed drivers (at least ntoskrnl.exe+ntfs.sys) must be in '<b>/var/lib/captive</b>'.</p>
+
+<p>'<b>captive</b>' package creates '<b>captive</b>' user and '<b>captive</b>' group on your system.</p>
+
+
+<h2>Package Version Conflicts</h2>
+
+<dl>
+
+<dt>@{[ a_href 'http://lufs.sourceforge.net/lufs/','lufs' ]}</dt>
+<dd><p><b>'captive' version required</b>: Although you may already have the
+original package installed you must replace it by the local 'captive'-marked
+version containing some 'captive'-essential fixes and extensions.</p></dd>
+
+<dt>@{[ a_href 'http://linux-ntfs.sourceforge.net/','ntfsprogs' ]}</dt>
+<dd><p><b>Original version >=200309071734 sufficient</b>:
+The package which is downloadable from here, has no code patches - you can freely use the
+original version instead. Unfortunately, the last public release is
+<b>1.7.1</b> while this project requires at least
+@{[ a_href 'http://linux-ntfs.sourceforge.net/snapshots/','snapshot' ]} version
+<b>@{[ a_href 'http://linux-ntfs.sourceforge.net/snapshots/ntfsprogs-200309071734.tar.bz2','200309071734' ]}</b>
+which is not packaged (.rpm/.deb) yet. Packaged versions are provided here for
+your convenience.</p></dd>
+
+</dl>
+
+
+<h2>LUFS Kernel Driver Module</h2>
+
+<p>@{[ a_href 'http://lufs.sourceforge.net/lufs/','LUFS' ]} (Linux Userland File
+System) needs Linux kernel module driver (<i>lufs.o</i>) compatible with your
+running Linux kernel. The binary driver is supplied already precompiled for many
+Linux kernel versions in the binary packages above (<b>.i386.rpm</b> and
+<b>_i386.deb</b> archives).</p>
+
+<p>If you cannot <b>mount</b>(8) your NTFS filesystem you should run <span
+class="quote">/usr/share/lufs/prepmod</span> to see the reasons. It is always
+recommended to upgrade to the latest stable kernel supplied by your GNU/Linux
+distribution vendor. You may need to install package
+<b>kernel-source</b> (Red Hat) or <b>kernel-headers</b> (Debian) matching your
+Linux kernel version (<b>rpm -q kernel</b>) and re-run <span
+class="quote">/usr/share/lufs/prepmod</span>.</p>
+
+<p><b>WARNING:</b> This 'captive' package may modify your Linux kernel
+sources matching your currently running kernel version. These minor
+modifications may include a dependencies rebuild, compiling build tools, fixes of
+several include files, etc. All the modifications are done at the mount(8) time
+by the automatically executed <span class="quote">/usr/share/lufs/prepmod</span> script.
+This behavior was not present in the original
+@{[ a_href 'http://lufs.sourceforge.net/lufs/','LUFS' ]} distribution
+by @{[ a_href 'http://www.malinux.net/main/','Florin Malita' ]}.</p>
+
+
+HERE
+
+
+print rightimg <<"HERE",'reactos','ReactOS',"a_href"=>'http://www.reactos.com/';
+ <h2>The First Open Source MS-Windows Kernel API for Free OS</h2>
+
+ <p>Compatibility with the existing binary Microsoft Windows file system drivers has been
+ reached. Microsoft Windows kernel system components required by these drivers
+ were analyzed and successfully emulated in the GNU/Linux operating system.
+ The project brings the Microsoft Windows kernel emulation framework to support even
+ other types of Microsoft Windows drivers in the future.
+ The <span class="productname">@{[ a_href 'http://www.reactos.com/','ReactOS' ]}</span>
+ code base proved to be a big asset for this functionality.</p>
+HERE
+
+
+my @lists=qw(captive-announce-list captive-list captive-devel-list);
+
+print <<"HERE";
+
+<a name="lists"><h2>Mailing Lists</h2></a>
+
+<form action="@{[ top_dir("/Mailman.pl") ]}" method="post">
+ <table border="1" class="mailman" style="border-collapse: collapse; border-style: solid; border-width: 1px;">
+ <tr>@{[ map("<th>$_</th>",@lists) ]}</tr>
+ <tr><td>New version announcements<br />
+ (low traffic, recommended)</td>
+ <td>User support,<br />bug reports</td>
+ <td>Development</td>
+ </tr>
+ <tr>@{[ map({ "<td>".a_href(&{$W->{"mailman_url_sub"}}()."/listinfo/$_",'Mailman Infopage')."</td>"; } @lists) ]}</tr>
+ <tr>@{[ map({ "<td>".a_href(&{$W->{"pipermail_url_sub"}}()."/$_",'Archive')."</td>"; } @lists) ]}</tr>
+ <tr>@{[
+ map(('<td><input type="checkbox" name="list" value="'.$_.'"'
+ .($_ ne "captive-announce-list" ? '' : ' checked="checked"')
+ .' /> Subscribe?</td>'),@lists)
+ ]}</tr>
+ <tr><td colspan="3">
+ <table border="0" style="text-align: left;">
+ <tr><td>Email address: </td><td><input type="text" name="email" size="30" /></td></tr>
+ <tr><td>Your new Mailman password:</td><td><input type="password" name="pw" size="15" /></td></tr>
+ <tr><td>Reenter your password: </td><td><input type="password" name="pw-conf" size="15" /></td></tr>
+ </table>
+ <p><input type="submit" name="email-button" value="Subscribe me" /></p>
+ </td></tr>
+ </table>
+<input type="hidden" name="back" value="/project/captive/#lists" />
+</form>
+
+
+@{[ vskip "3ex" ]}
+
+<h1>See Also</h1>
+<ul>
+ <li>@{[ a_href 'Preview.html.pl','<span style="font-size: larger;">Technology Preview</span>' ]}</li>
+ <li>@{[ a_href 'CVS.html.pl','CVS Repository' ]}</li>
+ <li>@{[ a_href 'doc/','Developer Documentation' ]}; highlights:<ul>
+ <li>@{[ a_href 'doc/About.html.pl#versions','Microsoft Windows Versions Compatibility' ]}</li>
+ <li>@{[ a_href 'doc/Architecture.html.pl#law','Laws and Licensing Conditions' ]}</li>
+ <li>@{[ a_href 'doc/Details.html.pl#sandbox','Sandboxing of W32 Filesystem' ]}</li>
+ <li>@{[ a_href 'doc/TODO.html.pl#todo_fsck','TODO: Fsck of NTFS' ]}</li>
+ <li>@{[ a_href 'doc/TODO.html.pl#todo_surprise','TODO: NTFS Support for Partition Surprise' ]}</li>
+ <li>@{[ a_href 'doc/Related.html.pl#LinuxNTFScompet','Related Projects - Linux NTFS' ]}</li>
+ <li>@{[ a_href 'doc/Related.html.pl#vmware','Related Projects - VMware Workstation' ]}</li>
+ <li>@{[ a_href 'doc/LinuxNTFS.html.pl',"Re: 7.7 Can't we write a wrapper for Windows' driver?" ]}</li>
+ </ul></li>
+ <li>@{[ a_href 'http://cvs.jankratochvil.net/viewcvs/*checkout*/captive/TODO?rev=HEAD','Known Bugs' ]}</li>
+ <li>Man Pages<ul>
+ @{[
+ do {
+ my @mans=(
+ 'captive'=>[7,'Microsoft Windows NT kernel emulation for NTFS disk access'],
+ 'mount.captive'=>[8,'mount(8) interface for NTFS disk access'],
+ 'lufs-captivefs'=>[7,'Linux Userland File System module for NTFS as filesystem'],
+ 'captive-cmdline'=>[1,'Command-line client for captive(7) NTFS disk access'],
+### 'captive-sandbox-server'=>[1,'Security+safety wrapper for NTFS disk access'],
+ 'captive-install-acquire'=>[1,'Find MS Windows XP driver files for NTFS'],
+### 'captive-install-fstab'=>[1,'Manage captive-ntfs /etc/fstab entries'],
+ );
+ my @r;
+ while (@mans) {
+ my $file=shift @mans;
+ my($section,$name)=@{shift @mans};
+ push @r,"<li>".a_href("man/$file.pod.html",$file)."($section) - $name</li>\n";
+ }
+ @r;
+ }
+ ]}
+ </ul></li>
+ <li>@{[ a_href 'Resources.html.pl','Related Pages' ]}</li>
+ <li>@{[ a_href 'Thanks.html.pl','Thanks' ]}</li>
+</ul>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::captive' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"Captive",
+ "platform"=>"unixuser",
+ "priority"=>666,
+ "summary"=>"NTFS filesystem, MS-Windows NT kernel emulation",
+ "license"=>"GPL",
+ "maintenance"=>"active",
+ "language"=>"i386 asm, C, Perl",
+ "icon"=>"captive-install-acquire-icon",
+ "cvs-of main tree"=>"captive",
+ "cvs-of branched ".a_href('http://www.reactos.com/','reactos')." subdir"=>"reactos:captive",
+ "cvs-of branched ".a_href('http://lufs.sourceforge.net/lufs/','lufs')=>"lufs:captive",
+ "cvs-of 'httpcaptive://' method"=>"gnome-vfs-httpcaptive:captive",
+ "cvs-of 'libntfs://' method"=>"ntfsprogs-gnomevfs",
+ "description"=><<"HERE",
+<p>The first full read/write access to NTFS disk drivers was achieved in
+the @{[ a_href 'http://www.winehq.com/','Wine' ]} way by using the original
+Microsoft Windows <i>ntfs.sys</i> driver. It emulates the required subsystems of
+the Microsoft Windows kernel by reusing one of the original
+<i>ntoskrnl.exe</i>, @{[ a_href 'http://www.reactos.com/','ReactOS' ]} parts, or
+this project's own reimplementations, on a case by case basis.</p>
+<p>Involvement of the original driver files was chosen to achieve the best
+and unprecedented filesystem compatibility and safety.</p>
+HERE
+ );
+
+1;
-#! /usr/bin/perl
-#
# $Id$
-# Main page of 'My::Project::mdsms'
+# automake source for the Makefile of project/captive/ subdir
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
-use strict;
-use warnings;
-
-use My::Web;
-use project::mdsms::ListItem;
-
+include $(top_srcdir)/Makefile-head.am
-My::Web->init_project(
- "ListItem"=>\%My::Project::mdsms::ListItem,
- );
+SUBDIRS= \
+ doc
-My::Web->footer();
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl \
+ Thanks.html.pl \
+ Resources.html.pl \
+ Preview.html.pl \
+ CVS.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project Preview page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::Preview;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wrequire 'My::Project';
+
+
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Technology Preview',
+ "head_css"=>"
+td { padding: 10px; text-align: center; }
+table { border-collapse: collapse; border-style: solid; }
+",
+ "WebConfig::heading_novskip"=>1,
+ );
+My::Web->heading();
+print My::Project->section("captive");
+
+print "<h1>Captive NTFS Technology Preview</h1>\n";
+
+sub preview_img ($$;$)
+{
+my($file_base,$text,$comment)=@_;
+
+ return <<"HERE";
+<table border="1" align="center">
+<tr><td>@{[ img $file_base,$text ]}</td></tr>
+<tr><td><b>$text</b>@{[ map((!$_ ? "" : "<br />$_"),$comment) ]}</td></tr>
+</table>
+@{[ vskip "3ex" ]}
+HERE
+}
+
+print preview_img 'doc/ntdebug-ntfs','WinDbg Remote NT Kernel NTFS Debugging';
+print preview_img 'doc/dia/arch-all','Captive Components Architecture',''
+ .'<font color="red">Red color</font> indicates Captive components for the most common LUFS use case.<br />'
+ .'<font color="violet">Violet color</font> indicates system components for the most common LUFS use case.';
+print preview_img 'doc/arch-captive','Captive Subsystems Architecture';
+print preview_img 'doc/arch-W32','Original Microsoft Windows Subsystems Architecture';
+print preview_img 'doc/ratio','Functions Reusal Ratio';
+print preview_img 'doc/fig/functype_patched_wrap_fromw32','Code Wrapping of a Call from Microsoft Windows Code';
+print preview_img 'doc/dia/inheritance','Sandboxing Scheme with GObject Inheritance';
+print preview_img 'doc/dia/parent-connector','Parent Connector for Sandbox Slave Restarts Handling';
+print preview_img 'doc/dia/cache-manager','NT Cache Manager Scheme';
+print preview_img 'doc/ntdebug-windbg-boot','Windows NT Remote Kernel Debug Mode During System Boot';
+print preview_img 'doc/dia/TraceFS','TraceFS Debugging Hook for NT Cache Manager Analysis';
+print preview_img 'captive-install-acquire','Captive Microsoft Windows Drivers Acquire Utility';
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project Resources page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::Resources;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wrequire 'My::Project';
+
+
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Internet Resources',
+ "WebConfig::heading_novskip"=>1,
+ );
+My::Web->heading();
+print My::Project->section("captive");
+
+
+print "<h1>Captive NTFS Internet Resources</h1>\n";
+print "<ul>\n";
+ my @URLs=(
+# no longer valid: 'NTFS Preinstallation and Windows XP'=>'http://www.microsoft.com/hwdev/tech/storage/ntfs-preinstallP.asp',
+ 'Linux-NTFS Project'=>'http://linux-ntfs.sourceforge.net/',
+ 'ReactOS Project'=>'http://www.reactos.com/',
+ 'Ext2 File System Driver'=>'http://sys.xiloo.com/projects/projects.htm#ext2fsd',
+ 'Wine Project'=>'http://www.winehq.com/',
+ 'Memory Support and Windows Operating Systems'=>'http://www.microsoft.com/whdc/hwdev/platform/server/PAE/PAEmem.mspx',
+ 'GnomeVFS - Filesystem Abstraction library'=>'http://developer.gnome.org/doc/API/gnome-vfs/',
+ 'Linux Userland File System (LUFS)'=>'http://lufs.sourceforge.net/lufs/',
+ 'Partition Surprise'=>'http://surprise.sourceforge.net/',
+ 'ntfsresize'=>'http://mlf.linux.rulez.org/mlf/ezaz/ntfsresize.html',
+ 'NTPwd NTFS driver'=>'http://www.cgsecurity.org/ntfs.html',
+ 'Microsoft Windows XP Service Pack 1a'
+ =>'http://download.microsoft.com/download/9/7/6/9763833d-bd58-41e2-9911-50f64c7252a3/xpsp1a_en_x86_CHK.exe',
+ 'The NT Cache Manager Description'=>'http://www.osr.com/ntinsider/1996/cacheman.htm',
+ 'Learn About NT'."'".'s File-system Cache'=>'http://www.winntmag.com/Articles/Print.cfm?ArticleID=3864',
+ 'NT File System Developers mailing list'=>'http://www.ntfsd.org/archive/',
+ 'IDA Freeware'=>'http://www.simtel.net/pub/pd/29498.html',
+ 'Argument Passing and Naming Conventions'
+ =>'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core_argument_passing_and_naming_conventions.asp',
+ 'MS-DOS FAT Filesystems Support on Linux'=>'ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/dosfstools/',
+ 'MSDN (Microsoft Developer Network) Kernel-Mode Driver Architecture: Windows DDK'
+ =>'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/kmhdr_6enb.asp',
+ 'GLib, Gnome Utility Library'=>'http://developer.gnome.org/doc/API/2.0/glib/',
+ 'VMware Workstation'=>'http://www.vmware.com/download/workstation.html',
+ );
+ for (my @URLa=@URLs;@URLa;) {
+ my $text=shift @URLa;
+ my $url=shift @URLa;
+ print "\t<li>".a_href($url,CGI::escapeHTML($text))."</li>\n";
+ }
+print "</ul>\n";
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project Thanks page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::Thanks;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wrequire 'My::Project';
+
+
+My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Thanks',
+ "head_css"=>"
+.name { font-style: italic; }
+",
+ "WebConfig::heading_novskip"=>1,
+ "no_job"=>1,
+ );
+My::Web->heading();
+print My::Project->section("captive");
+
+
+print <<'HERE';
+<h1>Captive NTFS Thanks</h1>
+
+<ul>
+HERE
+
+sub name ($;$$)
+{
+my($name,$pos,$why)=@_;
+
+ my $r="<li>";
+ $r.='<span class="name">'.$name.'</span>';
+ $r.=", $pos" if $pos;
+ $r.=" - $why" if $why;
+ $r.="</li>\n";
+ return $r;
+}
+
+print name "Karel Zatoukal",a_href("http://www.sun.com/","Sun Microsystems");
+print name "Tim Boudreau",a_href("http://www.sun.com/","Sun Microsystems");
+print name a_href_cz('http://www.itpravo.cz/admin.shtml?x=45480','Jiri Cermak'),
+ a_href("http://www.bakernet.com/",'Baker & McKenzie'),
+ 'preflight IT law analysis';
+print name a_href('http://www.ucw.cz/~mj/','Martin "MJ" Mares');
+print name "Lubomir Bulej";
+print name "Tomas Bures";
+print name a_href_cz('http://www.vellum.cz/','Lukas "Klokan" Horalek'),undef(),"services hosting";
+print name a_href('http://www-troja.fjfi.cvut.cz/~drab/','Martin Drab'),undef(),
+ "betatesting, ".a_href('http://lufs.sourceforge.net/lufs/','LUFS')." patches";
+print name a_href('http://www.pavouk.org/','Pavel "Pavouk" Ruzicka'),a_href('http://www.gtsgroup.cz/','GTS'),
+ "betatesting";
+print name "Jesse Glick",a_href("http://www.sun.com/","Sun Microsystems"),"betatesting";
+print name a_href_cz('http://vellum.cz/~mikc/','Michal "MIKC" Conos'),undef(),
+ "betatesting";
+print name a_href("http://sys.xiloo.com/","Matt Wu"),
+ a_href("http://sys.xiloo.com/projects/projects.htm#ext2fsd","Ext2fsd")." developer","W32 tips";
+
+print name "Steven Edwards" ,a_href("http://www.reactos.com/","ReactOS")." developer","W32 tips";
+print name "Casper Hornstrup",a_href("http://www.reactos.com/","ReactOS")." developer","W32 tips";
+print <<'HERE';
+<li>Last but not least - Kind greetings to Danese Cooper, Open Source Diva!</li>
+</ul>
+
+HERE
+
+My::Web->footer();
--- /dev/null
+DirectoryIndex index.html
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/captive/ API reference doc
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ captive-apiref-calltype-reactos.html \
+ captive-apiref-init.html \
+ captive-apiref-ldr-exports.html \
+ captive-apiref-ldr.html \
+ captive-apiref-macros.html \
+ captive-apiref-mm.html \
+ captive-apiref-ps-reactos.html \
+ captive-apiref-rtl-file.html \
+ captive-apiref-signal.html \
+ captive-apiref-storage.html \
+ captive-apiref-unicode-reactos.html \
+ captive-apiref-unicode.html \
+ captive-apiref.devhelp \
+ ch01.html \
+ index.html \
+ home.png \
+ left.png \
+ right.png \
+ up.png
+
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>calltype_reactos</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-ldr-exports.html" title="ldr_exports"><link rel="next" href="captive-apiref-signal.html" title="signal"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-ldr-exports.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-signal.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-calltype-reactos"></a><div class="titlepage"></div><div class="refnamediv"><h2>calltype_reactos</h2><p>calltype_reactos — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+#define <a href="captive-apiref-calltype-reactos.html#CAPTIVE-CDECL-CAPS">CAPTIVE_CDECL</a>
+#define <a href="captive-apiref-calltype-reactos.html#CAPTIVE-STDCALL-CAPS">CAPTIVE_STDCALL</a>
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="CAPTIVE-CDECL-CAPS"></a>CAPTIVE_CDECL</h3><pre class="programlisting">#define CAPTIVE_CDECL __attribute__((__cdecl__))
+</pre><p>
+Function call type declaration for the real CDECL call type.
+As the default CDECL macro gets disabled (=NOP) during reactos sources
+compilation (and gets undefined to cause error during non-reactos sources
+compilation) you have the chance to do the real CDECL declaration
+by using <a href="captive-apiref-calltype-reactos.html#CAPTIVE-CDECL-CAPS">CAPTIVE_CDECL</a>. You must ifdef it by <tt>LIBCAPTIVE</tt> symbol as it
+is not available during standalone reactos compilation.
+</p><p>
+This macro may be needed to pass control to W32 binary code.</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-STDCALL-CAPS"></a>CAPTIVE_STDCALL</h3><pre class="programlisting">#define CAPTIVE_STDCALL __attribute__((__stdcall__))
+</pre><p>
+Function call type declaration for the real STDCALL call type.
+As the default STDCALL macro gets disabled (=NOP) during reactos sources
+compilation (and gets undefined to cause error during non-reactos sources
+compilation) you have the chance to do the real STDCALL declaration
+by using <a href="captive-apiref-calltype-reactos.html#CAPTIVE-STDCALL-CAPS">CAPTIVE_STDCALL</a>. You must ifdef it by <tt>LIBCAPTIVE</tt> symbol as it
+is not available during standalone reactos compilation.
+</p><p>
+This macro may be needed to pass control to W32 binary code.</p><p>
+
+</p></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-ldr-exports.html"><b><< ldr_exports</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-signal.html"><b>signal >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>init</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="ch01.html" title="Operation Captive"><link rel="next" href="captive-apiref-ldr.html" title="ldr"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="ch01.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-ldr.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-init"></a><div class="titlepage"></div><div class="refnamediv"><h2>init</h2><p>init — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gboolean <a href="captive-apiref-init.html#captive-init">captive_init</a> (void);
+gboolean <a href="captive-apiref-init.html#captive-shutdown">captive_shutdown</a> (void);
+void <a href="captive-apiref-init.html#captive-log-init">captive_log_init</a> (const struct captive_options *captive_options);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-init"></a>captive_init ()</h3><pre class="programlisting">gboolean captive_init (void);</pre><p>
+Expects captive_options: Parsed by captive_options_parse().
+<tt>NULL</tt> value is forbidden. Field image_iochannel <tt>NULL</tt> value is forbidden.
+</p><p>
+Initializes <tt>libcaptive</tt> and loads the specified filesystem.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if successfuly initialized.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-shutdown"></a>captive_shutdown ()</h3><pre class="programlisting">gboolean captive_shutdown (void);</pre><p>
+Closes down <tt>libcaptive</tt>. It should flush all pending buffers and successfuly
+close the filesystem. Variable captive_options->image_iochannel will not be set to <tt>NULL</tt>,
+you should close such channel yourself.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if successfuly shutdown.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-log-init"></a>captive_log_init ()</h3><pre class="programlisting">void captive_log_init (const struct captive_options *captive_options);</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>captive_options</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="ch01.html"><b><< Operation Captive</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-ldr.html"><b>ldr >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>ldr_exports</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-storage.html" title="storage"><link rel="next" href="captive-apiref-calltype-reactos.html" title="calltype_reactos"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-storage.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-calltype-reactos.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-ldr-exports"></a><div class="titlepage"></div><div class="refnamediv"><h2>ldr_exports</h2><p>ldr_exports — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gboolean <a href="captive-apiref-ldr-exports.html#captive-kernel-exports">captive_kernel_exports</a> (void);
+gboolean <a href="captive-apiref-ldr-exports.html#captive-kernel-patches">captive_kernel_patches</a> (void);
+gboolean <a href="captive-apiref-ldr-exports.html#captive-ModuleList-add-builtin">captive_ModuleList_add_builtin</a> (const gchar *FullName_utf8,
+ ...);
+gboolean <a href="captive-apiref-ldr-exports.html#captive-ModuleList-patch">captive_ModuleList_patch</a> (const gchar *FullName_utf8,
+ ...);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-kernel-exports"></a>captive_kernel_exports ()</h3><pre class="programlisting">gboolean captive_kernel_exports (void);</pre><p>
+Export complete libcaptive modules to reactos. It is done by *.def files used
+by dlltool(1) of Mingw32 compiler suite. We use native host OS compiler and
+we also have just a limited set of functions over reactos itself.
+We use our <a href="captive-apiref-ldr-exports.html#captive-ModuleList-add-builtin">captive_ModuleList_add_builtin</a>() to simulate PE headers exporting
+our symbols; this export simulation is invocated from this function.
+</p><p>
+This function is generated automatically from exports.captivesym file
+by captivesym.pl script.
+</p><p>
+Multiple calls of this function are forbidden. See also <a href="captive-apiref-ldr-exports.html#captive-kernel-patches">captive_kernel_patches</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the export was successful.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-kernel-patches"></a>captive_kernel_patches ()</h3><pre class="programlisting">gboolean captive_kernel_patches (void);</pre><p>
+Patches W32 libraries by libcaptive functions. It is done by *.def files used
+by dlltool(1) of Mingw32 compiler suite. We use native host OS compiler and
+we also have just a limited set of functions over reactos itself.
+We use our <a href="captive-apiref-ldr-exports.html#captive-ModuleList-patch">captive_ModuleList_patch</a>() to modify existing module function
+tables generated from <a href="captive-apiref-ldr-exports.html#captive-ModuleList-add-builtin">captive_ModuleList_add_builtin</a>().
+</p><p>
+This function is generated automatically from exports.captivesym file
+by captivesym.pl script.
+</p><p>
+Multiple calls of this function are forbidden. See also <a href="captive-apiref-ldr-exports.html#captive-kernel-exports">captive_kernel_exports</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the export was successful.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ModuleList-add-builtin"></a>captive_ModuleList_add_builtin ()</h3><pre class="programlisting">gboolean captive_ModuleList_add_builtin (const gchar *FullName_utf8,
+ ...);</pre><p>
+Adds simulated built-in module to ModuleListHead module list.
+It can be used for the functionality of reactos/ntoskrnl/ldr/loader.c/LdrInitModuleManagement().
+libcaptive does not support Ordinals - we just pretend liner (<tt>0</tt>-based)
+Ordinal numbers of the functions in given @... stdargs order.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>FullName_utf8</tt></i>Â :</span></td><td> String to fill in PMODULE_OBJECT->FullName.
+</td></tr><tr><td><span class="term"><i><tt>...</tt></i>Â :</span></td><td> (const gchar *sym_name,void *sym_val) symbol list terminated by <tt>NULL</tt>.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the module was successfuly added.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ModuleList-patch"></a>captive_ModuleList_patch ()</h3><pre class="programlisting">gboolean captive_ModuleList_patch (const gchar *FullName_utf8,
+ ...);</pre><p>
+Patches existing <i><tt>FullName_utf8</tt></i> module to use for function named sym_name
+pointer to the handler sym_val. If patchpoint is not <tt>NULL</tt> it gets assigned the original
+pointer value (used for <tt>pass</tt> keyword in exports.captivesym).
+</p><p>
+Put here 0xF4 'hlt' instead of 0xCC 'int $0x3; breakpoint'
+as 'hlt' will generate handled SIGSEGV instead of SIGTRAP which
+is used by gdb(1) during debugging.
+See also libcaptive/ps/signal.c/ sigaction_SIGSEGV().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>FullName_utf8</tt></i>Â :</span></td><td> String to find PMODULE_OBJECT by FullName.
+</td></tr><tr><td><span class="term"><i><tt>...</tt></i>Â :</span></td><td> (const gchar *sym_name,void (*sym_val)(void),struct captive_ModuleList_patchpoint *patchpoint) symbol list terminated by <tt>NULL</tt>.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the module was successfuly added.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-storage.html"><b><< storage</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-calltype-reactos.html"><b>calltype_reactos >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>ldr</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-init.html" title="init"><link rel="next" href="captive-apiref-macros.html" title="macros"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-init.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-macros.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-ldr"></a><div class="titlepage"></div><div class="refnamediv"><h2>ldr</h2><p>ldr — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+NTSTATUS <a href="captive-apiref-ldr.html#captive-LdrpLoadAndCallImage">captive_LdrpLoadAndCallImage</a> (PMODULE_OBJECT *ModuleObjectp,
+ struct captive_options_module *options_module,
+ PDRIVER_OBJECT DriverEntry_DriverObject,
+ PUNICODE_STRING DriverEntry_RegistryPath);
+NTSTATUS <a href="captive-apiref-ldr.html#captive-LdrLoadModule">captive_LdrLoadModule</a> (struct captive_options_module *options_module,
+ PMODULE_OBJECT *ModuleObjectp);
+G_CONST_RETURN gchar* <a href="captive-apiref-ldr.html#captive-ModuleList-function-disable-find">captive_ModuleList_function_disable_find</a>
+ (gconstpointer ExportAddress);
+void* <a href="captive-apiref-ldr.html#captive-Module-GetExportAddress">captive_Module_GetExportAddress</a> (const gchar *ModuleName_utf8,
+ const gchar *FunctionName);
+void <a href="captive-apiref-ldr.html#captive-PoQueueShutdownWorkItem-hooklist-invoke">captive_PoQueueShutdownWorkItem_hooklist_invoke</a>
+ (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-LdrpLoadAndCallImage"></a>captive_LdrpLoadAndCallImage ()</h3><pre class="programlisting">NTSTATUS captive_LdrpLoadAndCallImage (PMODULE_OBJECT *ModuleObjectp,
+ struct captive_options_module *options_module,
+ PDRIVER_OBJECT DriverEntry_DriverObject,
+ PUNICODE_STRING DriverEntry_RegistryPath);</pre><p>
+Corresponds to reactos LdrpLoadAndCallImage() but it also provides arguments
+to pass to PDRIVER_INITIALIZE call of module driver initialization.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>ModuleObjectp</tt></i>Â :</span></td><td> Returns PMODULE_OBJECT successfuly loaded.
+</td></tr><tr><td><span class="term"><i><tt>options_module</tt></i>Â :</span></td><td> captive_options_module structure describing the module to load.
+Loading of already loaded module is forbidden despite original
+LdrpLoadAndCallImage().
+</td></tr><tr><td><span class="term"><i><tt>DriverEntry_DriverObject</tt></i>Â :</span></td><td> argument DriverObject of PDRIVER_INITIALIZE call.
+</td></tr><tr><td><span class="term"><i><tt>DriverEntry_RegistryPath</tt></i>Â :</span></td><td> argument RegistryPath of PDRIVER_INITIALIZE call.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> STATUS_SUCCESS if the driver module was loaded and initialized
+successfuly during this call. Ignore returned <i><tt>ModuleObjectp</tt></i> if function failed.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-LdrLoadModule"></a>captive_LdrLoadModule ()</h3><pre class="programlisting">NTSTATUS captive_LdrLoadModule (struct captive_options_module *options_module,
+ PMODULE_OBJECT *ModuleObjectp);</pre><p>
+Load and initialize module to reactos using host OS functions.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>options_module</tt></i>Â :</span></td><td> captive_options_module structure describing the module to load.
+Loading of already loaded module is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>ModuleObjectp</tt></i>Â :</span></td><td> Returns initialized module object.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> STATUS_SUCCESS if the module was loaded successfuly during the call.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ModuleList-function-disable-find"></a>captive_ModuleList_function_disable_find ()</h3><pre class="programlisting">G_CONST_RETURN gchar* captive_ModuleList_function_disable_find
+ (gconstpointer ExportAddress);</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>ExportAddress</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-Module-GetExportAddress"></a>captive_Module_GetExportAddress ()</h3><pre class="programlisting">void* captive_Module_GetExportAddress (const gchar *ModuleName_utf8,
+ const gchar *FunctionName);</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>ModuleName_utf8</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><i><tt>FunctionName</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-PoQueueShutdownWorkItem-hooklist-invoke"></a>captive_PoQueueShutdownWorkItem_hooklist_invoke ()</h3><pre class="programlisting">void captive_PoQueueShutdownWorkItem_hooklist_invoke
+ (void);</pre><p>
+
+</p></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-init.html"><b><< init</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-macros.html"><b>macros >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>macros</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-ldr.html" title="ldr"><link rel="next" href="captive-apiref-mm.html" title="mm"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-ldr.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-mm.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-macros"></a><div class="titlepage"></div><div class="refnamediv"><h2>macros</h2><p>macros — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+#define <a href="captive-apiref-macros.html#CAPTIVE-FAKEUSE-CAPS">CAPTIVE_FAKEUSE</a>
+#define <a href="captive-apiref-macros.html#captive-newn">captive_newn</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-new0n">captive_new0n</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-renewn">captive_renewn</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-new">captive_new</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-new0">captive_new0</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-newn-alloca">captive_newn_alloca</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-new0n-alloca">captive_new0n_alloca</a> (objp,n)
+#define <a href="captive-apiref-macros.html#captive-new-alloca">captive_new_alloca</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-new0-alloca">captive_new0_alloca</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-memdup">captive_memdup</a> (destp,srcp)
+#define <a href="captive-apiref-macros.html#captive-va-arg">captive_va_arg</a> (objp,ap)
+#define <a href="captive-apiref-macros.html#CAPTIVE-MEMZERO-CAPS">CAPTIVE_MEMZERO</a> (objp)
+#define <a href="captive-apiref-macros.html#captive-printf-alloca">captive_printf_alloca</a> (format,args...)
+#define <a href="captive-apiref-macros.html#captive-strdup-alloca">captive_strdup_alloca</a> (string)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-DOWN-CAPS">CAPTIVE_ROUND_DOWN</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-DOWN64-CAPS">CAPTIVE_ROUND_DOWN64</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-DOWN-EXCEEDING-CAPS">CAPTIVE_ROUND_DOWN_EXCEEDING</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-DOWN-EXCEEDING64-CAPS">CAPTIVE_ROUND_DOWN_EXCEEDING64</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-UP-CAPS">CAPTIVE_ROUND_UP</a> (pointer,fragment)
+#define <a href="captive-apiref-macros.html#CAPTIVE-ROUND-UP64-CAPS">CAPTIVE_ROUND_UP64</a> (pointer,fragment)
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="CAPTIVE-FAKEUSE-CAPS"></a>CAPTIVE_FAKEUSE</h3><pre class="programlisting">#define CAPTIVE_FAKEUSE =0
+</pre><p>
+Prevent 'might be used uninitialized' warning.
+Macro will fakes the use of the variable as sometimes GCC can't code flow
+analyse C correctly.
+</p><p>
+</p><div class="informalexample"><pre class="programlisting">
+g_some_type some_variable CAPTIVE_FAKEUSE;
+</pre></div><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-newn"></a>captive_newn()</h3><pre class="programlisting">#define captive_newn(objp,n) ((objp)=g_new(typeof(*(objp)),(n)))
+</pre><p>
+Macro to allocate <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory may contain garbage.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be allocated.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (<tt>NULL</tt> assignment effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new0n"></a>captive_new0n()</h3><pre class="programlisting">#define captive_new0n(objp,n) ((objp)=g_new0(typeof(*(objp)),(n)))
+</pre><p>
+Macro to allocate <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory is precleared.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the cleared memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be allocated and precleared.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (<tt>NULL</tt> assignment effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-renewn"></a>captive_renewn()</h3><pre class="programlisting">#define captive_renewn(objp,n)</pre><p>
+Macro to reallocate the original memory stored in <i><tt>objp</tt></i>
+to the size <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+New allocated space may contain garbage. Both <i><tt>objp</tt></i> and <i><tt>n</tt></i> can be nonexclusively
+passed as zero.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be reallocated.
+Value <tt>NULL</tt> is permitted (g_malloc() effect).
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (g_free() effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new"></a>captive_new()</h3><pre class="programlisting">#define captive_new(objp) (captive_newn((objp),1))
+</pre><p>
+Macro to allocate one object of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory may contain garbage. Equivalent to captive_newn(objp,1) call.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp)).
+Value <tt>NULL</tt> is never returned.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the object wished to be allocated.
+Original value is discarded.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new0"></a>captive_new0()</h3><pre class="programlisting">#define captive_new0(objp) (captive_new0n((objp),1))
+</pre><p>
+Macro to allocate one object of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory is precleared. Equivalent to captive_new0n(objp,1) call.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the cleared memory of size sizeof(typeof(*objp)).
+Value <tt>NULL</tt> is never returned.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the object wished to be allocated and precleared.
+Original value is discarded.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-newn-alloca"></a>captive_newn_alloca()</h3><pre class="programlisting">#define captive_newn_alloca(objp,n)</pre><p>
+Macro to allocate <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory may contain garbage.
+</p><p>
+Memory is allocated on the stack frame by g_alloca() and it will be automatically deallocated
+during exit of current function (or current block if variable sized variables present there).
+You cannot deallocate or reallocate such memory in any other way.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be allocated.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (<tt>NULL</tt> assignment effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new0n-alloca"></a>captive_new0n_alloca()</h3><pre class="programlisting">#define captive_new0n_alloca(objp,n)</pre><p>
+Macro to allocate <i><tt>n</tt></i> objects of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory is precleared.
+</p><p>
+Memory is allocated on the stack frame by g_alloca() and it will be automatically deallocated
+during exit of current function (or current block if variable sized variables present there).
+You cannot deallocate or reallocate such memory in any other way.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the cleared memory of size sizeof(typeof(*objp))*n.
+Value <tt>NULL</tt> is returned iff <i><tt>n</tt></i>==<tt>0</tt>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the objects wished to be allocated and precleared.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>n</tt></i>Â :</span></td><td> Numbers of objects to be allocated. Value <tt>0</tt> is permitted (<tt>NULL</tt> assignment effect).
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new-alloca"></a>captive_new_alloca()</h3><pre class="programlisting">#define captive_new_alloca(objp) (captive_newn_alloca((objp),1))
+</pre><p>
+Macro to allocate one object of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory may contain garbage. Equivalent to captive_newn_alloca(objp,1) call.
+</p><p>
+Memory is allocated on the stack frame by g_alloca() and it will be automatically deallocated
+during exit of current function (or current block if variable sized variables present there).
+You cannot deallocate or reallocate such memory in any other way.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the memory of size sizeof(typeof(*objp)).
+Value <tt>NULL</tt> is never returned.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the object wished to be allocated.
+Original value is discarded.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-new0-alloca"></a>captive_new0_alloca()</h3><pre class="programlisting">#define captive_new0_alloca(objp) (captive_new0n_alloca((objp),1))
+</pre><p>
+Macro to allocate one object of type *<i><tt>objp</tt></i> and to assign the resulting pointer to <i><tt>objp</tt></i>.
+Allocated memory is precleared. Equivalent to captive_new0n_alloca(objp,1) call.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value as the cleared memory of size sizeof(typeof(*objp)).</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable with the pointer to the object wished to be allocated and precleared.
+Original value is discarded.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-memdup"></a>captive_memdup()</h3><pre class="programlisting">#define captive_memdup(destp,srcp)</pre><p>
+Macro to similiar to g_memdup() but the object size is detected automatically.
+Size of <i><tt>destp</tt></i> object and <i><tt>srcp</tt></i> object must be the same.
+</p><p>
+You must free the allocated memory of <i><tt>destp</tt></i> by g_free().
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>destp</tt></i> value as the copied memory of size sizeof(typeof(*srcp)).</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>destp</tt></i>Â :</span></td><td> Variable with the pointer to the target object wished to be allocated.
+Original value is discarded.
+</td></tr><tr><td><span class="term"><i><tt>srcp</tt></i>Â :</span></td><td> Pointer to the source object to be copied to <i><tt>destp</tt></i>.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-va-arg"></a>captive_va_arg()</h3><pre class="programlisting">#define captive_va_arg(objp,ap) ((objp)=va_arg((ap),typeof(objp)))
+</pre><p>
+Automatically determines the size of <i><tt>objp</tt></i>.
+Equivalent to objp=va_arg(ap,typeof(objp)) call.
+</p><p>
+<i><tt>Returns</tt></i>: Initialized <i><tt>objp</tt></i> value.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Variable to be filled from the next argument of <i><tt>ap</tt></i>.
+</td></tr><tr><td><span class="term"><i><tt>ap</tt></i>Â :</span></td><td> Initialized va_list type.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-MEMZERO-CAPS"></a>CAPTIVE_MEMZERO()</h3><pre class="programlisting">#define CAPTIVE_MEMZERO(objp) (memset((objp),0,sizeof(*(objp))))
+</pre><p>
+Clears the sizeof(*<i><tt>objp</tt></i>) bytes of the given pointer with memset().
+Pass _pointer_ to the object to be cleared.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>objp</tt></i>Â :</span></td><td> Pointer to the variable to be cleared.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-printf-alloca"></a>captive_printf_alloca()</h3><pre class="programlisting">#define captive_printf_alloca(format,args...)</pre><p>
+Format the given format string <i><tt>format</tt></i> as in sprintf().
+Output buffer is allocated automatically and it does not need to be deallocated
+manually as it is managed by g_alloca().
+</p><p>
+<i><tt>Returns</tt></i>: Formatted output string located in g_alloca() memory.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>format</tt></i>Â :</span></td><td> Format string. See the sprintf() documentation.
+</td></tr><tr><td><span class="term"><i><tt>args...</tt></i>Â :</span></td><td> Arguments for <i><tt>format</tt></i>. See the sprintf() documentation.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-strdup-alloca"></a>captive_strdup_alloca()</h3><pre class="programlisting">#define captive_strdup_alloca(string)</pre><p>
+Macro to do g_strdup() equivalent in g_alloca() style.
+</p><p>
+Memory is allocated on the stack frame by g_alloca() and it will be automatically deallocated
+during exit of current function (or current block if variable sized variables present there).
+You cannot deallocate or reallocate such memory in any other way.
+</p><p>
+<i><tt>Returns</tt></i>: Duplicated <i><tt>string</tt></i>. You may modify its items if the length is not changed.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string</tt></i>Â :</span></td><td> const gchar * string to duplicate.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-DOWN-CAPS"></a>CAPTIVE_ROUND_DOWN()</h3><pre class="programlisting">#define CAPTIVE_ROUND_DOWN(pointer,fragment)</pre><p>
+General pointer down-rounding macro. Already aligned pointer is left as is.
+</p><p>
+glib NOTE: YOU MAY NOT STORE POINTERS IN INTEGERS.
+</p><p>
+<i><tt>Returns</tt></i>: Down-rounded <i><tt>pointer</tt></i> to the integer multiple of <i><tt>fragment</tt></i>.
+Resulting pointer has the same type as <i><tt>pointer</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td> Arbitrary pointer type.
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td> Amount of 'sizeof(char)' to align <i><tt>pointer</tt></i> down to.
+This size will be typically a power of 2.
+Value less or equal to <tt>0</tt> is forbidden.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-DOWN64-CAPS"></a>CAPTIVE_ROUND_DOWN64()</h3><pre class="programlisting">#define CAPTIVE_ROUND_DOWN64(pointer,fragment)</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-DOWN-EXCEEDING-CAPS"></a>CAPTIVE_ROUND_DOWN_EXCEEDING()</h3><pre class="programlisting">#define CAPTIVE_ROUND_DOWN_EXCEEDING(pointer,fragment)</pre><p>
+Detects current non-aligned amount of data exceeding over integer multiple of <i><tt>fragment</tt></i>.
+It will return value <tt>0</tt> for an aligned pointer.
+</p><p>
+glib NOTE: YOU MAY NOT STORE POINTERS IN INTEGERS.
+</p><p>
+<i><tt>Returns</tt></i>: gsize typed number of bytes exceeding over integer multiple of <i><tt>fragment</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td> Arbitrary pointer type.
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td> Amount of 'sizeof(char)' to detect down-alignment amount of <i><tt>pointer</tt></i> for.
+This size will be typically a power of 2.
+Value less or equal to <tt>0</tt> is forbidden.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-DOWN-EXCEEDING64-CAPS"></a>CAPTIVE_ROUND_DOWN_EXCEEDING64()</h3><pre class="programlisting">#define CAPTIVE_ROUND_DOWN_EXCEEDING64(pointer,fragment)</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-UP-CAPS"></a>CAPTIVE_ROUND_UP()</h3><pre class="programlisting">#define CAPTIVE_ROUND_UP(pointer,fragment)</pre><p>
+General pointer up-rounding macro. Already aligned pointer is left as is.
+</p><p>
+glib NOTE: YOU MAY NOT STORE POINTERS IN INTEGERS.
+</p><p>
+<i><tt>Returns</tt></i>: Up-rounded <i><tt>pointer</tt></i> to the integer multiple of <i><tt>fragment</tt></i>.
+Resulting pointer has the same type as <i><tt>pointer</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td> Arbitrary pointer type.
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td> Amount of 'sizeof(char)' to align <i><tt>pointer</tt></i> up to.
+This size will be typically a power of 2.
+Value less or equal to <tt>0</tt> is forbidden.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="CAPTIVE-ROUND-UP64-CAPS"></a>CAPTIVE_ROUND_UP64()</h3><pre class="programlisting">#define CAPTIVE_ROUND_UP64(pointer,fragment)</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>pointer</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><i><tt>fragment</tt></i>Â :</span></td><td>
+
+
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-ldr.html"><b><< ldr</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-mm.html"><b>mm >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>mm</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-macros.html" title="macros"><link rel="next" href="captive-apiref-ps-reactos.html" title="ps_reactos"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-macros.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-ps-reactos.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-mm"></a><div class="titlepage"></div><div class="refnamediv"><h2>mm</h2><p>mm — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gint <a href="captive-apiref-mm.html#captive-flProtect-to-mmap-prot">captive_flProtect_to_mmap_prot</a> (ULONG flProtect);
+gboolean <a href="captive-apiref-mm.html#captive-mmap-map-new">captive_mmap_map_new</a> (gconstpointer addr,
+ size_t len,
+ int mmap_prot);
+gint <a href="captive-apiref-mm.html#captive-mmap-map-get">captive_mmap_map_get</a> (gconstpointer addr);
+gboolean <a href="captive-apiref-mm.html#captive-mmap-map-set">captive_mmap_map_set</a> (gconstpointer addr,
+ int mmap_prot);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-flProtect-to-mmap-prot"></a>captive_flProtect_to_mmap_prot ()</h3><pre class="programlisting">gint captive_flProtect_to_mmap_prot (ULONG flProtect);</pre><p>
+Map reactos flProtect to mprotect(2)-compatible "prot" argument.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>flProtect</tt></i>Â :</span></td><td> reactos compatible constant such as <tt>PAGE_READWRITE</tt>.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> mmap(2) compatible <i><tt>prot</tt></i> argument.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-mmap-map-new"></a>captive_mmap_map_new ()</h3><pre class="programlisting">gboolean captive_mmap_map_new (gconstpointer addr,
+ size_t len,
+ int mmap_prot);</pre><p>
+Initialize the protection map for the specified memory block.
+Any existing protections in the specified block are forbidden.
+</p><p>
+This function does not do any mprotect(2) style, it just stores
+the settings for the later <tt>OR</tt> operations by MmSetPageProtect().
+Caller is responsibel to set the same protections as the given <i><tt>mmap_prot</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>addr</tt></i>Â :</span></td><td> <tt>PAGE_SIZE</tt> aligned address of memory block.
+<tt>NULL</tt> value is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>len</tt></i>Â :</span></td><td> <tt>PAGE_SIZE</tt> aligned length of memory block.
+Value <tt>0</tt> is permitted. Value <tt>-1</tt> is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>mmap_prot</tt></i>Â :</span></td><td> Protections for the memory block as specified by <i><tt>prot</tt></i> of mprotect(2).
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the protection storage was successful.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-mmap-map-get"></a>captive_mmap_map_get ()</h3><pre class="programlisting">gint captive_mmap_map_get (gconstpointer addr);</pre><p>
+Query the protection settings at <i><tt>addr</tt></i> address.
+The given <i><tt>addr</tt></i> block of <tt>PAGE_SIZE</tt> must be already initialized
+by <a href="captive-apiref-mm.html#captive-mmap-map-new">captive_mmap_map_new</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>addr</tt></i>Â :</span></td><td> <tt>PAGE_SIZE</tt> aligned address of memory block.
+<tt>NULL</tt> value is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> Protections of the page as specified by <i><tt>prot</tt></i> of mprotect(2)
+if successful. Value <tt>-1</tt> if failed.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-mmap-map-set"></a>captive_mmap_map_set ()</h3><pre class="programlisting">gboolean captive_mmap_map_set (gconstpointer addr,
+ int mmap_prot);</pre><p>
+Set the protection settings at <i><tt>addr</tt></i> address.
+The given <i><tt>addr</tt></i> block of <tt>PAGE_SIZE</tt> must be already initialized
+by <a href="captive-apiref-mm.html#captive-mmap-map-new">captive_mmap_map_new</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>addr</tt></i>Â :</span></td><td> <tt>PAGE_SIZE</tt> aligned address of memory block.
+<tt>NULL</tt> value is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>mmap_prot</tt></i>Â :</span></td><td> Protections for the memory block as specified by <i><tt>prot</tt></i> of mprotect(2).
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the protections were successfuly set.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-macros.html"><b><< macros</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-ps-reactos.html"><b>ps_reactos >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>ps_reactos</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-mm.html" title="mm"><link rel="next" href="captive-apiref-unicode.html" title="unicode"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-mm.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-unicode.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-ps-reactos"></a><div class="titlepage"></div><div class="refnamediv"><h2>ps_reactos</h2><p>ps_reactos — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+typedef <a href="captive-apiref-ps-reactos.html#captive-KPCR">captive_KPCR</a>;
+typedef <a href="captive-apiref-ps-reactos.html#captive-PKPCR">captive_PKPCR</a>;
+<a href="captive-apiref-ps-reactos.html#captive-PKPCR">captive_PKPCR</a> <a href="captive-apiref-ps-reactos.html#captive-KeGetCurrentKPCR">captive_KeGetCurrentKPCR</a> (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-KPCR"></a>captive_KPCR</h3><pre class="programlisting">typedef struct {
+ struct
+ /* newline to pass gtkdoc-scan */
+ _KTHREAD *CurrentThread;
+ } captive_KPCR;
+</pre><p>
+PCR (Processor Control Region) structure type.
+Returned by <a href="captive-apiref-ps-reactos.html#captive-KeGetCurrentKPCR">captive_KeGetCurrentKPCR</a>().
+</p><p>
+This structure IS NOT binary compatible with reactos!</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-PKPCR"></a>captive_PKPCR</h3><pre class="programlisting">typedef captive_KPCR *captive_PKPCR;
+</pre><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-KeGetCurrentKPCR"></a>captive_KeGetCurrentKPCR ()</h3><pre class="programlisting"><a href="captive-apiref-ps-reactos.html#captive-PKPCR">captive_PKPCR</a> captive_KeGetCurrentKPCR (void);</pre><p>
+Returns the PCR (Processor Control Region) structure for the
+current CPU.
+Currently libcaptive doesn't use multithreading
+and thus this function returns a constant pointer to one static structure.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <a href="captive-apiref-ps-reactos.html#captive-PKPCR">captive_PKPCR</a> type pointer to valid <a href="captive-apiref-ps-reactos.html#captive-KPCR">captive_KPCR</a>.
+This structure IS NOT binary compatible with reactos - you SHOULD NOT
+export this symbol for binary W32 modules. Anyone using this function
+is very low-level based and you would probably find many other
+compatibility problems afterwards - replace of such function is recommended.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-mm.html"><b><< mm</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-unicode.html"><b>unicode >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>rtl-file</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-signal.html" title="signal"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-signal.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th></tr></table><div class="refentry" lang="en"><a name="captive-apiref-rtl-file"></a><div class="titlepage"></div><div class="refnamediv"><h2>rtl-file</h2><p>rtl-file — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gpointer <a href="captive-apiref-rtl-file.html#captive-rtl-file-mmap">captive_rtl_file_mmap</a> (size_t *lenp,
+ const gchar *path,
+ int open_flags,
+ int mmap_prot,
+ int mmap_flags);
+void <a href="captive-apiref-rtl-file.html#captive-rtl-file-munmap">captive_rtl_file_munmap</a> (gpointer base);
+gpointer <a href="captive-apiref-rtl-file.html#captive-rtl-file-read">captive_rtl_file_read</a> (gint fd,
+ gsize *bufsizep);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-rtl-file-mmap"></a>captive_rtl_file_mmap ()</h3><pre class="programlisting">gpointer captive_rtl_file_mmap (size_t *lenp,
+ const gchar *path,
+ int open_flags,
+ int mmap_prot,
+ int mmap_flags);</pre><p>
+mmap(2) the whole file into memory.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>lenp</tt></i>Â :</span></td><td> returns the file length if successful. <tt>NULL</tt> pointer permitted.
+</td></tr><tr><td><span class="term"><i><tt>path</tt></i>Â :</span></td><td> File pathname to open(2).
+</td></tr><tr><td><span class="term"><i><tt>open_flags</tt></i>Â :</span></td><td> open(2) parameter flags such as <tt>O_RDONLY</tt>.
+</td></tr><tr><td><span class="term"><i><tt>mmap_prot</tt></i>Â :</span></td><td> mmap(2) parameter prot such as <tt>PROT_READ</tt>.
+</td></tr><tr><td><span class="term"><i><tt>mmap_flags</tt></i>Â :</span></td><td> mmap(2) parameter flags such as <tt>MAP_SHARED</tt>.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> address base with mmap(2)ed file (and <i><tt>lenp</tt></i> filled) or NULL if error.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-rtl-file-munmap"></a>captive_rtl_file_munmap ()</h3><pre class="programlisting">void captive_rtl_file_munmap (gpointer base);</pre><p>
+munmap(2) the whole file and destroy all its resources.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>base</tt></i>Â :</span></td><td> file base address returned by <a href="captive-apiref-rtl-file.html#captive-rtl-file-mmap">captive_rtl_file_mmap</a>(). <tt>NULL</tt> pointer forbidden.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-rtl-file-read"></a>captive_rtl_file_read ()</h3><pre class="programlisting">gpointer captive_rtl_file_read (gint fd,
+ gsize *bufsizep);</pre><p>
+Reads the whole file into memory.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>fd</tt></i>Â :</span></td><td> file-descriptor to read data from.
+</td></tr><tr><td><span class="term"><i><tt>bufsizep</tt></i>Â :</span></td><td> Returns the size of resulting data.
+<tt>NULL</tt> pointer is permitted.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> address base of the memory being filled with file contents.
+Free the area by g_free() if no longer used.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-signal.html"><b><<Â signal</b></a></td><td align="right"></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>signal</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-calltype-reactos.html" title="calltype_reactos"><link rel="next" href="captive-apiref-rtl-file.html" title="rtl-file"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-calltype-reactos.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-rtl-file.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-signal"></a><div class="titlepage"></div><div class="refnamediv"><h2>signal</h2><p>signal — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+gboolean <a href="captive-apiref-signal.html#captive-signal-init">captive_signal_init</a> (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-signal-init"></a>captive_signal_init ()</h3><pre class="programlisting">gboolean captive_signal_init (void);</pre><p>
+Initialize UNIX signal handling to be able to emulate foreign W32
+instructions. These instructions must be located inside address
+space of foreign W32 binary code which is identified by successful
+call to <a href="captive-apiref-mm.html#captive-mmap-map-get">captive_mmap_map_get</a>() returning PROT_EXEC bit set.
+This bit should be set from MmAllocateSection() called from
+ntoskrnl/ldr/loader.c/LdrPEProcessModule().
+</p><p>
+Currently emulated set is the access to <tt>fs</tt> register offset <tt>0</tt>
+where the exception stack top pointer is located.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if successful.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-calltype-reactos.html"><b><< calltype_reactos</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-rtl-file.html"><b>rtl-file >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>storage</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-unicode-reactos.html" title="unicode_reactos"><link rel="next" href="captive-apiref-ldr-exports.html" title="ldr_exports"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-unicode-reactos.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-ldr-exports.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-storage"></a><div class="titlepage"></div><div class="refnamediv"><h2>storage</h2><p>storage — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+extern GIOChannel *<a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a>;
+extern guint64 <a href="captive-apiref-storage.html#captive-image-size">captive_image_size</a>;
+guint64 <a href="captive-apiref-storage.html#captive-giochannel-size">captive_giochannel_size</a> (GIOChannel *channel);
+gboolean <a href="captive-apiref-storage.html#captive-cdrom-init">captive_cdrom_init</a> (void);
+gboolean <a href="captive-apiref-storage.html#captive-disk-init">captive_disk_init</a> (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-image-iochannel"></a>captive_image_iochannel</h3><pre class="programlisting">extern GIOChannel *captive_image_iochannel;
+</pre><p>
+The readl GIOChannel to be used for accessing the disk image.
+It may be either directly captive_options->image_iochannel
+or the wrapper by giochannel-blind.</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-image-size"></a>captive_image_size</h3><pre class="programlisting">extern guint64 captive_image_size;
+</pre><p>
+Size of <a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a>. Empty files are rejected and therefore
+this value is always >0 after successful <a href="captive-apiref-init.html#captive-init">captive_init</a>().
+Value is detected by captive_giochannel_size(captive_image_iochannel).</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-giochannel-size"></a>captive_giochannel_size ()</h3><pre class="programlisting">guint64 captive_giochannel_size (GIOChannel *channel);</pre><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>channel</tt></i>Â :</span></td><td>
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td>
+
+
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-cdrom-init"></a>captive_cdrom_init ()</h3><pre class="programlisting">gboolean captive_cdrom_init (void);</pre><p>
+Creates system device "\Device\CdRom<tt>d</tt>" providing readonly access
+to the given <a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a> as emulation of CD-ROM driver.
+</p><p>
+libcaptive currently supports just one drive and thus "\Device\CdRom0"
+is always created. It is forbidden to call this function twice.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the initialization was successful.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-disk-init"></a>captive_disk_init ()</h3><pre class="programlisting">gboolean captive_disk_init (void);</pre><p>
+Creates system device "\Device\CaptiveHarddisk<tt>d</tt>" providing readwrite access
+to the given <a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a> as emulation of harddisk driver.
+reactos initializes "\Device\Harddisk<tt>d</tt>\Partition0" as the whole disk
+and each partition it founds by IoReadPartitionTable() it will create
+as "\Device\Harddisk<tt>d</tt>\Partition1", "\Device\Harddisk<tt>d</tt>\Partition2" etc.
+</p><p>
+libcaptive does not (yet?) support any partitions and it will always create
+just the disk device for the whole given <a href="captive-apiref-storage.html#captive-image-iochannel">captive_image_iochannel</a>.
+As this behaviour is a bit specific we rather create some non-standard name
+of the device; anyway I have seen some "\Device\Harddisk<tt>dVolume</tt><tt>d</tt>" on W32
+system.
+</p><p>
+captive currently supports just one drive and thus "\Device\CaptiveHarddisk0"
+is always created. It is forbidden to call this function twice.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the initialization was successful.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-unicode-reactos.html"><b><< unicode_reactos</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-ldr-exports.html"><b>ldr_exports >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>unicode_reactos</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-unicode.html" title="unicode"><link rel="next" href="captive-apiref-storage.html" title="storage"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-unicode.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-storage.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-unicode-reactos"></a><div class="titlepage"></div><div class="refnamediv"><h2>unicode_reactos</h2><p>unicode_reactos — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+typedef <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a>;
+const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a>* <a href="captive-apiref-unicode-reactos.html#captive-ucs4-to-ucs2-const">captive_ucs4_to_ucs2_const</a>
+ (const gunichar *string_ucs4);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-ucs2"></a>captive_ucs2</h3><pre class="programlisting">typedef guint16 captive_ucs2;
+</pre><p>
+This type is separated from Gnome gunichar2 as <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> MUST be used for UCS-2
+encoded strings in the opposite of gunichar2 beging used for UTF-16 encoded strings.</p><p>
+
+</p></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs4-to-ucs2-const"></a>captive_ucs4_to_ucs2_const ()</h3><pre class="programlisting">const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a>* captive_ucs4_to_ucs2_const
+ (const gunichar *string_ucs4);</pre><p>
+Constant string conversion from 32-bit wchar_t to 16-bit wchar_t.
+You may not modify the result in any way.
+</p><p>
+It is guaranteed to get two different string addresses for two different
+input addresses even if the input strings content is the same.
+Otherwise we would behave as GCC option <tt>-fmerge</tt>-constants which
+results in <tt>C</tt> non-conforming behaviour.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs4</tt></i>Â :</span></td><td> const gunichar * type of persistent string to convert.
+This string MUST remain readable with the same content forever.
+This string MUST be convertible to UCS-2 string.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> * converted string <i><tt>string_ucs4</tt></i>.
+</td></tr></tbody></table></div></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-unicode.html"><b><< unicode</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-storage.html"><b>storage >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>unicode</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="ch01.html" title="Operation Captive"><link rel="previous" href="captive-apiref-ps-reactos.html" title="ps_reactos"><link rel="next" href="captive-apiref-unicode-reactos.html" title="unicode_reactos"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="captive-apiref-ps-reactos.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-unicode-reactos.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="refentry" lang="en"><a name="captive-apiref-unicode"></a><div class="titlepage"></div><div class="refnamediv"><h2>unicode</h2><p>unicode — </p></div><div class="refsynopsisdiv"><h2>Synopsis</h2><pre class="synopsis">
+
+
+
+#define <a href="captive-apiref-unicode.html#captive-UnicodeString-to-utf8-alloca">captive_UnicodeString_to_utf8_alloca</a>(string_UnicodeString)
+#define <a href="captive-apiref-unicode.html#captive-utf8-to-UnicodeString-alloca">captive_utf8_to_UnicodeString_alloca</a>(string_utf8)
+gboolean <a href="captive-apiref-unicode.html#captive-validate-ucs4">captive_validate_ucs4</a> (const gunichar *string_ucs4);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-ucs2">captive_validate_ucs2</a> (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-ucs2-fixlen">captive_validate_ucs2_fixlen</a> (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2,
+ glong string_ucs2_fixlen);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-utf8">captive_validate_utf8</a> (const gchar *string_utf8);
+glong <a href="captive-apiref-unicode.html#captive-ucs2-strlen">captive_ucs2_strlen</a> (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-UnicodeString">captive_validate_UnicodeString</a> (const UNICODE_STRING *string_UnicodeString);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-UnicodeString-noterm">captive_validate_UnicodeString_noterm</a>
+ (const UNICODE_STRING *string_UnicodeString_noterm);
+gboolean <a href="captive-apiref-unicode.html#captive-validate-AnsiString">captive_validate_AnsiString</a> (const ANSI_STRING *string_AnsiString);
+gchar* <a href="captive-apiref-unicode.html#captive-UnicodeString-to-utf8-malloc">captive_UnicodeString_to_utf8_malloc</a>
+ (const UNICODE_STRING *string_UnicodeString);
+PUNICODE_STRING <a href="captive-apiref-unicode.html#captive-utf8-to-UnicodeString-malloc">captive_utf8_to_UnicodeString_malloc</a>
+ (const gchar *string_utf8);
+const gunichar2* <a href="captive-apiref-unicode.html#captive-ucs4-to-utf16-const">captive_ucs4_to_utf16_const</a>
+ (const gunichar *string_ucs4);
+gboolean <a href="captive-apiref-unicode.html#captive-ucs2-compare">captive_ucs2_compare</a> (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_a_ucs2,
+ const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_b_ucs2);
+gboolean <a href="captive-apiref-unicode.html#captive-UnicodeString-compare">captive_UnicodeString_compare</a> (const UNICODE_STRING *string_a_UnicodeString,
+ const UNICODE_STRING *string_b_UnicodeString);
+gboolean <a href="captive-apiref-unicode.html#captive-ucs2-compare-insensitive">captive_ucs2_compare_insensitive</a>
+ (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_a_ucs2,
+ const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_b_ucs2);
+gboolean <a href="captive-apiref-unicode.html#captive-UnicodeString-compare-insensitive">captive_UnicodeString_compare_insensitive</a>
+ (const UNICODE_STRING *string_a_UnicodeString,
+ const UNICODE_STRING *string_b_UnicodeString);
+void <a href="captive-apiref-unicode.html#captive-FsRtlLegalAnsiCharacterArray-init">captive_FsRtlLegalAnsiCharacterArray_init</a>
+ (void);
+</pre></div><div class="refsect1" lang="en"><h2>Description</h2><p>
+
+</p></div><div class="refsect1" lang="en"><h2>Details</h2><div class="refsect2" lang="en"><h3><a name="captive-UnicodeString-to-utf8-alloca"></a>captive_UnicodeString_to_utf8_alloca()</h3><pre class="programlisting">#define captive_UnicodeString_to_utf8_alloca(string_UnicodeString)</pre><p>
+alloca(3)-based conversion from PUNICODE_STRING to plain utf8 string.
+</p><p>
+<i><tt>Returns</tt></i>: const gchar * alloca(3)ed converted string <i><tt>string_UnicodeString</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_UnicodeString</tt></i>Â :</span></td><td> PUNICODE_STRING type of string to convert.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-utf8-to-UnicodeString-alloca"></a>captive_utf8_to_UnicodeString_alloca()</h3><pre class="programlisting">#define captive_utf8_to_UnicodeString_alloca(string_utf8)</pre><p>
+alloca(3)-based conversion from plain utf8 string to PUNICODE_STRING.
+</p><p>
+<i><tt>Returns</tt></i>: PUNICODE_STRING alloca(3)ed converted string <i><tt>string_utf8</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_utf8</tt></i>Â :</span></td><td> const gchar * string in utf8 to convert.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-ucs4"></a>captive_validate_ucs4 ()</h3><pre class="programlisting">gboolean captive_validate_ucs4 (const gunichar *string_ucs4);</pre><p>
+Checks the validity of all 32-bit unicharacters of 0-terminated string.
+It is required to have characters complying to g_unichar_validate().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs4</tt></i>Â :</span></td><td> const gunichar * type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-ucs2"></a>captive_validate_ucs2 ()</h3><pre class="programlisting">gboolean captive_validate_ucs2 (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2);</pre><p>
+Checks the validity of all 16-bit unicharacters of 0-terminated string.
+It is required to have characters complying to g_unichar_validate().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs2</tt></i>Â :</span></td><td> const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> * type string to validate.
+Invalid string input is forbidden.
+UTF-16 encoded strings are forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-ucs2-fixlen"></a>captive_validate_ucs2_fixlen ()</h3><pre class="programlisting">gboolean captive_validate_ucs2_fixlen (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2,
+ glong string_ucs2_fixlen);</pre><p>
+Checks the validity of first <i><tt>string_ucs2_fixlen</tt></i> 16-bit unicharacters of <i><tt>string_ucs2</tt></i>.
+It is required to have characters complying to g_unichar_validate().
+String length must be equal or larger than <i><tt>string_ucs2_fixlen</tt></i>;</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs2</tt></i>Â :</span></td><td> const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> * type string to validate.
+Invalid string input is forbidden.
+UTF-16 encoded strings are forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_ucs2_fixlen</tt></i>Â :</span></td><td> Number of characters from <i><tt>string_ucs2</tt></i> to check.
+captive_ucs2_strlen(<i><tt>string_ucs2</tt></i>)>=<i><tt>string_ucs2_fixlen</tt></i> is required.
+Negative value is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-utf8"></a>captive_validate_utf8 ()</h3><pre class="programlisting">gboolean captive_validate_utf8 (const gchar *string_utf8);</pre><p>
+Checks the validity of all utf8 of 0-terminated string.
+It is required to have characters complying to g_utf8_validate().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_utf8</tt></i>Â :</span></td><td> const gchar * utf8 type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs2-strlen"></a>captive_ucs2_strlen ()</h3><pre class="programlisting">glong captive_ucs2_strlen (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_ucs2);</pre><p>
+Counts the number of characters (=2bytes) in <i><tt>strings_ucs2</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs2</tt></i>Â :</span></td><td> String of type const gunichar2 * in pure UCS-2
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <i><tt>string_ucs2</tt></i> length in UCS-2 characters.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-UnicodeString"></a>captive_validate_UnicodeString ()</h3><pre class="programlisting">gboolean captive_validate_UnicodeString (const UNICODE_STRING *string_UnicodeString);</pre><p>
+Checks the internal consistency of the given <i><tt>string_UnicodeString</tt></i>.
+It is required to have characters complying to g_unichar_validate().
+<i><tt>string_UnicodeString</tt></i> MUST be zero-terminated.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_UnicodeString</tt></i>Â :</span></td><td> PUNICODE_STRING type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-UnicodeString-noterm"></a>captive_validate_UnicodeString_noterm ()</h3><pre class="programlisting">gboolean captive_validate_UnicodeString_noterm
+ (const UNICODE_STRING *string_UnicodeString_noterm);</pre><p>
+Checks the internal consistency of the given <i><tt>string_UnicodeString</tt></i>.
+It is required to have characters complying to g_unichar_validate().
+<i><tt>string_UnicodeString_noterm</tt></i> does not neet to be zero-terminated.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_UnicodeString_noterm</tt></i>Â :</span></td><td> PUNICODE_STRING type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-validate-AnsiString"></a>captive_validate_AnsiString ()</h3><pre class="programlisting">gboolean captive_validate_AnsiString (const ANSI_STRING *string_AnsiString);</pre><p>
+Checks the internal consistency of the given <i><tt>string_AnsiString</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_AnsiString</tt></i>Â :</span></td><td> PANSI_STRING type string to validate.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if the string is valid.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-UnicodeString-to-utf8-malloc"></a>captive_UnicodeString_to_utf8_malloc ()</h3><pre class="programlisting">gchar* captive_UnicodeString_to_utf8_malloc
+ (const UNICODE_STRING *string_UnicodeString);</pre><p>
+g_malloc()-based conversion from PUNICODE_STRING to plain utf8 string.
+You must free the result with g_free() function.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_UnicodeString</tt></i>Â :</span></td><td> PUNICODE_STRING type of string to convert.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> const gchar * g_malloc()ed converted string <i><tt>string_UnicodeString</tt></i>.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-utf8-to-UnicodeString-malloc"></a>captive_utf8_to_UnicodeString_malloc ()</h3><pre class="programlisting">PUNICODE_STRING captive_utf8_to_UnicodeString_malloc
+ (const gchar *string_utf8);</pre><p>
+g_malloc()-based conversion from plain utf8 string to PUNICODE_STRING.
+You must free the result with g_free() function.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_utf8</tt></i>Â :</span></td><td> const gchar * string in utf8 to convert.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> PUNICODE_STRING g_malloc()ed converted string <i><tt>string_utf8</tt></i>.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs4-to-utf16-const"></a>captive_ucs4_to_utf16_const ()</h3><pre class="programlisting">const gunichar2* captive_ucs4_to_utf16_const
+ (const gunichar *string_ucs4);</pre><p>
+Constant string conversion from 32-bit wchar_t to 16-bit (possible pairs of) UTF-16.
+You may not modify the result in any way.
+</p><p>
+It is guaranteed to get two different string addresses for two different
+input addresses even if the input strings content is the same.
+Otherwise we would behave as GCC option <tt>-fmerge</tt>-constants which
+results in <tt>C</tt> non-conforming behaviour.
+</p><p>
+FIXME: UTF-16 encoding IS NOT IMPLEMENTED.
+</p><p>
+See also <a href="captive-apiref-unicode-reactos.html#captive-ucs4-to-ucs2-const">captive_ucs4_to_ucs2_const</a>().</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_ucs4</tt></i>Â :</span></td><td> const gunichar * type of persistent string to convert.
+This string MUST remain readable with the same content forever.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> const gunichar2 * converted string <i><tt>string_ucs4</tt></i>.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs2-compare"></a>captive_ucs2_compare ()</h3><pre class="programlisting">gboolean captive_ucs2_compare (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_a_ucs2,
+ const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_b_ucs2);</pre><p>
+Compares case-sensitively <i><tt>string_a_ucs2</tt></i> and <i><tt>string_b_ucs2</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_a_ucs2</tt></i>Â :</span></td><td> First string of type const gunichar2 * in pure UCS-2.
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_b_ucs2</tt></i>Â :</span></td><td> Second string of type const gunichar2 * in pure UCS-2.
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if <i><tt>string_a_ucs2</tt></i> and <i><tt>string_b_ucs2</tt></i> are the same.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-UnicodeString-compare"></a>captive_UnicodeString_compare ()</h3><pre class="programlisting">gboolean captive_UnicodeString_compare (const UNICODE_STRING *string_a_UnicodeString,
+ const UNICODE_STRING *string_b_UnicodeString);</pre><p>
+Compares case-sensitively <i><tt>string_a_UnicodeString</tt></i> and <i><tt>string_b_UnicodeString</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_a_UnicodeString</tt></i>Â :</span></td><td> First string of type PUNICODE_STRING.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_b_UnicodeString</tt></i>Â :</span></td><td> Second string of type PUNICODE_STRING.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if <i><tt>string_a_UnicodeString</tt></i> and <i><tt>string_b_UnicodeString</tt></i> are the same.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-ucs2-compare-insensitive"></a>captive_ucs2_compare_insensitive ()</h3><pre class="programlisting">gboolean captive_ucs2_compare_insensitive
+ (const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_a_ucs2,
+ const <a href="captive-apiref-unicode-reactos.html#captive-ucs2">captive_ucs2</a> *string_b_ucs2);</pre><p>
+Compares case-insensitively <i><tt>string_a_ucs2</tt></i> and <i><tt>string_b_ucs2</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_a_ucs2</tt></i>Â :</span></td><td> First string of type const gunichar2 * in pure UCS-2.
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_b_ucs2</tt></i>Â :</span></td><td> Second string of type const gunichar2 * in pure UCS-2.
+Invalid string input is forbidden. UTF-16 encoded pairs are forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if <i><tt>string_a_ucs2</tt></i> and <i><tt>string_b_ucs2</tt></i> are the same.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-UnicodeString-compare-insensitive"></a>captive_UnicodeString_compare_insensitive ()</h3><pre class="programlisting">gboolean captive_UnicodeString_compare_insensitive
+ (const UNICODE_STRING *string_a_UnicodeString,
+ const UNICODE_STRING *string_b_UnicodeString);</pre><p>
+Compares case-insensitively <i><tt>string_a_UnicodeString</tt></i> and <i><tt>string_b_UnicodeString</tt></i>.</p><p>
+
+</p><div class="variablelist"><table border="0"><col align="left" valign="top"><tbody><tr><td><span class="term"><i><tt>string_a_UnicodeString</tt></i>Â :</span></td><td> First string of type PUNICODE_STRING.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><i><tt>string_b_UnicodeString</tt></i>Â :</span></td><td> Second string of type PUNICODE_STRING.
+Invalid string input is forbidden.
+</td></tr><tr><td><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></td><td> <tt>TRUE</tt> if <i><tt>string_a_UnicodeString</tt></i> and <i><tt>string_b_UnicodeString</tt></i> are the same.
+</td></tr></tbody></table></div></div><hr><div class="refsect2" lang="en"><h3><a name="captive-FsRtlLegalAnsiCharacterArray-init"></a>captive_FsRtlLegalAnsiCharacterArray_init ()</h3><pre class="programlisting">void captive_FsRtlLegalAnsiCharacterArray_init
+ (void);</pre><p>
+Initialize FsRtlLegalAnsiCharacterArray character classes
+by appropriate FSRTL_FAT_LEGAL etc. flags.</p><p>
+
+</p></div></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="captive-apiref-ps-reactos.html"><b><< ps_reactos</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-unicode-reactos.html"><b>unicode_reactos >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Operation Captive</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="up" href="index.html" title="Operation Captive Reference Manual"><link rel="previous" href="index.html" title="Operation Captive Reference Manual"><link rel="next" href="captive-apiref-init.html" title="init"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"><td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td><td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td><th width="100%" align="center">Operation Captive Reference Manual</th><td><a accesskey="n" href="captive-apiref-init.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td></tr></table><div class="chapter" lang="en"><div class="titlepage"><div><h2 class="title"><a name="id2872113"></a>Operation Captive</h2></div></div><div class="toc">
+
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><a href="captive-apiref-init.html">init</a> - Init and cleanup code of libcaptive to be called by client application</dt>
+<dt><a href="captive-apiref-ldr.html">ldr</a> - ReactOS loader emulation of libcaptive </dt>
+<dt><a href="captive-apiref-macros.html">macros</a> - General macros and typedefs used through Captive</dt>
+<dt><a href="captive-apiref-mm.html">mm</a> - ReactOS Memory Manager emulation of libcaptive</dt>
+<dt><a href="captive-apiref-ps-reactos.html">ps_reactos</a> - Processor support used for ReactOS files</dt>
+<dt><a href="captive-apiref-unicode.html">unicode</a> - Unicode add-ons to ReactOS ntoskrnl/rtl/unicode.c</dt>
+<dt><a href="captive-apiref-unicode-reactos.html">unicode_reactos</a> - Unicode support used for ReactOS files</dt>
+<dt><a href="captive-apiref-storage.html">storage</a> - Storage drivers for ReactOS</dt>
+<dt><a href="captive-apiref-ldr-exports.html">ldr_exports</a> - ReactOS loader to be used from ke/exports.c</dt>
+<dt><a href="captive-apiref-calltype-reactos.html">calltype_reactos</a> - Function call types definitions for ReactOS files</dt>
+<dt><a href="captive-apiref-signal.html">signal</a> - UNIX signal handling for processor emulation for support of ntoskrnl</dt>
+<dt><a href="captive-apiref-rtl-file.html">rtl-file</a> - Internal file handling utilities</dt>
+</dl>
+
+</div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"><a accesskey="p" href="index.html"><b><< Operation Captive Reference Manual</b></a></td><td align="right"><a accesskey="n" href="captive-apiref-init.html"><b>init >></b></a></td></tr></table></body></html>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Operation Captive Reference Manual</title><meta name="generator" content="DocBook XSL Stylesheets V1.58.1"><meta name="generator" content="GTK-Doc V1.1 (XML mode)"><style type="text/css">
+ .synopsis, .classsynopsis {
+ background: #eeeeee;
+ border: solid 1px #aaaaaa;
+ padding: 0.5em;
+ }
+ .programlisting {
+ background: #eeeeff;
+ border: solid 1px #aaaaff;
+ padding: 0.5em;
+ }
+ .variablelist {
+ padding: 4px;
+ margin-left: 3em;
+ }
+ .navigation {
+ background: #ffeeee;
+ border: solid 1px #ffaaaa;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ .navigation a {
+ color: #770000;
+ }
+ .navigation a:visited {
+ color: #550000;
+ }
+ .navigation .title {
+ font-size: 200%;
+ }
+ </style><link rel="home" href="index.html" title="Operation Captive Reference Manual"><link rel="next" href="ch01.html" title="Operation Captive"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="book" lang="en"><div class="titlepage"><div><table class="navigation" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">Operation Captive Reference Manual</p></th></tr></table></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><a href="ch01.html">Operation Captive</a></dt></dl></div></div><table class="navigation" width="100%" summary="Navigation footer" cellpadding="2" cellspacing="0"><tr valign="middle"><td align="left"></td><td align="right"><a accesskey="n" href="ch01.html"><b>Operation Captive >></b></a></td></tr></table></body></html>
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: captive
+Version: 1.0
+Binary: captive-lufs, captive, captive-install
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: i386
+Standards-Version: 3.5.2
+Build-Depends: debhelper (>> 3.0.0),
+ liborbit2-dev,
+ libssl-dev,
+ libgnomevfs2-dev,
+ libxml2-dev (>= 2.4.29),
+ libpopt-dev,
+ libglib2.0-dev,
+ libreadline4-dev,
+ libbonobo2-dev,
+ lufs,
+ ntfsprogs-dev,
+ libgnomeui-dev,
+ gcc (>= 3.0) | gcc-3.0
+Files:
+ 19f888db80898bc5f0da35290d56ac82 2391571 captive_1.0.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/k4JbzD78uUT8djIRAgntAJ9VN4fCkGcmqspV41rY/bn2YV/+EQCfRqxU
+hoNvaEIi5ynH5cmypsMZwq4=
+=NxM7
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Sun, 17 Aug 2003 14:16:59 +0200
+Source: captive
+Binary: captive-install captive captive-lufs
+Architecture: source i386
+Version: 1.0
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ captive - NTFS filesystem using Microsoft Windows drivers
+ captive-install - Instant installer for Microsoft Windows platform filesystem acces
+ captive-lufs - LUFS module for Microsoft Windows platform filesystem access.
+Changes:
+ captive (1.0) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ d4108fa374367afb408f06e3f51b21a4 743 contrib/base optional captive_1.0.dsc
+ 19f888db80898bc5f0da35290d56ac82 2391571 contrib/base optional captive_1.0.tar.gz
+ f5223c4aa0d378138ed1372652507fe8 345630 contrib/base optional captive_1.0_i386.deb
+ 4ba22e40f71761a8a371f8a15d046faa 21422 contrib/base optional captive-lufs_1.0_i386.deb
+ d35acc96ac941032925553e1ce4cea3f 55810 contrib/base optional captive-install_1.0_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/k4JgzD78uUT8djIRArZuAJ0cWSJDPyvAI67VTWxksEoo6GRx+gCfY3gc
+biGzf1ZgYYSuvi/IG7CEwzY=
+=pNNG
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: gnome-vfs-httpcaptive
+Version: 2.3.8captive2
+Binary: gnome-vfs-httpcaptive
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: i386
+Standards-Version: 3.5.2
+Build-Depends: debhelper (>> 3.0.0), libgnomevfs2-dev, libglib2.0-dev
+Files:
+ 28b11b8bad6afd34358c7164cf115b26 548681 gnome-vfs-httpcaptive_2.3.8captive2.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/cQF0zD78uUT8djIRAg0BAJ41drC99NHu0WeZ1jbrOeqBVDskagCgjiBh
+LGCDaoxg6ntOx5MKZezbgbA=
+=R87D
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Sun, 17 Aug 2003 14:16:59 +0200
+Source: gnome-vfs-httpcaptive
+Binary: gnome-vfs-httpcaptive
+Architecture: source i386
+Version: 2.3.8captive2
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ gnome-vfs-httpcaptive - Improved http handler for GNOME virtual file-system libraries
+Changes:
+ gnome-vfs-httpcaptive (2.3.8captive2) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ 17cb718d117e7d9379f82f0bd6921f5e 601 main/base optional gnome-vfs-httpcaptive_2.3.8captive2.dsc
+ 28b11b8bad6afd34358c7164cf115b26 548681 main/base optional gnome-vfs-httpcaptive_2.3.8captive2.tar.gz
+ ced34037f2394693e125d93569fa3c05 29014 main/base optional gnome-vfs-httpcaptive_2.3.8captive2_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/cQF5zD78uUT8djIRAi+lAJ4kX3A7BRernUTWY3ULbjyNhjjSrQCdFBjH
+BMDmPvZSKiguLfa47mNMDbM=
+=cNwB
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: lufs
+Version: 0.9.6captive6
+Binary: lufs
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: any
+Standards-Version: 3.5.2
+Build-Depends: debhelper (>> 3.0.0),
+ cvs2cl,
+ make,
+ autoconf,
+ libtool,
+ automake (>= 1.6) | automake1.6 | automake1.7,
+ gcc,
+ perl
+Files:
+ 106f7117b0ea67ce85f0528ca0cc619b 214704 lufs_0.9.6captive6.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/kC5izD78uUT8djIRArCHAJ9G8lWAQeHVwvwCM73d0A0XHI4wNACeLPMb
+yByHpJ/ii85kBgrQ8/2BEiM=
+=uLrf
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Sun, 17 Aug 2003 14:16:59 +0200
+Source: lufs
+Binary: lufs
+Architecture: source i386
+Version: 0.9.6captive6
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ lufs - lufs - Linux Userland File System
+Changes:
+ lufs (0.9.6captive6) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ ccee758dd73a778ec6d0dc14b9bf665a 613 base optional lufs_0.9.6captive6.dsc
+ 106f7117b0ea67ce85f0528ca0cc619b 214704 base optional lufs_0.9.6captive6.tar.gz
+ 0581c9d3a4826c1661a705ab8bbceaf4 141754 base optional lufs_0.9.6captive6_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/kC5ozD78uUT8djIRAq33AKCGZBDgJazHocKIfmA0UqW9YednrQCfbLUg
+aFO2ESsKFkhKhVEjGZnb1aw=
+=HuH4
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: ntfsprogs-gnomevfs
+Version: 1.0.2
+Binary: ntfsprogs-gnomevfs
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: i386
+Standards-Version: 3.5.2
+Build-Depends: debhelper (>> 3.0.0),
+ libgnomevfs2-dev,
+ libglib2.0-dev,
+ ntfsprogs-dev
+Files:
+ 4087f57e2f6a38b2ec8956396b61bc24 312531 ntfsprogs-gnomevfs_1.0.2.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/k4zXzD78uUT8djIRAqQKAJ0cxz6Uo7RBg1AXyXBBOgBzFOLsYwCgk1Pq
+q4pv3fUOIAv8zUdOMVRYpV4=
+=KIUE
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Sun, 17 Aug 2003 14:16:59 +0200
+Source: ntfsprogs-gnomevfs
+Binary: ntfsprogs-gnomevfs
+Architecture: source i386
+Version: 1.0.2
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ ntfsprogs-gnomevfs - NTFS filesystem library GNOME virtual file-system interface
+Changes:
+ ntfsprogs-gnomevfs (1.0.2) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ 770c049238a95f00920aff1f08cfdcce 594 main/base optional ntfsprogs-gnomevfs_1.0.2.dsc
+ 4087f57e2f6a38b2ec8956396b61bc24 312531 main/base optional ntfsprogs-gnomevfs_1.0.2.tar.gz
+ 5833cbaa6611d8afaaf8f10632755fc8 9896 main/base optional ntfsprogs-gnomevfs_1.0.2_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/k4zczD78uUT8djIRAni7AJ4zzu9GWno8xcPJ/m/ySrMTLRxlmQCfZEs7
+GYgWB1y2Lm0QeHQtx+VRBRE=
+=RhCE
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: ntfsprogs
+Version: 200309071734captive1
+Binary: ntfsprogs, ntfsprogs-dev
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Architecture: i386
+Standards-Version: 3.5.2
+Files:
+ d1d605893444b80fd837301320dd2261 535278 ntfsprogs_200309071734captive1.tar.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/bdcpzD78uUT8djIRAjnhAKCE3ofdN1P9M434xfCqJTuqAVSHSQCdFiq1
+0Mg8noB5XT55apyd7hq6RbI=
+=LrBu
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.7
+Date: Tue, 09 Sep 2003 08:22:48 +0200
+Source: ntfsprogs
+Binary: ntfsprogs ntfsprogs-dev
+Architecture: source i386
+Version: 200309071734captive1
+Distribution: unstable
+Urgency: low
+Maintainer: Jan Kratochvil <project-captive@jankratochvil.net>
+Changed-By: Jan Kratochvil <pgp-44FC7632@jankratochvil.net>
+Description:
+ ntfsprogs - NTFS filesystem libraries and utilities
+ ntfsprogs-dev - files required to compile software that uses libntfs
+Changes:
+ ntfsprogs (200309071734captive1) unstable; urgency=low
+ .
+ * See package ChangeLog entries.
+Files:
+ d4fd74a7e479d42cb3e375c0c50f0694 524 contrib/base optional ntfsprogs_200309071734captive1.dsc
+ d1d605893444b80fd837301320dd2261 535278 contrib/base optional ntfsprogs_200309071734captive1.tar.gz
+ 202a161dc4b512e94ed4ef65a798b33a 169968 contrib/base optional ntfsprogs_200309071734captive1_i386.deb
+ 80b2f06832c66bb07c439f7c7e175b64 91630 contrib/base optional ntfsprogs-dev_200309071734captive1_i386.deb
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (GNU/Linux)
+
+iD8DBQE/bdcuzD78uUT8djIRAvX4AJoC11uEH2aQNfmLgeRGOOU5u0098gCcDHpS
+cN3+Cbhbo775wc68qlvhSqw=
+=FheU
+-----END PGP SIGNATURE-----
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc APITypes page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::APITypes;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: API Functions',
+ "rel_prev"=>'Details.html.pl',
+ "rel_next"=>'CallType.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<a name="functype"><h1>API Function Implementation Choices</h1></a>
+
+ <p>For each function exported by W32
+ <span class="fname">ntoskrnl.exe</span> and imported and called by the
+ filesystem driver a decision needs to be made to properly implement its
+ functionality. Currently implemented functionality statistics are provided
+ below:</p>
+
+ <table border="1" align="center">
+ <tr><th>Function type </th><th>Items</th><th>Portion</th></tr>
+ <tr><td>@{[ a_href 'APITypes.html.pl#functype_pass','pass' ]} </td><td> 81</td><td> 26%</td></tr>
+ <tr><td>@{[ a_href 'APITypes.html.pl#functype_wrap','wrap' ]} </td><td> 2</td><td> 0%</td></tr>
+ <tr><td>@{[ a_href 'APITypes.html.pl#functype_native_reactos','native-ReactOS' ]}</td><td> 113</td><td> 36%</td></tr>
+ <tr><td>@{[ a_href 'APITypes.html.pl#functype_native_libcaptive','native-own' ]} </td><td> 116</td><td> 38%</td></tr>
+ <caption>Function Implementation Types Statistics</caption>
+ </table>
+
+ @{[ doc_img 'ratio','Functions Reusal Ratio' ]}
+
+ <p>As there are several choices to implement each function the usual
+ attempts/investigations ordering is listed in the sections below.</p>
+
+ <p>Special case must be taken for data-type symbols since they are
+ referenced without the possibility of catching the code flow by some
+ breakpoints (it would be possible only in some special access cases). Data
+ export symbols of <span class="constant">unpatched</span> libraries must
+ contain already prepared content at the runtime. There is a problem
+ with <span class="constant">patched</span> libraries where it is necessary
+ to also fully implement the data symbol as
+ @{[ a_href 'APITypes.html.pl#functype_native','native implementation' ]} since there is no
+ possibility to @{[ a_href 'APITypes.html.pl#functype_pass','pass' ]} the data symbol instead of
+ the original W32 data location and therefore there will be two instances of
+ such data variable place. As there will be also the uncaught references for
+ such W32 data location from the <span class="constant">patched</span>
+ library itself such symbols should be usually only some constants (such as
+ <span class="constant">KeNumberProcessors</span>).</p>
+
+ <p>W32 platform symbols export/import can be based either on the symbol
+ name itself or it can be also exported and imported just by its
+ identification number called <span class="constant">Ordinal</span>.
+ Although it saves some jumptables file binary size it is currently no
+ longer used by W32 binaries and this project also does not support such
+ <span class="constant">Ordinal</span> symbol reference type at all.</p>
+
+ <p>All the exporting magic is handled by custom script
+ <span class="fname">captivesym</span> processing the definition file
+ <span class="fname">@{[ captive_srcfile 'src/libcaptive/ke/exports.captivesym' ]}</span>
+ to produce the intermediate relaying code
+ <span class="fname">src/libcaptive/ke/exports.c</span>. For details of the
+ <span class="fname">captivesym</span>-specific source file syntax please
+ see its documentation:
+ <span class="fname">@{[ a_href
+ '/project/Pod2Html.html.pl?cvs=captive/src/libcaptive/ke/captivesym.pl',
+ 'src/libcaptive/ke/captivesym.pl' ]}</span>
+
+ <a name="functype_pass"><h2>Direct Pass to Original "ntoskrnl.exe"</h2></a>
+
+ <p>Simple (standalone) functions such as
+ <span class="function">RtlTimeToSecondsSince1970()</span> can be simply
+ passed to the original implementation in
+ <span class="fname">ntoskrnl.exe</span> as they make no hardware access
+ and they do not expect any special internal data structures to be set up
+ in advance by an earlier library initialization. A common case are all
+ the data structures utility functions such as
+ <span class="constant">GenericTable</span> subsystem or
+ <span class="constant">LargeMcb</span> handling.</p>
+
+ <a name="functype_pass_fromunix"><h3>Pass from UNIX Code</h3></a>
+
+ <p>Control flow begins in some standard UNIX code. Such code is always
+ using @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl call type' ]} for all its
+ intracalls. <a href="APITypes.html.pl#functype_native_reactos">Native functions
+ compiled from <span class="productname">ReactOS</span> sources</a> use
+ their own @{[ a_href '#calltype','cdecl/stdcall/fastcall' ]} declarations
+ but these call type modifications are discarded during compilation for
+ this project by the <span class="constant">LIBCAPTIVE</span>
+ symbol.</p>
+
+ <p>UNIX code calls <span class="function">FUNCTIONNAME()</span> relay
+ from the generated UNIX jump table. Such relay will debug dump the
+ passed arguments and finally pass the control to the original W32
+ function code in the proper call type
+ @{[ a_href '#calltype','cdecl/stdcall/fastcall' ]} for a given
+ function.</p>
+
+ <p>Original W32 code entry point is always trapped by a breakpoint
+ although it would not be needed during this specific direct pass from
+ UNIX code to the original W32 implementation. Still the breakpoint has
+ to be there to catch some other (such as intra-W32) possible calls
+ described later. There are several more ways to define breakpoint in
+ the code. One way is to use processor hardware breakpoint support but
+ the number of breakpoints is limited. The other way is to patch in the
+ <span class="instruction">@{[ 'int $3' ]}</span> instruction but it will invoke
+ <span class="constant">SIGTRAP</span> signal handler conflicting with
+ the possible debugger (<span class="productname">gdb(1)</span>)
+ control. This project uses the <span class="instruction">hlt</span>
+ instruction, which also has a single-byte opcode as
+ <span class="instruction">@{[ 'int $3' ]}</span> and it is a privileged
+ instruction forbidden to be used from the UNIX user space code.
+ <span class="instruction">hlt</span> invokes
+ <span class="constant">SIGSEGV</span> signal which can be resolved by
+ a custom signal handler without any conflict with the possible
+ debugger control; <span class="productname">gdb(1)</span> needs the
+ following command to pass through such
+ <span class="constant">SIGSEGV</span> signal:</p>
+
+ <blockquote class="command">
+ <p>handle SIGSEGV nostop noprint pass</p>
+ </blockquote>
+
+ <p>When a breakpoint gets caught, we usually need to return to the
+ running code. Unfortunately it is not possible because of the patched
+ breakpoint opcode. The breakpoint cannot be simply removed upon return
+ as it would permanently loose control over the point of entry. Even if
+ the return would include faking of the return address in the bottom
+ stack frame to patch the breakpoint back during later function exit it
+ still would not solve the caughts of inner calls of recursive
+ functions. One of the working possibilities would be to patch the
+ original instruction back and perform a singlestep provided by
+ <span class="function">ptrace(2)</span> syscall. However such
+ singlestep needs another controlling UNIX process and it would again
+ conflict with the debuggers such as
+ <span class="productname">gdb(1)</span>. This project implements the
+ singlestep functionality by two consecutive breakpoints
+ (<span class="instruction">hlt</span> instructions to be specific):
+ The first two instruction addresses of the W32 functions are called
+ <span class="productname">slot #1</span> and
+ <span class="productname">slot #2</span>, the length of the first
+ function instruction has to be analyzed to get the right address of
+ <span class="productname">slot #2</span>. When the first breakpoint is
+ caught it is necessary to patch the original instruction back and also
+ patch another breakpoint in place of
+ <span class="productname">slot #2</span>.
+ During the <span class="productname">slot #2</span> breakpoint
+ invocation the operation will be reverted — the breakpoint will be put
+ to <span class="productname">slot #1</span> again and the instruction
+ of <span class="productname">slot #2</span> will be restored to be able
+ to continue the execution of the function.</p>
+
+ <p>W32 function will finish in its specific
+ @{[ a_href '#calltype','cdecl/stdcall/fastcall call type' ]}, the control
+ will return to the UNIX jump table relay which will debug dump the
+ return value and it will finally pass the control back to the UNIX
+ caller in the standard UNIX
+ @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl call type' ]}.</p>
+
+ @{[ doc_img 'fig/functype_patched_pass_fromunix',
+ 'Function Type: <span class="constant">pass</span> from UNIX Code' ]}
+
+ <a name="functype_pass_fromw32"><h3>Pass from W32 Code</h3></a>
+
+ <p>This function type is similiar to the
+ @{[ a_href 'APITypes.html.pl#functype_pass_fromunix','previous one' ]} with the exception
+ of more complicated entry point. Unfortunately W32 libraries call their
+ own functions directly, using the <span class="instruction">call</span>
+ instructions without any patchable jump table. Even the
+ <span class="instruction">call</span> argument itself cannot be patched
+ according to the relocation table record as such library intra-call
+ instruction has no relocation due to its relative argument offset on
+ <span class="constant">i386</span>. This time the double-breakpoint
+ mechanism @{[ a_href 'APITypes.html.pl#functype_pass_fromunix','described above' ]} gets
+ handy since it will catch the entry point when the function gets
+ called. <span class="constant">SIGSEGV</span> handler gets invoked by
+ the <span class="instruction">hlt</span> instruction and it will
+ redirect the control to the jump table relay function to debug dump the
+ function entry arguments (it has no other uses in this call type).</p>
+
+ <p>When the relay needs to call the original function it will reach
+ exactly the same breakpoint instruction as during the recent
+ <span class="constant">SIGSEGV</span> handling redirecting to this
+ calling relay. But this time the
+ <span class="constant">through_w32_func</span> field of this function
+ record will be set to to prevent repeated redirection and to pass the
+ control through the breakpoint mangle instead this time.</p>
+
+ <p>Returning is not much interesting as the first
+ <span class="constant">SIGSEGV</span> handler did a straight jump
+ for the redirection purposes without any needed consequent
+ handling.</p>
+
+ <p>The jump table relay used for the callers from W32 code is
+ a different one than the relay being used for the callers
+ @{[ a_href 'APITypes.html.pl#functype_pass_fromunix','from UNIX code' ]}. UNIX code always
+ uses relay with external @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl call type' ]}
+ but in this case a relay with the appropriate
+ @{[ a_href '#calltype','cdecl/stdcall/fastcall call type' ]} is used.</p>
+
+ @{[ doc_img 'fig/functype_patched_pass_fromw32',
+ 'Function Type: <span class="constant">pass</span> from W32 Code' ]}
+
+ @{[ vskip() ]}
+
+ <table border="1" align="center">
+ <tr><td><span class="fname">captivesym</span> keyword</td><td>pass</td></tr>
+ <tr><td>Native code function name </td><td>(no implementation)</td></tr>
+ <tr><td>W32 traced code from UNIX function name </td><td>FUNCNAME</td></tr>
+ <tr><td>W32 traced code from W32 function name </td><td>FUNCNAME_cdecl/_stdcall/_fastcall</td></tr>
+ <tr><td>Entry/exit debug tracing from UNIX code </td><td>yes</td></tr>
+ <tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
+ <caption>Function Type <span class="constant">pass</span> Characteristics</caption>
+ </table>
+
+ <a name="functype_wrap"><h2>Wrap of the Original "ntoskrnl.exe" Function</h2></a>
+
+ <a name="functype_wrap_fromunix"><h3>Wrapping of Call from UNIX Code</h3></a>
+
+ <p>The code control flow has no special hardcore features since it is
+ very similiar to <a href="APITypes.html.pl#functype_pass_fromunix">the direct pass to
+ W32 function from UNIX code</a>. All the wrapping is done in the
+ standard UNIX @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl call type' ]} manner.
+ Jump table debug dumping relays are provided twice — the
+ "outer" one to trace the parameters from the function caller
+ and the "inner" one to trace the call from the wrapper to the
+ original W32 code. The "inner" relay also calls the W32 code
+ with the appropriate <a href="#calltype">cdecl/stdcall/fastcall call
+ type</a>.</p>
+
+ @{[ doc_img 'fig/functype_patched_wrap_fromunix',
+ 'Function Type: <span class="constant">wrap</span> from UNIX Code' ]}
+
+ <a name="functype_wrap_fromw32"><h3>Wrapping of Call from W32 Code</h3></a>
+
+ <p>This scheme is a combination of the
+ <a href="APITypes.html.pl#functype_wrap_fromunix">previous wrap of a call from
+ UNIX code</a> and the <a href="APITypes.html.pl#functype_pass_fromw32">direct pass from
+ the W32 code</a>. The control is caught and redirected by
+ <span class="constant">SIGSEGV</span> handler from the breakpoint
+ placed at the entry to the original W32 function code. The second entry
+ to the original W32 function with the
+ <span class="constant">through_w32_func</span> field of this function
+ description already set is done from the "inner" jump table
+ relay with the appropriate
+ @{[ a_href '#calltype','cdecl/stdcall/fastcall call type' ]}.</p>
+
+ @{[ doc_img 'fig/functype_patched_wrap_fromw32',
+ 'Function Type: <span class="constant">wrap</span> from W32 Code' ]}
+
+ @{[ vskip() ]}
+
+ <p>Some functions can be <a href="APITypes.html.pl#functype_pass">passed to the original
+ code</a> but they need their parameters to be checked/prepared.
+ Currently, such wrapping is only needed for the
+ <span class="function">ExAllocateFromPagedLookasideList()</span> function
+ where it is required due to <a href="#init_ntoskrnl">missing execution of
+ <span class="fname">ntoskrnl.exe</span> initialization execution</a>,
+ which would otherwise properly initialize some internal data structures.
+ In this case the wrapping code detects passing of an uninitialized
+ parameter and will search through the whole
+ <span class="fname">ntoskrnl.exe</span> code body at runtime to find the
+ proper initialization routine containing the correct initialization
+ parameters. Passed addresses of static structures must be differentiated
+ as each of them usually has different initialization parameters. It is
+ proactive to not to have fixed parameters array as these parameters may
+ differ across different <span class="fname">ntoskrnl.exe</span>
+ versions.</p>
+
+ <table border="1" align="center">
+ <tr><td><span class="fname">captivesym</span> keyword</td><td>wrap</td></tr>
+ <tr><td>Native UNIX wrapping code function name </td><td>FUNCNAME_wrap</td></tr>
+ <tr><td>W32 traced wraping code from UNIX func. name </td><td>FUNCNAME</td></tr>
+ <tr><td>W32 traced wrapping code from W32 func. name </td><td>FUNCNAME_cdecl/_stdcall/...</td></tr>
+ <tr><td>W32 traced original code function name </td><td>FUNCNAME_orig</td></tr>
+ <tr><td>Entry/exit debug tracing from UNIX code </td><td>yes</td></tr>
+ <tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
+ <caption>Function Type <span class="constant">wrap</span> Characteristics</caption>
+ </table>
+
+ <a name="functype_native"><h2>Native Implementation</h2></a>
+
+ <a name="functype_native_fromunix"><h3>Native Implementation Called from UNIX Code</h3></a>
+
+ <p>This is the simplest case of a function call as it is fully
+ handled only by the compiler and/or linker.</p>
+
+ <p>In this case though, no debug dumping call relay is provided — such
+ relay would need to rename the implementations of native functions to
+ prevent its automatic linking with the caller code. This renaming would
+ not be possible to do by simple <span class="constant">#define</span>
+ since it would also rename any calling statements of such function in
+ the same C sources. One of the possibilities to solve would be to
+ utilize <span class="dashdash">--redefine-sym</span> feature of the
+ <span class="productname">objcopy(1)</span> utility. On the other hand
+ there is not much need to catch/debug such calls as both the caller and
+ the callee are provided with full source file debug information for the
+ debugger. Also the callee usually debug dumps its entry/exit parameters
+ by custom debug dumps in the
+ <a href="APITypes.html.pl#functype_native_reactos"><span class="productname">ReactOS</span> implementations</a>.
+
+ @{[ doc_img 'fig/functype_native_fromunix',
+ 'Function Type: <span class="constant">native</span> from UNIX Code' ]}
+
+ <a name="functype_native_fromw32"><h3>Native Implementation of
+ "unpatched" Library Function Called from W32 Code</h3></a>
+
+ @{[ doc_img 'fig/functype_unpatched_native_fromw32',
+ 'Function Type: <span class="constant">native</span> of <span class="constant">unpatched</span> from W32 Code' ]}
+
+ <p>Here comes the differentiation if the project deals either with
+ a <span class="constant">patched</span> or an
+ <span class="constant">unpatched</span> version of the library
+ (<span class="constant">patched</span> is a loaded W32 binary
+ library while <span class="constant">unpatched</span> library is
+ completely provided by this project with no use of the library's
+ original W32 binary file). As the project adjusts the exported symbol
+ address during the patching operation, in some cases the
+ <span class="constant">patched</span> library call may be handled
+ simply as <span class="constant">unpatched</span> library call even for
+ the <span class="constant">patched</span> libraries. Fortunately the
+ distinction is not much important as the project is prepared to
+ properly handle both cases.</p>
+
+ <p>The W32 caller which imported the symbol will be pointed right to
+ the relaying function. The debug dumping relay will be called from W32
+ code with the appropriate
+ @{[ a_href '#calltype','cdecl/stdcall/fastcall call type' ]} while the
+ relay will call the implementation of the native function in the
+ standard UNIX @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl call type' ]} manner.</p>
+
+ <a name="functype_native_fromw32_patched"><h3>Native Implementation of "patched" Library Function Called from W32 Code</h3></a>
+
+ @{[ doc_img 'fig/functype_patched_native_fromw32',
+ 'Function Type: <span class="constant">native</span> of <span class="constant">patched</span> from W32 Code' ]}
+
+ <p>The calling scheme is similiar to the
+ <a href="APITypes.html.pl#functype_native_fromw32">previous call of
+ <span class="constant">unpatched</span> library function from W32
+ code</a> but the call control is redirected from the entry point of the
+ original W32 binary implementation by the breakpoint and its
+ <span class="constant">SIGSEGV</span> handler as in
+ <a href="APITypes.html.pl#functype_pass_fromw32">the case of passing control from W32
+ call</a>.</p>
+
+ <p>The original W32 function implementation located in the original
+ loaded binary file is never executed but its entry point needs to be
+ trapped by the breakpoint to be able to catch the function calls within
+ the library.</p>
+
+ @{[ vskip() ]}
+
+ <p>In all cases the final function implementation is a standard UNIX
+ code compiled from C sources with full debug information available
+ for the debugger. Fortunately all such functions do not need to be coded
+ from scratch for this project since there already exist $freespeech
+ $ReactOS and $Wine projects and their code can be used instead.</p>
+
+ <p>$Wine project is listed mostly for a completeness as almost no
+ code was suitable for reuse as it implements W32 user space while this
+ project is running pure W32 kernel space environment (in $gnulinux user
+ space!).</p>
+
+ <a name="functype_native_reactos"><h3>Native Implementation
+ - <span class="productname">ReactOS</span></h3></a>
+
+ <p>Some functions are already implemented in the $ReactOS
+ project and they can be used as they are. Although it would be
+ possible to <a href="APITypes.html.pl#functype_pass">pass some function calls to the
+ original code</a> it is more handy to provide native implementation as
+ there is better control of the data handling during debugging sessions
+ due to the provided debugging symbols.</p>
+
+ <p>Such functions can be found in
+ <span class="fname">src/libcaptive/reactos/</span> subdirectory.
+ Some functions had to be adjusted for this project
+ - these modifications are compiled conditionally, depending on the
+ <span class="constant">LIBCAPTIVE</span> symbol existence.</p>
+
+ <p>Later stages of this project reached the level where
+ $ReactOS is yet too immature and the needed functions are usually
+ written just with the sad body:</p>
+
+ <blockquote class="command">
+ <p>UNIMPLEMENTED;</p>
+ </blockquote>
+
+ <p>Functions that were not possible to
+ @{[ a_href 'APITypes.html.pl#functype_pass','pass' ]} were reimplemented by this project
+ and placed in the project's implementation directories
+ @{[ a_href '#reactos_nocare','instead of extending' ]} $ReactOS code.</p>
+
+ <a name="functype_native_wine"><h3>Native Implementation – <span class="productname">Wine</span></h3></a>
+
+ <p>Even though $Wine only implements the
+ <span class="productname">Microsoft Windows NT</span> user space, there
+ still are some common functions which could be copied from the $Wine
+ project.</p>
+
+ <a name="functype_native_libcaptive"><h3>Native Implementation – Project Specific</h3></a>
+
+ <p>As the last resort it was necessary to provide completely own
+ implementation of some API functions such as PC hardware dependent
+ parts or memory management functions.</p>
+
+ @{[ vskip() ]}
+
+ <table border="1" align="center">
+ <tr><td><span class="fname">captivesym</span> keyword</td><td>(none; just the symbol name)</td></tr>
+ <tr><td>Native code function name </td><td>FUNCTIONNAME</td></tr>
+ <tr><td>Native traced code from W32 code func. name </td><td>FUNCTIONNAME_cdecl/_std...</td></tr>
+ <tr><td>Entry/exit debug tracing from UNIX code </td><td>no</td></tr>
+ <tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
+ <caption>Function Type <span class="constant">native</span> Characteristics</caption>
+ </table>
+
+ <a name="functype_undef"><h2>Undefined Function</h2></a>
+
+ <p>Functions not defined by any of the previous function types cannot be
+ called by any W32 code including the code of the library implementing
+ such function. All functions of <span class="constant">patch</span>ed
+ libraries not listed in the <span class="fname">captivesym</span> exports
+ file are automatically set to be trapped as fatal program execution
+ errors.</p>
+
+ <p>It is not necessary to list the symbols as
+ <span class="constant">undef</span> as long as you are just loading the
+ W32 <span class="constant">PE-32</span> code and the symbols belong to
+ <span class="constant">patch</span>ed library. On the other hand if you
+ are loading W32 <span class="fname">.so</span> code or if such symbol is
+ a part of <span class="constant">unpatched</span> library (and thus
+ being completely provided by the project) you need to list such symbol as
+ <span class="constant">undef</span> type to prevent unresolved symbol
+ reference.</p>
+
+ <table border="1" align="center">
+ <tr><td><span class="fname">captivesym</span> keyword</td><td>undef</td></tr>
+ <tr><td>Native code function name </td><td>(no implementation)</td></tr>
+ <tr><td>Native traced code function name </td><td>FUNCTIONNAME_cdecl/_stdcall/_fastcall</td></tr>
+ <tr><td>Debug tracing message from UNIX code </td><td>yes</td></tr>
+ <tr><td>Debug tracing message from W32 code </td><td>yes</td></tr>
+ <caption>Function Type <span class="constant">undef</span> Characteristics</caption>
+ </table>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc About page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::About;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: About',
+ "rel_prev"=>'Index.html.pl',
+ "rel_next"=>'Architecture.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<h1>About</h1>
+
+ <a name="reasons"><h2>Reasons for the Implementation</h2></a>
+
+ <p>Currently there is no possibility to any of the available $freespeech
+ ($freespeech used in the following text in the meaning of
+ "@{[ a_href 'http://www.gnu.org/philosophy/free-sw.html','free as in speech' ]}")
+ operating systems to reliably write to the most common disk partition
+ filesystem type – <span class="productname">Microsoft NTFS</span>. It would
+ be already supported a long time ago but there is no proper documentation of
+ <span class="productname">NTFS</span> filesystem data structures available.
+ Since <span class="productname">Microsoft</span> corporation continues in its
+ propagation of <span class="productname">Microsoft Windows NT</span>
+ (<span class="productname">NT</span> identifier used in the following text
+ applies to all the products of <span class="productname">Microsoft</span>
+ <span class="productname">NT</span> series such as
+ <span class="productname">NT 4.0</span>,
+ <span class="productname">2000</span> as NT-5.0
+ and
+ <span class="productname">XP</span> as NT-5.1.)
+ based operating systems <span class="productname">NTFS</span> is the default
+ disk file system type for vendor preinstalled <span class="productname">Microsoft Windows</span>.
+
+ <p>Unfortunately the <span class="productname">NTFS</span> filesystem has too
+ complex data structure to allow a complete reverse enginnering process in
+ reasonable time. Currently available $freespeech solutions such as $LinuxNTFS
+ filesystem have already implemented reliable reverse
+ engineered read-only access. However <a name="reliability">reliabile</a>
+ read-write part of the access would require much better
+ knowledge of the <span class="productname">NTFS</span> data structures.
+ Currently only rewriting of already existing file data blocks is supported
+ by $LinuxNTFS — no file creation, no file deletion, no directory operations etc.
+ Also any future versions of <span class="productname">NTFS</span> filesystem
+ would require another major reverse engineering effort.</p>
+
+
+ <a name="challenges"><h2>Challenges of the Project</h2></a>
+
+ <p>The <a name="NTFSgoal">ultimate goal</a> of this project is definitely the
+ free implementation of @{[ a_href '#reliability','reliable' ]} read-write <span
+ class="productname">NTFS</span> filesystem driver. This project chose to
+ solve this problem in the style of $Wine project by using the original binary
+ <span class="fname">ntfs.sys</span> and emulating all the required layers of
+ <span class="productname">Microsoft Windows NT</span> for it.</p>
+
+ <p>Unfortunately this effort is tainted by only partial and generally
+ insufficient documentation of API between filesystem driver
+ (<span class="fname">ntfs.sys</span>) and the
+ <span class="productname">Microsoft Windows NT</span>
+ ("@{[ a_href 'http://mail.gnu.org/archive/html/libtool/2000-09/msg00000.html','W32' ]}"
+ in the following text) kernel <span class="fname">ntoskrnl.exe</span>. Note
+ that this API is a different than the one being used in the $Wine project
+ since <span class="productname">Wine</span> implements only the user space
+ part of W32.</p>
+
+
+ <a name="versions"><h2>Microsoft Windows Versions Compatibility</h2></a>
+
+ <p>Currently this project supports only driver files of
+ <span class="productname">Microsoft Windows XP</span> (NT-5.1)
+ in the following releases:</p>
+
+ <ul>
+ <li>Microsoft Windows XP Service Pack 1a Checked Build U.S.</li>
+ <li>Microsoft Windows XP Service Pack 1a Free Build U.S.</li>
+ <li>Microsoft Windows XP (No Service Pack) Checked Build U.S.</li>
+ <li>Microsoft Windows XP (No Service Pack) Free Build U.S.</li>
+ </ul>
+
+ <p>The latest list of supported driver files can be found in:
+ @{[ captive_srcfile 'src/install/acquire/w32-mod-id.captivemodid.xml' ]}</p>
+
+ <p>Microsoft Windows NTFS filesystem driver is capable of accessing even
+ the older formats of the filesystem. Porting to Microsoft Windows 2003
+ Server is expected to be done soon. There can be also a danger of Microsoft
+ Windows upgrading NTFS disk filesystem where you would no longer be able
+ to access your NTFS disk by your original
+ <span class="productname">Microsoft Windows</span> version.
+ This upgrade does not happen as it occurs only during complete CD-ROM
+ Microsoft Windows system installation – such operation is not performed
+ by this project.</p>
+
+ <p>There is no problem technically obtaining the needed driver files of
+ <span class="productname">Microsoft Windows XP</span> as they are freely
+ downloadable at:
+ @{[ a_href 'http://www.microsoft.com/WindowsXP/pro/downloads/servicepacks/sp1/checkedbuild.asp' ]}</p>
+ There may be @{[ a_href 'Architecture.html.pl#law','legal reasons' ]} you would not be allowed
+ to use there files if you own license to a different version of
+ <span class="productname">Microsoft Windows</span>. Legal rights will very
+ depending on your country.</p>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Architecture page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::Architecture;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: Architecture',
+ "rel_prev"=>'About.html.pl',
+ "rel_next"=>'Components.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<h1>Architecture</h1>
+
+ <p>The principle of the
+ project lies in the glue between
+ <span class="productname">Microsoft Windows NT</span> kernel space
+ environment and $gnulinux user space process environment:</p>
+
+ @{[ doc_img 'arch-W32','Microsoft Windows Subsystems Architecture' ]}
+ @{[ doc_img 'arch-captive','Captive Subsystems Architecture' ]}
+
+ <a name="existing_emulation"><h2>Existing Emulation Projects</h2></a>
+
+ <p>There were two well-known $freespeech projects emulating W32 subsystems
+ to reach the compatibility with various W32 components:
+ $Wine and $ReactOS. Sad moment is that the goals of this project do not fit
+ very well into any role in those two ones. Therefore this project went
+ its own way of emulation:</p>
+
+ <table align="center" border="1">
+ <tr>
+ <th>@{[ a_href '#guestosnote','Guest-OS' ]}</th>
+ <th>@{[ a_href '#hostosnote' ,'Host-OS' ]}</th>
+ <th>Implements</th>
+ <th>W32 kernel library</th>
+ </tr>
+ <tr>
+ <td>$Wine</td>
+ <td>$gnulinux</td>
+ <td>W32 user space</td>
+ <td><span class="fname">ntdll.dll</span></td>
+ </tr>
+ <tr>
+ <td>$ReactOS</td>
+ <td><span class="constant">i386</span> hardware</td>
+ <td>W32 kernel and user space</td>
+ <td><span class="fname">ntoskrnl.exe</span></td>
+ </tr>
+ <tr style="height: 1ex;"></tr>
+ <tr>
+ <td>this project</td>
+ <td>$gnulinux</td>
+ <td>W32 kernel</td>
+ <td><span class="fname">ntoskrnl.exe</span></td>
+ </tr>
+ <caption>Emulation Projects Characteristics</caption>
+ </table>
+
+ <dl>
+ <a name="guestosnote"><dt>Guest-OS</dt></a>
+ <dd>@{[ a_href 'http://www.vmware.com/support/reference/common/glossary/#guestos','Guest OS' ]}:
+ An operating system that runs inside a virtual machine.</dd>
+ <a name="hostosnote" ><dt>Host OS</dt></a>
+ <dd>@{[ a_href 'http://www.vmware.com/support/reference/common/glossary/#hostos' ,'Host OS' ]}:
+ An operating system that runs on the host machine.</dd>
+ </dl>
+
+ <p>While $ReactOS provides the necessary W32 kernel subsystem emulation
+ code we also need to run such @{[ a_href '#guestosnote','Guest-OS' ]} in the
+ @{[ a_href '#hostosnote','Host-OS' ]} $gnulinux. Initially it was planned to
+ extend $Wine with the W32 kernel space emulation functionality but
+ fortunately <span class="author">Steven Edwards</span> pointed to the $ReactOS
+ which better suits the needs of this project by its already implemented W32
+ kernel space emulation.</p>
+
+ <p>The <a name="reactos_nocare">original reasons</a> for developing
+ $ReactOS still make no sense to the author of this project. Free
+ implementation of W32 platform standalone running on the machine hardware
+ is no longer free as most od the W32 applications are usually closed source
+ and the user still looses its freedom on the application level anyway. Even
+ in the case of available free applications there still remains the
+ disadvantage of loosing the Host-OS platform availability if implemented in
+ the $Wine style. For these ideology incompatibilities not much effort was
+ made for acceptance the fixes and improvements of $ReactOS by this project.
+ Moreover new functionality is not being implemented to the $ReactOS part
+ but it is coded in Gnome style in the project specific source files
+ place.</p>
+
+ <p>The most serious problem of $ReactOS is its dependence on the direct
+ <span class="constant">i386</span> hardware instead of some
+ @{[ a_href '#hostosnote','Host-OS' ]} as required by the goals of this project.
+ W32 is designed to be hardware-independent using its
+ <span class="fname">hal.dll</span>. Unfortunately $ReactOS does not follow
+ this design and thus there are needed various patches and replaces of its
+ various parts and its hardware-dependent code. Despite it $ReactOS code
+ base still made a big asset for this project.</p>
+
+
+
+
+
+ <p>Some API functions are provided both by
+ <span class="fname">ntdll.dll</span> and
+ <span class="fname">ntoskrnl.exe</span> in W32.
+ <span class="author">Casper Hornstrup</span> enlightened such functions
+ calling conventions have to be differentiated as
+ <span class="fname">ntdll.dll</span> lives in the user space (low address
+ space – below <span class="constant">0x80000000</span>) and
+ <span class="fname">ntoskrnl.exe</span> in the kernel space (high address
+ space – above <span class="constant">0x80000000</span>). Although they
+ contain slightly different set of symbols (functions)
+ <span class="fname">ntdll.dll</span> still can be considered as a user
+ space interface to the kernel space implementation by
+ <span class="fname">ntoskrnl.exe</span>.</p>
+
+ <p>Currently there are
+ no plans to ever extend the project's crossplatformity beyond the
+ <span class="constant">i386</span> processor
+ (<span class="constant">i386</span> used here as
+ @{[ a_href 'http://www.intel.com/','Intel' ]} architecture covering 32-bit
+ processors compatible with <span class="constant">i386</span>,
+ <span class="constant">i486</span>, ...).</p>
+
+
+ <a name="law"><h2>Laws and Licensing Conditions</h2></a>
+
+ <p>If you are an <span class="productname">authorized user</span> of
+ <span class="productname">Microsoft Windows NT</span> the laws in some
+ countries give you the right to fully handle the product in any way you
+ want. Therefore you can disassemble the product even in the case you had
+ to agree with the product license forbidding such disassembly as the
+ country laws override any such license agreement.</p>
+
+ <a name="law_servicepack"><h3>Microsoft Service Pack</h3></a>
+
+ <p>Sometimes you may have the legal license for
+ <span class="productname">Microsoft Windows NT</span>
+ but for various technical reasons you do not have the media and/or
+ installation ready at the place of intended use of this project.</p>
+
+ <p>Fortunately <span class="productname">Microsoft</span> provides
+ $freebeer update packages for its
+ <span class="productname">Microsoft Windows</span> products called
+ <span class="productname">Service Packs</span>; the latest one is
+ <span class="productname">@{[ a_href 'http://www.microsoft.com/WindowsXP/pro/downloads/servicepacks/sp1/checkedbuild.asp','Microsoft Windows XP Service Pack 1a' ]}</span>.</p>
+
+ <p>This downloadable file contains the full versions of the essential
+ files needed for the current stage of this product:
+ <span class="fname">ntfs.sys</span>
+ and
+ <span class="fname">ntoskrnl.exe</span>.
+ It even contains
+ <span class="fname">cdfs.sys</span> and
+ <span class="fname">fastfat.sys</span> for testing purposes.</p>
+
+ <p><span class="productname">Service Pack</span> also contains
+ EULA (End User License Agreement) paper disallowing any use of
+ <span class="productname">Service Pack</span> outside its original
+ intentions. According to the laws of some countries you need to be
+ <span class="productname">authorized user</span> of the
+ <span class="productname">Microsoft Windows XP</span> product to be
+ allowed to use the files contained in such
+ <span class="productname">Service Pack</span> without the bindings of its
+ EULA. Even the interpretation of such laws may vary.</p>
+
+ <p>It would be a breach of the law by the project author to provide
+ automatic (=hidden) functionality to download and extract the
+ <span class="productname">Service Pack</span> files. On the other hand it
+ is perfectly legal to ask user for his/her confirmation whether he/she is
+ really the <span class="productname">authorized user</span> of
+ <span class="productname">Microsoft Windows XP</span> product and
+ download/extract the <span class="productname">Service Pack</span> files
+ accordingly.</p>
+
+ @{[ doc_img 'captive-install-acquire-ask','Microsoft Windows Drivers Acquire Affirmation' ]}
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Cache Manager page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::CacheManager;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: NT Cache Manager',
+ "rel_prev"=>'Reverse.html.pl',
+ "rel_next"=>'Details.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<a name="cache_manager"><h1>NT Cache Manager</h1></a>
+
+ <p>Although there exist some 3rd party documents about
+ <span class="productname">NT Cache Manager</span> W32 subsystem such as
+ <span class="productname">@{[ a_href 'http://www.osr.com/ntinsider/1996/cacheman.htm',
+ 'The NT Cache Manager Description' ]}</span> or
+ <span class="productname">@{[ a_href 'http://www.winntmag.com/Articles/Print.cfm?ArticleID=3864',
+ 'Learn About NT'."'".'s File-system Cache' ]}</span>
+ they are definitely insufficient for compatible
+ <span class="productname">NT Cache Manager</span> reimplementation.</p>
+
+ <p><span class="productname">NT Cache Manager</span> is about mapping
+ filesystem objects such as regular file data, filesystem bitmap or
+ journalling zone (log file). It is also being used by the filesystem for
+ mapping of virtual volume files representing the whole underlying
+ filesystem device.</p>
+
+ <p>The original W32 <span class="productname">NT Cache Manager</span>
+ is much more complicated as it must coordinate its effort with
+ other W32 subsystems like mapping of executable files
+ (<span class="type">ImageSectionObject</span>), insufficient system
+ resources from <span class="productname">NT Memory Manager</span>
+ or general effort to perform caching features for system performance.</p>
+ <span class="productname">NT Cache Manager</span> of this project has much
+ simpler goal - it just needs to provide compatible
+ <span class="productname">NT Cache Manager</span> functionality while
+ the other goals of its W32 counterpart are left to be successfuly handled
+ by UNIX OS in much more efficient way.</p>
+
+ @{[ doc_img 'dia/cache-manager',
+ '<span class="productname">NT Cache Manager</span> Architecture' ]}
+
+ <p>Cache Manager objects are always bound to
+ <span class="type">FCB</span> (File Control Block).
+ <span class="type">FileObject</span> (or its associated
+ <span class="type">HANDLE</span>) serve only as reference
+ to <span class="type">FCB</span> and there can be multiple
+ <span class="type">FileObject</span>/<span class="type">HANDLE</span>
+ items for one <span class="type">FCB</span>. It is a bit misleading
+ you must use <span class="type">FileObject</span> pointer while calling
+ most of the Cache Manager functions.</p>
+
+ <p>Before using any other Cache Manager functions you must first call
+ <span class="function">CcInitializeCacheMap()</span>. You must give the
+ maximum mapped object offset. Each mapped object byte must have at most one
+ mapped memory location - no shared pages are allowed. Also any subsequent
+ mapping request is expected to be mapped into continuous memory region.
+ It implies you must reserve the memory region for possible future mapping
+ during the initial <span class="function">CcInitializeCacheMap()</span>
+ moment sized according to the given maximum mapped object offset.
+ This is the approach currently implemented by this project although it
+ cannot be used for 3rd party <span class="fname">ext2fsd.sys</span>
+ driver as it initialized Cache Manager by the whole media device size
+ and it surprisingly succeeds for original
+ <span class="productname">Microsoft Windows</span>
+ <span class="productname">Cache Manager</span>.
+ I expect the space reservation should be postponed to the first mapping
+ request and expect no multiple mappings will be done in the case
+ of memory-exceeding <span class="function">CcInitializeCacheMap()</span>
+ reservation request. <span class="function">CcSetFileSizes()</span>
+ changing the reserved memory area size may assume no existing Map
+ or Pin mappings exist. Only in the case of
+ <span class="constant">FO_STREAM_FILE</span> (virtual device file)
+ it is permitted to extend mapped size even in the case of existing
+ (and dirty) Map or Pin mappings.</p>
+
+ <p><span class="type">PCACHE_MANAGER_CALLBACKS</type> argument can be
+ safely ignored:</p>
+
+ <dl>
+ <dt><span class="function">AcquireForReadAhead()</span>/<span class="function">ReleaseFromReadAhead()</span></dt>
+ <dd>
+ <p>As any readahead functionality is optional these entries are
+ never used by Cache Manager implementation of this project.</p>
+ </dd>
+
+ <dt><span class="function">AcquireForLazyWrite()</span>/<span class="function">ReleaseFromLazyWrite()</span></dt>
+ <dd>
+ <p>Even the write-behind functionality is optional for Cache Manager.
+ It is being done in asynchronous way in the original
+ <span class="productname">Microsoft Windows</span>
+ <span class="productname">Cache Manager</span>.
+ implementation and it is ignored by Cache Manager implementation of
+ this project.</p>
+
+ <p>Cache Manager does not need to write any data if not explicitely
+ requested by the driver. It is even expected to silently drop any
+ pending dirty data blocks during filesystem shutdown.
+ Forced dirty block write by function
+ <span class="function">CcFlushCache()</span> should be written without
+ any wrapping surrounding
+ <span class="function">AcquireForLazyWrite()</span>/<span class="function">ReleaseFromLazyWrite()</span>
+ pair.</p>
+ </dd>
+ </dl>
+
+ <p><span class="function">CcUninitializeCacheMap()</span> is just
+ a suggestion for Cache Manager that driver will no longer reference
+ given <span class="type">SharedCacheMap</span>. The uninitialization
+ can be postponed to any later moment in original
+ <span class="productname">Microsoft Windows</span>
+ <span class="productname">Cache Manager</span>
+ as it may be locked by existing
+ <span class="type">ImageSectionObject</span>
+ of some file being executed etc.
+ <a name="sharedcachemap_leak">It is fatal to destroy
+ <span class="type">SharedCacheMap</span></a>
+ in the moment you see no other
+ references to it as the driver will access it for some moment
+ even after <span class="function">CcUninitializeCacheMap()</span>.
+ I am not sure if it is a bug of the driver or whether there are some rules
+ how long after <span class="function">CcUninitializeCacheMap()</span>
+ completion given <span class="type">SharedCacheMap</span> still exists.
+ Fortunately it is safe to never destroy
+ <span class="type">SharedCacheMap</span> and leave it leaked - everything
+ gets clean in the
+ @{[ a_href 'Details.html.pl#sandbox','sandboxed environment' ]} soon anyway.</p>
+
+ <p>There exist Map and Pin type objects for each
+ <span class="type">SharedCacheMap</span> although they look very similiar.
+ Only these objects give you access to any memory data
+ — <span class="type">SharedCacheMap</span> only reserved the space
+ to ensure continuous mapping of the forthcoming mappings but it did not map
+ any data into it.</p>
+
+ <p>Mapping of 'new' Map or Pin will create the new object only in the case
+ no such mapping exists now. Otherwise you will just get the reference to
+ the existing object with increased usecount.</p>
+
+ <dl>
+ <dt>Map</dt>
+ <dd>
+ <p>Map mapping is always at most one for each
+ <span class="type">SharedCacheMap</span>. Base offset/length of such
+ mapping have no meaning as there can be only single Map.</p>
+
+ <p>Apparently Map size can be arbitrary long according
+ to its <span class="type">SharedCacheMap</span> reserved space.</p>
+
+ <p>You cannot modify the memory mapped by Map in any way.
+ As it is the same memory area (address) as the pages used by Pin
+ objects you always access the last modified version by possible
+ Pin of the same page.</p>
+ </dd>
+
+ <dt>Pin</dt>
+ <dd>
+ <p>Pin mapping always represents just one physical page
+ (<span class="constant">PAGE_SIZE</span> &nspan; 4096 for i386).
+ Its base offset/length can be safely extended to be aligned to the
+ requested page.</p>
+
+ <p>Pin can have associated pair of oldest and newest
+ <span class="type>LSN</span> (Linear Sequence Number). It can be
+ set by <span class="function">CcSetDirtyPinnedData()</span>
+ and Cache Manager always tracks the lowest and highest
+ reported <span class="type>LSN</span> for each page.
+ <span class="type>LSN</span> is assumed to be
+ <span class="constant">0</span> if not set.</p>
+
+ <p>Any existing Pin mapping will be reused for further mappings
+ as long as it is not ThreadOwned. In the moment you use
+ <span class="function">CcSetBcbOwnerPointer()</span> you will detach
+ the associated Pin pages from its
+ <span class="type">SharedCacheMap</span>.
+ Although they will further act as valid Pin mappings they will be no
+ longer reused during new Pin mapping of the same page.
+ There can exist multiple Pin mappings of the same page (although
+ sharing the same memory space). This detaching must be implemented
+ even in the
+ @{[ a_href 'Details.html.pl#synchronous','single-threaded' ]} W32 implementation
+ of this project as it is affecting the behaviour of Cache Manager.
+ It was never
+ @{[ a_href 'CacheManager.html.pl#TraceFS','seen' ]} how to behave if multiple dirty Pin
+ mappings of the same page exist.</p>
+ </dd>
+ </dl>
+
+ <p>Only the pages not yet present in the memory must be read from the disk.
+ You must not read any pages you do not need to as the driver does not
+ expect it and it would corrupt its data buffers. There is just a strict
+ difference between <span class="function">CcPinRead()</span> and
+ <span class="function">CcPinMappedData()</span> function calls where
+ <span class="function">CcPinRead()</span> is required to re-read its data
+ blocks even if they were currently already Map mapped (unless it was already
+ also Pin mapped at least once). On the opposite side
+ <span class="function">CcPinMappedData()</span> must not re-read the given
+ blocks, moreover it blocks are required to be already Map mapped by the caller.</p>
+
+ <p>Cache Manager of this project will destroy Pin or Map mappings after
+ their last unreferencing (in opposite of
+ @{[ a_href 'sharedcachemap_leak','leaked <span class="type">SharedCacheMap</span>' ]}).
+ Despite it any dirty pages may still be held as the pages
+ (including their <span class="type>LSN</span>s) are cached associated
+ with <span class="type">SharedCacheMap</span>. It may be also possible
+ original <span class="productname">Microsoft Windows</span>
+ <span class="productname">Cache Manager</span>
+ postpones Pin mapping destroy to later time but it does not matter.</p>
+
+
+ <a name="TraceFS"><h2>TraceFS NT Cache Manager Tracer</h2></a>
+
+ <p>@{[ a_href '#cache_manager','Cache Manager behaviour' ]} would be hard
+ to analyze just by @{[ a_href '#reverse','reverse engineering' ]} as it
+ is pretty complicated code cooperating with many other W32 kernel
+ subsystems. It was chosen as easier way to trace it instead and validate
+ all the Cache Manager assumptions by Cache Manager simulator.</p>
+
+ @{[ doc_img 'dia/TraceFS','TraceFS Hooking' ]}
+
+ <p>You must prepare your driver to be hooked
+ (<span class="fname">ntfs.sys</span> in this case):</p>
+
+ <blockquote class="command">
+ <p>@{[ captive_srcfile './src/TraceFS/hookfs.pl' ]} ntfs.sys ./src/TraceFS/TraceFS-W32/TraceFS.sys >hooked/ntfs.sys</p>
+ </blockquote>
+
+ <p>This <span class="fname">hooked/ntfs.sys</span> file must be replaced
+ in the <span class="fname">%System32%\\drivers</span> directory.
+ Beware as
+ <span class="productname">Microsoft Windows</span>
+ has many backups of these system files such as
+ <span class="fname">%System32%\\dllcache</span> — delete them
+ all!</p>
+
+ <p>You also need to install
+ <span class="fname">./src/TraceFS/TraceFS-W32/TraceFS.sys</span>
+ into <span class="fname">%System32%\\drivers</span> directory
+ and import <span class="fname">TraceFS/TraceFS-W32/TraceFS.reg</span>
+ registry file to initialize the debug driver during system boot.</p>
+
+ <p>You can now pray a bit and snap the resulting Cache Manager tracing
+ from <span class="productname">WinDbg</span> by
+ @{[ a_href 'Reverse.html.pl#WinDbg','W32 remote kernel debugging' ]}:</p>
+
+ @{[ doc_img 'ntdebug-windbg-boot','Successfuly connected <span class="productname">WinDbg</span>' ]}
+
+ <p>The resulting trace file should be processed by
+ @{[ captive_srcfile './src/TraceFS/checktrace.pl' ]} Perl Cache Manager
+ implementation to validate its assumptions about Cache Manager behaviour.
+ Any seen incompatibilies will be reported — your target is to reach
+ as few error messages as possible.</p>
+
+ <p>KNOWN BUGS: Combination of message synchronization primitives and
+ implemented refusal to create journalling thread of
+ <span class="fname">ntfs.sys</span>
+ causes fatal system lockup in several advanced operations
+ such as setting compression attribute. Despite it more common operations
+ can be successfuly traced during the whole
+ <span class="productname">Microsoft Windows</span>
+ session including its final shutdown and such traces provide enough
+ material to be food to
+ @{[ captive_srcfile './src/TraceFS/checktrace.pl' ]} Perl Cache Manager
+ validator.</p>
+
+ <a name="TraceFS_general"><h3>TraceFS for general API tracing</h3></a>
+
+ <p>Although TraceFS was up to now used only for tracing of
+ <span class="productname">NT Cache Manager</span> it can be easily
+ used ever for any other NT kernel API tracing. You need to provide
+ appropriate function wrappers in the main source file
+ @{[ captive_srcfile './src/TraceFS/TraceFS-W32/TraceFS.c' ]}.
+ Original system functions being wrapped should be called with their
+ original name. Your wrapping functions should have the first letter
+ of their name replaced by character
+ <span class="command">'T'</span>. Therefore wrapping of
+ <span class="function">CcInitializeCacheMap()</span> must be
+ done by your function
+ <span class="function">TcInitializeCacheMap()</span>.
+ Prototypes of both the wrapping and wrapped functions must be the same.
+ You must also export all the wrapped functions by
+ @{[ captive_srcfile './src/TraceFS/TraceFS-W32/TraceFS.def' ]}.
+ @{[ captive_srcfile './src/TraceFS/hookfs.pl' ]} has no hardcoded
+ function names – it will hook exactly the exported entries.</p>
+
+ <p>Framework for thread synchronizations and debug tracing is provided to
+ prevent mangling of messages while running by multiple threads at once.
+ Testing was done just on uniprocessor machine, SMP kernel may need some
+ fixes.</p>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Calling Types page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::CallType;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: API Calling Conventions',
+ "rel_prev"=>'APITypes.html.pl',
+ "rel_next"=>'TODO.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<a name="calltype"><h1>API Function Calling Conventions</h1></a>
+
+ <p>Standard UNIX code compiled by GCC (GNU C Compiler) running on host
+ $gnulinux always uses @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl' ]} ABI (Application
+ Binary Interface) calling convention. This calling convention is also the
+ default declaration type of UNIX functions.</p>
+
+ <p>W32 uses three different calling conventions in its ABI. They are all
+ described in the
+ <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core_argument_passing_and_naming_conventions.asp"><span class="productname">Microsoft</span> documentation</a>.
+ There is always necessary to have the proper function declaration
+ (prototype) in the caller scope to prevent all sorts of unexpected
+ crashes.</p>
+
+ <p>Unfortunately some non-matching combinations of calling conventions
+ result in hard to debug bugs: the caller gets back an unexpected stack
+ pointer from the callee and upon return it will restore registers from the
+ wrong stack pointer place. Since the caller will finally reclaim its stack
+ frame from its (uncorrupted) <span class="constant">EBP</span> stack frame
+ pointer the caller will return to the caller of the caller correctly. Just
+ the registers remain corrupted causing crashes of completely unrelated code
+ executed far, far away...</p>
+
+ <p><span class="constant">EDI</span>, <span class="constant">ESI</span> and
+ <span class="constant">EBX</span> registers are always saved on the stack.
+ They are stored on the stack in this particular order from bottom to top
+ addresses (using the <span class="instruction">push EBX</span>,
+ <span class="instruction">push ESI</span>,
+ <span class="instruction">push EDI</span> sequence). Fortunately $gnulinux
+ GCC has the same register saving behaviour. If some register corruption
+ occurs the calling type presented between the caller and callee should be
+ checked.</p>
+
+ <a name="calltype_cdecl"><h2>W32 Calling Convention "cdecl"</h2></a>
+
+ <p>The only calling convention in the UNIX world. The default one for all
+ the compilers. All the arguments are passed on the stack, no arguments
+ are cleaned by the callee. Possible inconsistencies in the number of
+ function arguments with the function prototype used by the caller is
+ harmless. Variable arguments lists can be passed by this convention.</p>
+
+ @{[ doc_img 'fig/calltype_cdecl',
+ 'W32 Calling Convention <span class="constant">cdecl</span> Scheme' ]}
+
+ <table border="1" align="center">
+ <tr><td>Arguments freed by </td><td>caller</td></tr>
+ <tr><td>Arguments on the stack </td><td>#0 ... #(n-1)</td></tr>
+ <tr><td>Arguments in the registers </td><td>none</td></tr>
+ <tr><td>GCC attribute </td><td><span class="command">__attribute__((__cdecl__))</span> (default)</td></tr>
+ <caption>Calling Convention <span class="constant">cdecl</span> Characteristics</caption>
+ </table>
+
+ <a name="calltype_stdcall"><h2>W32 Calling Convention "stdcall"</h2></a>
+
+ @{[ doc_img 'fig/calltype_stdcall',
+ 'W32 Calling Convention <span class="constant">stdcall</span> Scheme' ]}
+
+ <p>Convention never used in the UNIX world. It needs to be specified for
+ W32 compilers. All the arguments are passed on the stack, all the
+ arguments are cleaned by the callee. Possible inconsistencies in the
+ number of function arguments with the function prototype used by the
+ caller will result in fatal crash. Variable arguments lists cannot be
+ passed by this convention – use @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl' ]}
+ instead.</p>
+
+ <table border="1" align="center">
+ <tr><td>Arguments freed by </td><td>callee</td></tr>
+ <tr><td>Arguments on the stack </td><td>#0 ... #(n-1)</td></tr>
+ <tr><td>Arguments in the registers </td><td>none</td></tr>
+ <tr><td>GCC attribute </td><td><span class="command">__attribute__((__stdcall__))</span></td></tr>
+ <caption>Calling Convention <span class="constant">stdcall</span> Characteristics</caption>
+ </table>
+
+ <a name="calltype_fastcall"><h2>W32 Calling Convention "fastcall"</h2></a>
+
+ <p>Convention never used in the UNIX world. It needs to be specified for
+ W32 compilers. Convention used in the W32 world for its low calling
+ overhead. All but the first two arguments are passed on the stack, such
+ arguments are cleaned by the callee. First two arguments are passed in
+ the registers <span class="constant">ECX</span> and
+ <span class="constant">EDX</span> respectively. Possible inconsistencies
+ in the number of function arguments with the function prototype used by
+ the caller will result in fatal crash. Variable arguments lists cannot be
+ passed by this convention – use @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl' ]}
+ instead.</p>
+
+ <p>GCC (GNU C Compiler) native support for this calling convention
+ is pretty fresh and it is currently present only in the recent CVS
+ versions since 21st December of 2002 which should get released as GCC
+ version 3.4. This project solved the unsupported calling convention by
+ declaration of arguments passed in registers by
+ <span class="command">__attribute__((__regparm__(3)))</span>.
+ W32 passes the arguments in registers in the order
+ <span class="constant">ECX</span>, <span class="constant">EDX</span> but
+ GCC passes them in registers <span class="constant">EAX</span>,
+ <span class="constant">EDX</span>, <span class="constant">ECX</span>.
+ This incompatibility is compensated at C source level in the
+ @{[ a_href '#functype','relaying code' ]} generated by
+ <span class="fname">captivesym</span> relay generator.</p>
+
+ @{[ doc_img 'fig/calltype_fastcall',
+ 'W32 Calling Convention <span class="constant">fastcall</span> Scheme' ]}
+
+ <table border="1" align="center">
+ <tr><td>Arguments freed by </td><td>callee</td></tr>
+ <tr><td>Arguments on the stack </td><td>#2 ... #(n-1)</td></tr>
+ <tr><td>Arguments in the registers </td><td><span class="constant">ECX</span>=#0,
+ <span class="constant">EDX</span>=#1</td></tr>
+ <tr><td>GCC ≥3.4 attribute </td><td><span class="command">__attribute__((__fastcall__))</span></td></tr>
+ <tr><td>GCC <3.4 attr. emulation</td><td><span class="command">__attribute__((__stdcall__))</span></td></tr>
+ <tr><td> </td><td><span class="command">__attribute__((__regparm__(3) /* EAX,EDX,ECX */))</span></td></tr>
+ <caption>Calling Convention <span class="constant">fastcall</span> Characteristics</caption>
+ </table>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Components page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::Components;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: Components',
+ "rel_prev"=>'Architecture.html.pl',
+ "rel_next"=>'Reverse.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<h1>Project Components</h1>
+
+ @{[ doc_img 'dia/arch-all','Project Components Architecture' ]}
+
+ <p>Most of the work of this project is located in the single box called
+ "<span class="constant">libcaptive</span>" located in the center
+ of the scheme. This component implements the core W32 kernel API by
+ various methods described in this document.
+ The "<span class="constant">libcaptive</span>" box cannot be
+ further dissected as it is just an implementation of a set of
+ @{[ captive_srcfile 'src/libcaptive/ke/exports.captivesym','API functions' ]}.
+ It could be separated to several subsystems such as the
+ @{[ a_href '#cache_manager','Cache Manager' ]},
+ Memory Manager, Object Manager, Runtime Library, I/O Manager
+ etc. but they have no interesting referencing structure.</p>
+
+ <p>As this project is in fact just a filesystem implementation every
+ story must begin at the device file and end at the filesystem operations
+ interface. The unified suppported interfaces are
+ <span class="productname">@{[ a_href 'http://developer.gnome.org/doc/API/2.0/glib/','GLib' ]}</span>
+ (the most low level portability, data-types and utility library for Gnome)
+ <span class="type">GIOChannel</span> (for the device access) and the custom
+ <span class="constant">libcaptive</span> filesystem API. Each of these ends
+ can be connected either to some direct interface (such as the
+ <span class="constant">captive-cmdline</span> client),
+ @{[ a_href 'http://lufs.sourceforge.net/lufs/','Linux Userland File System (LUFS)' ]}
+ or as a general $GnomeVFS filter.
+ @{[ a_href 'http://lufs.sourceforge.net/lufs/','LUFS' ]} will be used in
+ most cases as it offers standard filesystem interface by Linux kernel.
+
+ You can also use $GnomeVFS as it offers nice filter interface on
+ the UNIX user-privileges level for transparent operation with archives and
+ network protocols. This filter interface was used by this project to turn
+ the device reference such as <span class="fname">/dev/hda3</span> or <span
+ class="fname">/dev/discs/disc0/part3</span> to the fully accessible
+ filesystem (pretending being an "archive" in the device
+ reference). This device access can be specified by $GnomeVFS URLs such as:
+ <span
+ class="fname">file:///dev/hda3#captive-fastfat:/autoexec.bat</span></p>
+
+ <span class="constant">captive-bug-replay</span> serves just for debugging
+ purposes — you can 'replay' existing
+ <span class="fname">file.captivebug.xml.gz</span> automatically being
+ generated during W32 filesystem failure. This bugreport file will contain
+ all the touched data blocks of the device used in the moment of the
+ failure. <span class="constant">captive-bug-replay</span> will therefore
+ emulate internal virtual writable device out of these bugreported data.
+
+ <p>If the passed device reference is requested by the user to be accessed
+ either in <span class="dashdash">--ro</span> (read-only) mode or in the
+ <span class="dashdash">--rw</span> (full read-write) mode there are no
+ further device layers needed. Just in the case of <span
+ class="dashdash">--blind</span> mode another layer is involved to emulate
+ read-write device on top of the real read-only device by the method of
+ non-persistent memory buffering of all the possible write requests.</p>
+
+ <span class="constant">sandbox commit buffer</span> is involved only in the
+ case @{[ a_href 'Details.html.pl#sandbox','sandboxing feature' ]} is active. It will
+ buffer any writes to the device during the sandbox run to prevent
+ filesystem damage if the driver would fail in the meantime. If the
+ filesystem gets finally successfully unmounted this sandbox buffer can be
+ <a name="safe_flush">safely flushed</a>
+ to its underlying physical media. The buffer will be dropped
+ in the case of filesystem failure, of course. The filesystem should be
+ unmounted from time to time — it can be transparently unmounted and mounted
+ by <span class="command">commit</span> of
+ <span class="constant">captive-cmdline</span> custom client. Currently you
+ cannot force remounting when using
+ @{[ a_href 'http://lufs.sourceforge.net/lufs/','LUFS' ]} interface client
+ but it will be remounted after approx each 1MB data written automatically
+ due to @{[ a_href '#log_file_full','NTFS log file full' ]}.
+
+ Now we need to transparently
+ @{[ captive_srcfile 'src/libcaptive/sandbox/sandbox.idl','connect' ]}
+ the device interface of <span class="type">GIOChannel</span> type through
+ @{[ a_href 'Details.html.pl#sandbox','CORBA/ORBit' ]} to the sandboxed slave.
+
+ <p>Such device is still only a UNIX style GLib <span
+ class="type">GIOChannel</span> type at this point. As we need to supply it
+ to the W32 filesystem driver we must convert it to the W32 I/O Device
+ with its capability of handling <span class="type">IRP</span>
+ (<span class="constant">I/O Request Packet</span>; structure holding the
+ request and result data for any W32 filesystem or W32 block device
+ operation)
+ requests from its upper W32 filesystem driver. Such W32 I/O Device can
+ represent either <span class="type">CD-ROM</span> or
+ <span class="type">disk</span> device type as different W32 filesystem
+ drivers require different media types — currently only
+ <span class="fname">cdfs.sys</span> requires
+ <span class="type">CD-ROM</span> type.</p>
+
+ <p>W32 media I/O Device is accessed from the W32 filesystem driver.
+ The filesystem driver itself always creates volume object by
+ <span class="function">IoCreateStreamFileObject()</span> representing the
+ underlying W32 media I/O Device as the object handled by the
+ filesystem driver itself. All the client application filesystem requests
+ must be first resolved at the filesystem structures level, passed to the
+ volume stream object of the same filesystem and then finally passed to the
+ W32 media I/O Device (already implemented by this project as an
+ interface to <span class="type">GIOChannel</span> noted above).</p>
+
+ <p>The filesystem driver is called by the core W32 kernel implementation of
+ <span class="constant">libcaptive</span> in
+ @{[ a_href 'Details.html.pl#synchronous','synchronous way' ]} in single-shot manner instead of
+ the several reentrancies while waiting for the disk I/O completions as can
+ be seen in the original
+ <span class="productname">Microsoft Windows NT</span>.
+ This single-shot synchronous behaviour is possible since all the needed
+ resources (disk blocks etc.) can be always presented as instantly ready as
+ their acquirement is solved by @{[ a_href 'hostosnote','Host-OS' ]} outside of
+ the W32 emulated @{[ a_href 'guestosnote','Guest-OS' ]} environment.
+ For several cases needed only by <span class="fname">ntfs.sys</span>
+ there had to be supported asynchronous access — parallel execution
+ is emulated by GLib <span class="function">g_idle_add_full()</span>
+ with <span class="function">g_main_context_iteration()</span> called during
+ <span class="function">KeWaitForSingleObject()</span>.</p>
+
+ <p><span class="constant">libcaptive</span> offers the W32 kernel
+ filesystem API to the upper layers. This is still not the API the common
+ W32 applications are used to as they use W32 libraries which in turn pass
+ the call to W32 kernel. For example
+ <span class="function">CreateFileA()</span> is being implemented by several
+ libraries such as <span class="fname">user32.dll</span> as a relay
+ interface for the kernel function
+ <span class="function">IoCreateFile()</span> implemented by this
+ project's <span class="constant">libcaptive</span> W32 kernel
+ emulation component.</p>
+
+ <p>As it would be very inconvenient to use the legacy, bloated and UNIX
+ style unfriendly W32 kernel filesystem API this project offers its own
+ @{[ a_href '#client_interface','custom filesystem API interface' ]} inspired by
+ the $GnomeVFS client interface adapted to the specifics of W32 kernel API.
+ This interface is supposed to be easily utilized by
+ <a href="#client_interface_customapp">a custom application accessing
+ the W32 filesystem driver</a>.</p>
+
+ <p>@{[ a_href 'Details.html.pl#sandbox','CORBA/ORBit' ]} hits us again – we need to
+ @{[ captive_srcfile 'src/libcaptive/sandbox/sandbox.idl','translate' ]}
+ the @{[ a_href '#client_interface','custom filesystem API interface' ]}
+ out of the sandboxed slave to the UNIX space.</p>
+
+ <p><span class="constant">captive sandbox master</span> provides the
+ functionality of covering any possible sandboxed slave restarts and its
+ communication. It is also capable of
+ <a name="demultiplexing_master">demultiplexing single API operations</a>
+ to multiple its connected sandbox slaves in transparent way
+ as each of them handles
+ @{[ a_href 'Details.html.pl#mounted_one','just one filesystem device' ]}.</p>
+
+ <p>The rest of the story is not much special for this project since this is
+ a common UNIX problem how to offer user space implemented UNIX filesystem
+ as a generic system filesystem (as those are usually implemented only as
+ the components od UNIX kernel).</p>
+
+ <p>The filesystem service can be offered in several ways:</p>
+
+ <dl>
+ <dt>Custom client</dt>
+ <dd>
+ <p>One possibility would be to write
+ <a name="client_interface_customapp">a custom client application</a>
+ for this project such as file manager or a shell. Although it
+ would implement the most appropriate user interface to the set of
+ functions offered by this project (and W32 filesystem API) it has the
+ disadvantage of special client software. Appropriate client is provided
+ by this project as:
+ <span class="fname">src/client/cmdline/cmdline-captive</span></p>
+ </dd>
+
+ <dt>@{[ a_href 'http://lufs.sourceforge.net/lufs/','Linux Userland File System (LUFS)' ]}</dt>
+ <dd>
+ <p>The most usable interface is the
+ @{[ a_href 'http://lufs.sourceforge.net/lufs/','LUFS' ]} client
+ by <span class="constant">liblufs-captivefs</span>.
+ As @{[ a_href 'http://lufs.sourceforge.net/lufs/','LUFS' ]}
+ already assigns separate process for each filesystem mount the
+ @{[ a_href '#demultiplexing_master','demultiplexing feature' ]}
+ is not utilized in this case.</p>
+
+ <p>@{[ a_href 'http://lufs.sourceforge.net/lufs/','LUFS' ]}
+ needs multiple operating threads (each UNIX kernel operation needs
+ one free lufsd slot/thread to not to fail immediately).
+ As <span class="constant">libcaptive</span> is
+ @{[ a_href 'Details.html.pl#synchronous','single-threaded' ]} all the operations
+ get always synchronized by
+ <span class="constant">liblufs-captivefs</span>
+ before their pass over to <span class="constant">libcaptive</span>.</p>
+ </dd>
+
+ <dt>@{[ a_href '#offered_gnomevfs','Gnome-VFS' ]}</dt>
+ <dd>
+ <p>This client allowing its filesystem access even without any
+ involvement of UNIX kernel from any $GnomeVFS aware client application
+ (such as <span class="fname">gnome-vfs/tests/test-shell</span>).
+ This @{[ a_href '#offered_gnomevfs','Gnome-VFS interface' ]} connects the
+ data flow of this project in two points — both as the lowest layer
+ device image source and also as the upper layer for the filesystem
+ operation requests.</p>
+ </dd>
+ </dl>
+
+ <p>Unimplemented and deprecated methods for providing filesystem
+ service:</p>
+
+ <dl>
+ <dt>W32 filesystem in UNIX OS kernel</dt>
+ <dd>
+ <p>The real UNIX OS filesystem implementation must be completely
+ implemented inside the hosting OS kernel. This requires special coding
+ methods with limited availability of coding features and libraries.
+ Also it would give the full system control to the untrusted W32
+ filesystem driver code with possibly fatal consequences of yet
+ unhandled W32 emulation code paths. It would benefit from the best
+ execution performance but this solution was never considered a real
+ possibility.</p>
+ </dd>
+
+ <dt>Custom NFS server</dt>
+ <dd>
+ <p>The common approach
+ <a name="offered_NFS">of filesystem implementations</a>
+ outside UNIX OS kernel were custom NFS servers usually running on the
+ same machine as the NFS-connected client as such NFS server is usually
+ an ordinary UNIX user space process. It would be possible to implement
+ this project as a custom NFS server but the NFS protocol itself
+ has a lot of fundamental flaws and complicated code for backward
+ compatibility.</p>
+ </dd>
+ </dl>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Details page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::Details;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: Implementation Details',
+ "rel_prev"=>'CacheManager.html.pl',
+ "rel_next"=>'APITypes.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<h1>Implementation Details</h1>
+
+ <a name="emulmeth"><h2>Choice of the Emulation Methods</h2></a>
+
+ <p>The intent of the project was to get reliable read-write access to
+ <span class="productname">NTFS</span> partition. There are several possible
+ ways to achieve that:</p>
+
+ <a name="emulmeth_vm"><h3>Virtualmachine Running the Original W32 Subsystem</h3></a>
+
+ <p>Creating virtual-hardware PC and running the original W32 binaries
+ including their boot-loader etc. Disk device access would be passed as
+ virtual IDE disk (=hard disk drive). File access API would be implemented
+ either by special escaping by some trapped instruction out of the
+ virtualmachine while using W32 file access API or using the standard W32
+ SMB (Server Message Block) network access through some virtual network
+ card. The latter network access solution is almost the currently available
+ possibility of running full-blown disk-sharing real
+ <span class="productname">Microsoft Windows NT</span> inside virtual
+ machine emulator such as <span class="productname">VMware</span>.</p>
+
+ <p>pros: Full compatibility due to fully native codebase.</p>
+
+ <p>cons: Hard to debug, missing documentation of NT booting internals,
+ possible problems by different PC virtual-hardware than expected by NT,
+ requirement of fully installed
+ <span class="productname">Microsoft Windows NT</span> product.</p>
+
+ <a name="method_ntoskrnl"><h3>"ntoskrnl.exe" Inside Virtual Address Space</h3></a>
+
+ <p>This solution was chosen by the project. Binary filesystem driver and
+ also <span class="fname">ntoskrnl.exe</span> binary file are required.
+ Unfortunately <span class="fname">ntoskrnl.exe</span> expects a native
+ PC virtual-hardware missing during regular UNIX user space process
+ emulation, therefore such instructions must be trapped and emulated/ignored
+ from case to case.</p>
+
+ <p>Also the <a name="init_ntoskrnl">initialization code of <span
+ class="fname">ntoskrnl.exe</span></a> is not executed by this project since
+ it expects to get full PC hardware access privileges and thus some
+ datastructures do not get initialized by it (need to be trapped later at
+ runtime stage). Some of the missing initializations are solved by
+ @{[ a_href 'APITypes.html.pl#functype_wrap','API functions wrapping' ]}.
+
+ <p>pros: Lightweight, easier to debug.</p>
+
+ <p>cons: Possible incompatible emulation of
+ <span class="fname">ntoskrnl.exe</span> parts, missing documentation needed
+ for the implementation.</p>
+
+ <a name="emulmeth_fs"><h3>Filesystem Driver Inside Virtual Address Space</h3></a>
+
+ <p>Unlike @{[ a_href 'Details.html.pl#method_ntoskrnl','previous method' ]} here we do not use
+ even <span class="fname">ntoskrnl.exe</span> as the complete kernel part of
+ W32 is <a name="native_ntoskrnl">emulated from the project source
+ files</a>. <span class="fname">cdfs.sys</span> driver was successfuly ran
+ in this manner in the former versions of this project but the possibility
+ to run without <span class="fname">ntoskrnl.exe</span> was dropped since it
+ had no licensing gains (you need the original
+ <span class="productname">Microsoft Windows NT</span> files at least for
+ the filesystem driver itself) and the emulation of undocumented parts
+ reusable from <span class="fname">ntoskrnl.exe</span> binary was
+ a pain.</p>
+
+ <p>pros: Lightweight, easier to debug.</p>
+
+ <p>cons: Possible incompatible emulation of the whole
+ <span class="fname">ntoskrnl.exe</span>, its missing documentation.</p>
+
+
+ <a name="apichoice"><h2>API Function Implementation Choices</h2></a>
+
+ <p>During the initial point of the project development all the API
+ functions were defined as unimplemented, of course. Any call of such
+ unimplemented function is fatal and results in program termination. When we
+ need to implement any required API function we have multiple choices to do
+ so:
+ @{[ a_href 'APITypes.html.pl#functype_pass','Direct pass to original <span class="fname">ntoskrnl.exe</span>' ]},
+ @{[ a_href 'APITypes.html.pl#functype_wrap','Wrap of the original <span class="fname">ntoskrnl.exe</span> function' ]},
+ @{[ a_href 'APITypes.html.pl#functype_native_reactos','Native implementation – $ReactOS' ]},
+ @{[ a_href 'APITypes.html.pl#functype_native_wine','Native implementation – $Wine' ]}
+ or
+ @{[ a_href 'APITypes.html.pl#functype_native_libcaptive','Native implementation – project specific' ]}.
+ <!-- a_href 'APITypes.html.pl#functype_undef','Undefined function' -->
+
+
+ <a name="sandbox"><h2>Sandboxing of W32 Filesystem</h2></a>
+
+ <p>The emulated W32 environment running the original W32 filesystem driver
+ is separated from the rest of UNIX OS. It achieves the following goals:</p>
+
+ <ul>
+ <li><b>Restartable</b>: W32 driver can be restartde in clean state if it crashed</li>
+ <li><b>Secure</b>: Malicious W32 code cannot affect the security of UNIX OS</li>
+ <li><b>Stable</b>: Buggy W32 cannot crash any part of UNIX OS</li>
+ </ul>
+
+ <p>Sandboxing is provided with the following attributes:</p>
+
+ <ul>
+ <li>standalone UNIX process with separate memory space</li>
+ <li>chroot(2) in empty directory to prevent any UNIX OS filesystem access</li>
+ <li>setuid(2) to own user/group to prevent interaction with UNIX processes</li>
+ <li>setrlimit(2) to limit system resources available for W32 environment</li>
+ <li>the only connection with the UNIX OS by CORBA/ORBit RPC</li>
+ </ul>
+
+ <p>This security is almost the same as provided by
+ emulated virtual machines such as
+ @{[ a_href 'http://www.vmware.com/solutions/security.html','VMware' ]}.</p>
+
+ @{[ doc_img 'dia/inheritance','Sandboxing Scheme' ]}
+
+ <p>Project can be also used in non-sandboxed mode by
+ <span class="command">--no-sandbox</span> option as it is easier to debug
+ without CORBA/ORBit RPC. In this case the
+ <span class="type">DirectorySlave</span>/<span class="type">FileSlave</span>
+ options are used directly instead of their
+ <span class="type">DirectoryParent</span>/<span class="type">FileParent</span>
+ peers.</p>
+
+
+ <a name="patched"><h2>"patched" vs. "unpatched" Libraries</h2></a>
+
+ <p>Library is called <span class="constant">patched</span> if we require
+ loading its original binary code file. Project needs to patch it to be able
+ to trap all the function entry points. The only currently
+ <span class="constant">patched</span> library of this project is
+ <span class="fname">ntoskrnl.exe</span>.</p>
+
+ <p>Library is called <span class="constant">unpatched</span> if no original
+ binary code is needed since all of its functions are completely emulated by
+ @{[ a_href 'APITypes.html.pl#functype_native','the native implementations' ]} of this project.
+ The typical <span class="constant">unpatched</span> representative is
+ <span class="fname">hal.dll</span> as it specializes on the hardware
+ dependent code and therefore it must be completely replaced by this project
+ running in the $gnulinux operating system environment. Early versions of
+ this project had also full <span class="constant">unpatched</span>
+ <a href="#native_ntoskrnl">native implementation of
+ <span class="fname">ntoskrnl.exe</span></a> but it no longer applies.</p>
+
+ <a name="mman"><h2>Memory Management</h2></a>
+
+ <p>Original <span class="productname">Microsoft Windows NT</span>
+ architecture uses two address space areas – user space and kernel space.
+ User space is mapped in the range <span class="constant">0x00000000</span>
+ to <span class="constant">0x7FFFFFFF</span>, kernel space is mapped in the
+ range <span class="constant">0x80000000</span>
+ (<span class="constant">KERNEL_BASE</span> in $ReactOS sources) to
+ <span class="constant">0xFFFFFFFF</span>. All these virtual memory ranges
+ represent addresses after their MMU (Memory Management Unit) mapping, of
+ course. More discussion can be found in the
+ <a href="http://www.microsoft.com/hwdev/platform/server/PAE/PAEmem.asp">description
+ by <span class="productname">Microsoft</span></a>.</p>
+
+ <p>This project runs in the virtual address space used both for the UNIX
+ user space process part and for the W32 kernel space. Therefore this
+ project defines that W32 kernel runs in the whole range
+ <span class="constant">0x00000000</span> to
+ <span class="constant">0xFFFFFFFF</span> since there are no special mapping
+ assumptions about the UNIX user space process mapping. No W32 user space
+ exists in this project. Such approach also nullifies any special memory
+ moving operations between W32 kernel space and W32 user space memory areas
+ (such as <span class="function">MmSafeCopyToUser()</span>).</p>
+
+ <a name="unicode"><h2>Unicode Strings and Characters</h2></a>
+
+ <p>W32 platform uses 16-bit type <span class="type">wchar_t</span> while $gnulinux uses a
+ 32-bit one. This can be problem during GCC (GNU C Compiler)
+ compilation of combination of native UNIX C sources (assuming 32-bit
+ GCC with 32-bit <span class="type">wchar_t</span>) and
+ $ReactOS C sources (assuming W32 compiler with 16-bit
+ <span class="type">wchar_t</span>) for literal wide strings
+ (C source file systax: <span class="command">L"wstring"</span>).
+ Possibilities to solve this issue list:</p>
+
+ <ul>
+ <li>
+ <p>Using <span class="constant">-fshort-wchar</span> GCC option and
+ strictly differentiate between compilation of
+ <span class="productname">ReactOS</span> code and UNIX code.</p>
+
+ <p>pros: No source modifications needed, no runtime performance hit.</p>
+
+ <p>cons: No type checking if some part of code has bad compilation
+ flags, complicated way to completely split
+ <span class="productname">ReactOS</span> and UNIX code.</p>
+ </li>
+ <li>
+ <p>Wrap all <span class="productname">ReactOS</span> literal constants
+ by some conversions function call (implemented as macro
+ <span class="function">REACTOS_UCS2()</span> by this project).</p>
+
+ <p>pros: Any forgotten/mistaken conversions are type-checked and warned
+ during the compilation by GCC.</p>
+
+ <p>cons: All compiled <span class="productname">ReactOS</span> sources
+ files containing literal wide strings have to be wrapped/modified,
+ performance hit by runtime string conversions.</p>
+
+ <p>This solution was chosen to get the internal sanity checking
+ benefit.</p>
+ </li>
+ </ul>
+
+ <a name="binfmt"><h2>Supported Binary Formats</h2></a>
+
+ <p>The native W32 binary format is identified as
+ <span class="constant">PE-32</span> (Portable Executable 32-bit), such
+ files have all the usual extensions such as
+ <span class="fname">.sys</span>, <span class="fname">.exe</span>,
+ <span class="fname">.dll</span> etc. <span class="constant">PE-32</span>
+ loading support was already implemented by $ReactOS, its memory mapping
+ specifics just had to be ported to $gnulinux environment by this project.
+ This loading support does not (yet) cover importing of debug symbols from
+ W32 <span class="fname">.PDB</span> (Program DataBase) files in $gnulinux
+ ABI (Application Binary Interface) compatible way.</p>
+
+ <p>This project also supports transparent loading of UNIX
+ <span class="fname">.so</span> (Shared Object file) binary format. If you
+ have W32 source files for some W32 library you can try to compile it by GCC
+ to get the shared library with $gnulinux ABI compatible debug information
+ (GCC option <span class="constant">-ggdb3</span> recommended). Beware of
+ possible compilation problems as <span class="productname">Microsoft</span>
+ C code expects <span class="constant">exception</span> handling to be
+ supported by the compiler (definitely not the case of the plain C compiler
+ of GCC) — all the exception catching code should be discarded as any
+ @{[ a_href '#exception_fatal','generated exceptions are always fatal' ]} when
+ such driver is running in the scope of this project. You can use the
+ following script of this project to compile W32 filesystem source files as
+ UNIX <span class="fname">.so</span>:
+ @{[ captive_srcfile 'src/w32-mod/ext2fsd.so-build.sh' ]}</p>
+
+ <p>Be aware of some differences if you use
+ <span class="constant">PE-32</span> binary format file vs.
+ <span class="fname">.so</span> format file.
+ <span class="constant">PE-32</span> use the appropriate W32 specific
+ @{[ a_href '#calltype','cdecl/stdcall/fastcall call types' ]},
+ <span class="fname">.so</span> must be completely compiled in the standard
+ UNIX @{[ a_href 'CallType.html.pl#calltype_cdecl','cdecl call type semantics' ]}.
+ @{[ a_href 'APITypes.html.pl#functype_native','Native function implementations' ]} do not need
+ to be explicitely exported by <span class="fname">captivesym</span> as they
+ are resolved automatically by the UNIX dynamic system linker. It may be
+ surprising you will have to fix all such missing symbol exports if you
+ advance during the development from the debugging
+ <span class="fname">.so</span> file for the production version of the
+ original <span class="constant">PE-32</span> binary file.</p>
+
+
+ <a name="mounted_one"><h2>At Most One Mounted Filesystem</h2></a>
+
+ <p>The project technically supports only one (exactly one...) mounted
+ filesystem device and only one filesystem driver. There is nothing
+ complicated to support multiple disks and multiple loaded filesystem
+ modules but as they would share the address space it would only bring
+ a possible complications during bug reports and the bug solving
+ itself. It was considered as a more sane way to support multiple W32
+ mounted disks by completely separately running project instances in
+ a different UNIX processes communicating from their sandboxes via
+ @{[ a_href 'Details.html.pl#sandbox','CORBA sandbox interface' ]}. This sandboxing
+ feature is not yet deployed although its code is already prepared.</p>
+
+ <p>The project also does not support any state cleanup to be able to load
+ filesystem <span class="constant">A</span>,
+ cleanup <span class="constant">A</span> and load a different
+ filesystem <span class="constant">B</span> in the same process address
+ space. It complies with the preventions of the possible debugging
+ complications as noted above. Despite this you still must call the function
+ <span class="function">captive_shutdown()</span> to flush all the pending
+ filesystem buffers to the disk. After calling
+ <span class="function">captive_shutdown()</span> the process address space is
+ no longer usable for any further project operations and the process is
+ expected to be terminated in the manner compatible with its driving
+ @{[ a_href 'Details.html.pl#sandbox','CORBA sandbox interface' ]} control master.</p>
+
+ <p>Each sandbox executing the untrusted W32 binary filesystem driver code
+ is connected through its
+ @{[ a_href 'Details.html.pl#sandbox','CORBA sandbox interface' ]} at the point of upper
+ layer <span class="constant">libcaptive</span>-specific filesystem API, at
+ the point of the bottom layer of <span class="type">GIOChannel</span>
+ device access and also for transfers of GLib logging
+ messages/warnings/errors out of the sandbox to the user.</p>
+
+
+ <a name="synchronous"><h2>Multithreading and Multiple Processors</h2></a>
+
+ <p>W32 platform stands on its thorough architecture parallelism. It
+ must lock all its objects to maintain coherence in presence of
+ multithreading and multiple processors. Since the author of this project
+ considers any parallel execution a serious obstacle for debugging the whole
+ project architecture was designed to prevent any undeterministic behaviour.
+ Therefore this projects always emulates uniprocessor
+ <span class="productname">Microsoft Windows NT</span> kernel
+ (<span class="constant">KeNumberProcessors</span> symbol is always 1),
+ everything runs in the single initial thread/process and all the filesystem
+ operations are performed as synchronous
+ ("synchronous" by flags
+ <span class="constant">FILE_SYNCHRONOUS_IO_ALERT</span>,
+ <span class="constant">FO_SYNCHRONOUS_IO</span>,
+ <span class="constant">IRP_SYNCHRONOUS_API</span>,
+ <span class="constant">IRP_SYNCHRONOUS_PAGING_IO</span>,
+ forced <span class="constant">TRUE</span> result of
+ <span class="function">IoIsOperationSynchronous()</span>
+ etc.).
+ For several cases needed only by <span class="fname">ntfs.sys</span> there
+ had to be supported asynchronous access
+ (<span class="constant">STATUS_PENDING</span> return code) – parallel
+ execution is emulated by GLib
+ <span class="function">g_idle_add_full()</span> with
+ <span class="function">g_main_context_iteration()</span> called during
+ <span class="function">KeWaitForSingleObject()</span>.</p>
+ Since there is a possibility a real W32 parallel threading would
+ be yet needed in the future all the code that would be hit by W32
+ multithreading capability is marked by
+ <span class="constant">TODO:thread</span> comment.</p>
+
+ <p>Multiple processors (SMP) support will never need to be implemented
+ since uniprocessor W32 kernels apparently run the filesystem driver modules
+ fine. As this project implements only the uniprocessor W32 kernel all the
+ processor locking functions and structures such as
+ <span class="constant">KSPIN_LOCK</span> etc. can be safely implemented as
+ no-operations.</p>
+
+ <p>Asynchronous callbacks registered for
+ <span class="constant">IO_WORKITEM</span>s are passed as GLib idle
+ functions by <span class="function">g_idle_add_full()</span>. Although they
+ will probably never be executed during non-interactive project's batch
+ executions it is the responsibility of W32 driver implementation to
+ complete all the pending tasks before its W32 shutdown. Such W32 shutdown
+ is done during cleanup of the project's execution by
+ <span class="function">captive_shutdown()</span>.</p>
+
+ <a name="paranoia"><h2>Paranoia Checks</h2></a>
+
+ <p>A general approach of software projects development is to implement
+ many internal sanity checks during the development stage but to produce the
+ most optimized final release product without those debugging checks.</p>
+
+ <p>Facilities for these practices can be seen in the standard
+ C include files for example as function
+ <span class="function">assert()</span> which gets disabled by the
+ <span class="constant">NDEBUG</span> symbol used during the final optimized
+ executable compilation. This project uses Gnome GLib messaging subsystem
+ offering sanity checks discarded by symbols
+ <span class="constant">G_DISABLE_ASSERT</span> and
+ <span class="constant">G_DISABLE_CHECKS</span>.
+ <span class="productname">Microsoft</span> also produces two versions of
+ its products – regular customers use the "free build" (also
+ called "retail") while the programmers should develop their code
+ on the "checked build" product releases.</p>
+
+ <p>As this project will always run unknown binary code of proprietary W32
+ filesystem drivers, the code can never be trusted. Such code even runs in
+ the same unprotected address space as its controlling UNIX code. Since
+ there is not enough documentation for the W32 components of the system and
+ also such documentation is usually misleading it can never be considered as
+ 100% emulation. Even in the final releases all the sanity checks
+ implemented in this project should remain active as all the project's code
+ always interacts with unknown and untrusted W32 binaries.</p>
+
+ <p><span class="productname">Microsoft Windows NT</span> code is written in
+ a foolproof style as it accepts even invalid input values, and which
+ it usually corrects. This makes long-term debugging a pain as it hides
+ sources of problems. "Checked build" releases were probably
+ designed to fix this flaw by strict consistency checks but it did not reach
+ its goals as such checks are usually missing in the code.</p>
+
+ <p>This project has strict consistency checks across all the code to make
+ the debugging phase easy enough. Failed sanity check is not always
+ a bug – sometimes it just means the real W32 binary code is more
+ benevolent than it could be expected according to the documentation and
+ such sanity check gets removed for the next version build. In other cases
+ the failed sanity checks mean the execution path for some unexpected
+ arguments combination was not yet implemented by this project. I may also
+ mean a bug, of course...</p>
+
+ <p>Last but not least – never miss a possible sanity check as its
+ later removal is in an order of magnitude cheaper than an uncaught
+ invalid assumption. Failed assertion is not always a bug although it
+ has to be fixed, of course.</p>
+
+
+ <a name="logfile"><h2>STATUS_LOG_FILE_FULL</h2></a>
+
+ <p>After writing approx. 1MB of data on NTFS test partition NTFS driver
+ returns for any further write requests
+ <span class="constant">STATUS_LOG_FILE_FULL</status> error code.
+ Apparently it is caused by the fact this project is
+ @{[ a_href 'Details.html.pl#synchronous','single-threaded' ]} and it ignores the spawn
+ of parallel journalling thread during <span class="fname">ntfs.sys</span>
+ initialization.</p>
+
+ <p>Fortunately <span class="fname">ntfs.sys</span> will clear its
+ journalling log file during filesystem unmount. This project will therefore
+ remount the volume if <span class="constant">STATUS_LOG_FILE_FULL</status>
+ is detected to workaround missing journalling thread.</p>
+
+ <p>Similiar behaviour can be seen during write of compressed files —
+ the file gets written uncompressed and its compression will proceed only
+ during the final filesystem unmount.</p>
+
+ <p>For these reasons it was mandatory to support
+ @{[ a_href 'Details.html.pl#parent_connector','transparent volume remounting' ]}.</p>
+
+
+ <a name="parent_connector"><h2><span class="constant">ParentConnector</span> volume remounter</h2></a>
+
+ <p>The sandbox master component of this project has control of restarting
+ its sandbox slaves containing the W32 filesystem. Target goal of
+ <span class="constant">ParentConnector</span> component is to transparently
+ provide persistent view of files and directories over the sandboxed slaves
+ being restarted.</p>
+
+ <p>In the case of read-only operations it would be simple as we could only
+ save our state of currently opened filesystem objects with their read
+ file/directory offset. Write operations can be handled as the read-only
+ ones as long as all the operations are successful. In the case of W32
+ filesystem crash we loose all the past write operations. If we would redo
+ all the write operations we could very easily invoke the same crash.
+ Therefore we write:</p>
+
+ <blockquote class="command">
+ <p>Filesystem crash broke dirty object: FILE/PATH/NAME</p>
+ </blockquote>
+
+ <p>message to syslog and refuse any further operations with this
+ object.</p>
+
+ @{[ doc_img 'dia/parent-connector','Parent Connector' ]}
+
+ <p><span class="constant">HANDLE</span> represents W32 object open in
+ existing W32 filesystem.<span class="constant">HANDLE</span> is created
+ on-demand according to the saved state of the object (such as its
+ pathname). Even the whole <span class="constant">VFS</span> sandbox slave
+ is spawn on-demand if some object operation requests it.</p>
+
+ <p>W32 filesystem crash can obviously occur at any moment - it generates
+ @{[ a_href 'http://developer.gnome.org/doc/API/2.0/gobject/','GObject' ]}
+ @{[ a_href 'http://developer.gnome.org/doc/API/2.0/gobject/gobject-Signals.html','signal' ]}
+ <span class="constant">abort</span>. Successful filesystem unmount
+ (even as the part of remount operation) must be first preceded by
+ <span class="constant">detach</span> signal to close all existing
+ W32 <span class="constant">HANDLE</span>s. After their close the filesystem
+ gets the unmount requests. Only in the case all the close operations
+ succeeded including the final filesystem unmount the signal
+ <span class="constant">cease</span> can be activated to notify all the
+ dirty (written) objects they are now clean. During this
+ <span class="constant">cease</span> signal the project will also
+ @{[ a_href '#safe_flush','flush' ]} the sandbox commit buffer to its
+ underlying media.</p>
+
+ <p>Objects never written remain in <span class="constant">clean</span>
+ state and they can be transparently reopened even if W32 filesystem crash
+ occurs.</p>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Index page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation',
+ "rel_next"=>'About.html.pl',
+ "rel_up"=>top_dir("/project/captive/"),
+ );
+
+
+print <<"HERE";
+
+
+<h1>Captive NTFS Developer Documentation</h1>
+
+<ul>
+
+<li><a href="About.html.pl">About</a>
+ <ul>
+ <li><a href="About.html.pl#reasons">Reasons for the Implementation</a></li>
+ <li><a href="About.html.pl#challenges">Challenges of the Project</a></li>
+ <li><a href="About.html.pl#versions">Microsoft Windows Versions Compatibility</a></li>
+ </ul></li>
+
+<li><a href="Architecture.html.pl">Architecture</a>
+ <ul>
+ <li><a href="Architecture.html.pl#existing_emulation">Existing Emulation Projects</a></li>
+ <li><a href="Architecture.html.pl#law">Laws and Licensing Conditions</a>
+ <ul>
+ <li><a href="Architecture.html.pl#law_servicepack">Microsoft Service Pack</a></li>
+ </ul></li>
+
+ <li><a href="Components.html.pl">Project Components</a></li>
+
+ <li><a href="Reverse.html.pl">Reverse Engineering</a>
+ <ul>
+ <li><a href="Reverse.html.pl#dumpbin">dumpbin.exe</a></li>
+ <li><a href="Reverse.html.pl#WinDbg">WinDbg Windows NT kernel debugging</a>
+ <ul>
+ <li><a href="Reverse.html.pl#WinDbg_WinDbg">WinDbg side setup</a></li>
+ <li><a href="Reverse.html.pl#WinDbg_kern">Setup of the side being kernel-debugged</a></li>
+ </ul></li>
+ </ul></li>
+ </ul></li>
+
+<li><a href="Details.html.pl">Implementation Details</a>
+
+ <ul>
+ <li><a href="CacheManager.html.pl">NT Cache Manager</a>
+ <ul>
+ <li><a href="CacheManager.html.pl#TraceFS">TraceFS NT Cache Manager Tracer</a>
+ <ul>
+ <li><a href="CacheManager.html.pl#TraceFS_general">TraceFS for general API tracing</a></li>
+ </ul></li>
+ </ul></li>
+
+ <li><a href="Details.html.pl#emulmeth">Choice of the Emulation Methods</a>
+ <ul>
+ <li><a href="Details.html.pl#emulmeth_vm">Virtualmachine Running the Original W32 Subsystem</a></li>
+ <li><a href="Details.html.pl#method_ntoskrnl">"ntoskrnl.exe" Inside Virtual Address Space</a></li>
+ <li><a href="Details.html.pl#emulmeth_fs">Filesystem Driver Inside Virtual Address Space</a></li>
+ </ul></li>
+ <li><a href="Details.html.pl#apichoice">API Function Implementation Choices</a></li>
+ <li><a href="Details.html.pl#sandbox">Sandboxing of W32 Filesystem</a></li>
+ <li><a href="Details.html.pl#patched">"patched" vs. "unpatched" Libraries</a></li>
+ <li><a href="Details.html.pl#mman">Memory Management</a></li>
+ <li><a href="Details.html.pl#unicode">Unicode Strings and Characters</a></li>
+ <li><a href="Details.html.pl#binfmt">Supported Binary Formats</a></li>
+ <li><a href="Details.html.pl#mounted_one">At Most One Mounted Filesystem</a></li>
+ <li><a href="Details.html.pl#synchronous">Multithreading and Multiple Processors</a></li>
+ <li><a href="Details.html.pl#paranoia">Paranoia Checks</a></li>
+ <li><a href="Details.html.pl#logfile">STATUS_LOG_FILE_FULL</a></li>
+ <li><a href="Details.html.pl#parent_connector">ParentConnector volume remounter</a></li>
+
+ <li><a href="../apiref/">Captive API Reference Manual (fragment)</a></li>
+
+ <li><a href="APITypes.html.pl">API Function Implementation Choices</a>
+ <ul>
+ <li><a href="APITypes.html.pl#functype_pass">Direct Pass to Original "ntoskrnl.exe"</a>
+ <ul>
+ <li><a href="APITypes.html.pl#functype_pass_fromunix">Pass from UNIX Code</a></li>
+ <li><a href="APITypes.html.pl#functype_pass_fromw32">Pass from W32 Code</a></li>
+ </ul></li>
+ <li><a href="APITypes.html.pl#functype_wrap">Wrap of the Original "ntoskrnl.exe" Function</a>
+ <ul>
+ <li><a href="APITypes.html.pl#functype_wrap_fromunix">Wrapping of Call from UNIX Code</a></li>
+ <li><a href="APITypes.html.pl#functype_wrap_fromw32">Wrapping of Call from W32 Code</a></li>
+ </ul></li>
+ <li><a href="APITypes.html.pl#functype_native">Native Implementation</a>
+ <ul>
+ <li><a href="APITypes.html.pl#functype_native_fromunix">Native Implementation Called from UNIX Code</a></li>
+ <li><a href="APITypes.html.pl#functype_native_fromw32">Native Implementation of "unpatched"
+ Library Function Called from W32 Code</a></li>
+ <li><a href="APITypes.html.pl#functype_native_fromw32_patched">Native Implementation of "patched"
+ Library Function Called from W32 Code</a></li>
+ <li><a href="APITypes.html.pl#functype_native_reactos">Native Implementation - ReactOS</a></li>
+ <li><a href="APITypes.html.pl#functype_native_wine">Native Implementation – Wine</a></li>
+ <li><a href="APITypes.html.pl#functype_native_libcaptive">Native Implementation – Project Specific</a></li>
+ </ul></li>
+ <li><a href="APITypes.html.pl#functype_undef">Undefined Function</a></li>
+ </ul></li>
+
+ <li><a href="CallType.html.pl">API Function Calling Conventions</a>
+ <ul>
+ <li><a href="CallType.html.pl#calltype_cdecl">W32 Calling Convention "cdecl"</a></li>
+ <li><a href="CallType.html.pl#calltype_stdcall">W32 Calling Convention "stdcall"</a></li>
+ <li><a href="CallType.html.pl#calltype_fastcall">W32 Calling Convention "fastcall"</a></li>
+ </ul></li>
+ </ul></li>
+
+<li><a href="TODO.html.pl#todo_fsck">TODO: Fsck of NTFS</a></li>
+<li><a href="TODO.html.pl#todo_surprise">TODO: NTFS Support for Partition Surprise</a></li>
+
+<li><a href="Related.html.pl">Related Projects</a>
+ <ul>
+ <li><a href="Related.html.pl#LinuxNTFScompet">Linux NTFS</a></li>
+ <li><a href="Related.html.pl#NTPwd">NTPwd NTFS Driver</a></li>
+ <li><a href="Related.html.pl#vmware">VMware Workstation</a></li>
+ <li><a href="Related.html.pl#wine">Wine Project</a></li>
+ <li><a href="Related.html.pl#ntfs98">NTFS for Windows 98</a></li>
+ <li><a href="Related.html.pl#ntfsdos">NTFSDOS Professional</a></li>
+ </ul></li>
+
+<li><a href="LinuxNTFS.html.pl">Re: 7.7 Can't we write a wrapper for Windows' driver?</a></li>
+
+</ul>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc LinuxNTFS page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::LinuxNTFS;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: Captive vs. Linux-NTFS',
+ "rel_prev"=>'Related.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<h1>Re: @{[ a_href 'http://linux-ntfs.sourceforge.net/info/ntfs.html#7.7',
+ "7.7 Can't we write a wrapper for Windows' driver?" ]}</h1>
+
+ <p class="re">> It sounds like a great idea, to start with, but there are numerous
+ problems.</p>
+
+ <p><span class="re">> The largest technical problem is joining the Windows
+ system DLL to the Linux VFS. It could be done, but it wouldn't be pretty.</span><br />
+ Yep. :-)</p>
+
+ <p><span class="re">> It would have to run as part of the kernel which would mean
+ that if it went wrong it could crash the machine. With no source, we might not
+ be able to work around the problem.</span><br />
+ @{[ a_href 'Details.html.pl#sandbox','Nope' ]},
+ @{[ a_href 'http://lufs.sourceforge.net/lufs/','Linux Userland File System (LUFS)' ]}
+ moves the filesystem implementation to UNIX userland where the Microsoft
+ Windows filesystem is completely unarmed by Captive jail of chroot(2),
+ setuid(2) and setrlimit(2). There only remains one narrow connection to the rest of
+ system (by CORBA/ORBit). The filesystem's life environment gets kill(2)ed when
+ UNIX is no longer satisfied with it. Safety similiar to
+ @{[ a_href 'http://www.vmware.com/solutions/security.html','VMware sandbox' ]}.</p>
+
+ <p><span class="re">> The next major problem is compati<!--orig. text typo-->bility.
+ Which version of the Windows system file would we use? Picking one would limit
+ its use, making the wrapper versatile for all of them would be a programming
+ nightmare.</span><br />
+ Microsoft Windows NTFS filesystem driver is capable of accessing older formats
+ of the filesystem. This project currently runs Microsoft Windows XP version,
+ porting to Microsoft Windows 2003 Server expected. (Microsoft Windows upgrades
+ NTFS disk filesystem to its own version during complete CD-ROM Microsoft
+ Windows system installation – such operation is not threat this project use.)</p>
+
+ <p><span class="re">> And it gets worse. The legal implications of
+ distributing Windows systems files would cause problems.</span><br />
+ User must be careful to obey all licensing restrictions according to his
+ local country laws.<br />
+ <span class="re">> Also the proprietary nature of the driver would mean that
+ the other kernel coders would not investigate any problems if someone had used
+ the NTFS wrapper.</span><br />
+ It does not apply to this project due to the implemented
+ @{[ a_href 'Details.html.pl#sandbox','filesystem separation' ]}.</p>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc macros.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::Macros;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use Exporter;
+our @EXPORT=qw(
+ &doc_img &productname &captive_srcfile
+ $freespeech $freebeer $Wine $ReactOS $LinuxNTFS $GnomeVFS $GnomeVFSmodule $gnulinux
+ );
+our @ISA=qw(Exporter);
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+Wrequire 'My::Project';
+
+
+sub init ($%)
+{
+my($class,%args)=@_;
+
+ %args=(
+ "rel_start"=>top_dir("/project/captive/"),
+ "rel_up"=>top_dir("/project/captive/doc/"),
+ %args);
+ My::Web->init(
+ "head_css"=>"
+.productname { font-family: cursive; }
+.fname { font-family: monospace; }
+.constant { font-family: monospace; }
+.author { font-family: cursive; }
+.stuff { font-style: italic; font-size: larger; margin-left: 20%; margin-right: 10%; }
+.function { font-family: monospace; }
+.type { font-family: monospace; }
+.command { font-family: monospace; }
+.instruction { font-style: italic; }
+",
+ "WebConfig::heading_novskip"=>1,
+ %args,
+ );
+ My::Web->heading();
+ print My::Project->section("captive");
+ $class->navigate();
+}
+
+sub footer ($)
+{
+my($class)=@_;
+
+ print vskip "2ex";
+ project::captive::doc::Macros->navigate("footer");
+ My::Web->footer();
+}
+
+sub navigate ($;$)
+{
+my($class,$where)=@_;
+
+ print '<table border="0" width="100%"><tr>'."\n";
+ print '<col width="'.$_.'%" />'."\n" for (qw(10 20 40 20 10));
+ print '<td></td>'."\n";
+ print '<td align="left">';
+ print img "/My/arrow-left" ,"Previous document","a_href"=>$My::Web::W->{"rel_prev"}
+ if $My::Web::W->{"rel_prev"};
+ print '</td>'."\n";
+ print '<td align="center">';
+ print img "/My/arrow-up" ,"Parent","a_href"=>$My::Web::W->{"rel_up"}
+ if $My::Web::W->{"rel_up"} && !($where && $where eq "footer");
+ print '</td>'."\n";
+ print '<td align="right">';
+ print img "/My/arrow-right","Next document","a_href"=>$My::Web::W->{"rel_next"}
+ if $My::Web::W->{"rel_next"};
+ print '</td>'."\n";
+ print '<td></td>'."\n";
+ print '</tr></table>'."\n";
+}
+
+sub doc_img ($$)
+{
+my($img_base,$caption)=@_;
+
+ my $r="";
+ $r.='<table border="0" align="center">'."\n";
+ $r.="\t<tr><td>".img($img_base,$caption)."</td></tr>\n";
+ $r.="\t<caption>$caption</caption>\n";
+ $r.='</table>'."\n";
+ $r.=vskip "2ex";
+ return $r;
+}
+
+sub captive_srcfile ($;$)
+{
+my($filename,$text)=@_;
+
+ a_href 'http://cvs.jankratochvil.net/viewcvs/*checkout*/captive/'.$filename.'?rev=HEAD',
+ ($text || $filename);
+}
+
+our $freespeech=a_href 'http://www.gnu.org/philosophy/free-sw.html','Free';
+our $freebeer=a_href 'http://www.gnu.org/philosophy/free-sw.html','free (as in beer)';
+
+sub productname
+{
+my($url,$name)=@_;
+
+ return '<span class="productname">'.a_href($url,CGI::escapeHTML($name)).'</span>';
+}
+our $Wine=productname 'http://www.winehq.com/','Wine';
+our $ReactOS=productname 'http://www.reactos.com/','ReactOS';
+our $LinuxNTFS=productname 'http://linux-ntfs.sourceforge.net/','Linux NTFS';
+our $GnomeVFS=productname 'http://developer.gnome.org/doc/API/gnome-vfs/','Gnome-VFS';
+our $GnomeVFSmodule=productname 'http://developer.gnome.org/doc/API/gnome-vfs/modules.html','Gnome-VFS-module';
+our $gnulinux='GNU/Linux';
+
+
+1;
-#! /usr/bin/perl
-#
# $Id$
-# Main page of 'My::Project::kix'
+# automake source for the Makefile of project/captive/ documentation
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
-use strict;
-use warnings;
-
-use My::Web;
-use project::kix::ListItem;
+include $(top_srcdir)/Makefile-head.am
+SUBDIRS= \
+ fig \
+ dia
-My::Web->init_project(
- "ListItem"=>\%My::Project::kix::ListItem,
- );
+EXTRA_DIST+= \
+ Index.html.pl
-My::Web->footer();
+CLEANFILES+= \
+ *.gif
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Related Projects page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::Related;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: Related Projects',
+ "rel_prev"=>'TODO.html.pl',
+ "rel_next"=>'LinuxNTFS.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<h1>Related Projects</h1>
+
+ <p>The usual solution for file exchange between $freespeech operating systems
+ and <span class="productname">Microsoft Windows NT</span> is to use
+ <span class="productname">FAT32</span> (<span class="productname">vfat</span>
+ called in $gnulinux) partition and swap the files over it. This method is not
+ very comfortable as you never have access to all the files of the other
+ operating system.</p>
+
+ <a name="LinuxNTFScompet"><h2>$LinuxNTFS</h2></a>
+
+ <p>Although this project takes a completely different approach and has
+ a different architecture, the final goal is the same as for this
+ project – reliable read-write <span class="productname">NTFS</span>
+ filesystem support. $LinuxNTFS goes the way of reverse engineering
+ filesystem data structures (and possibly
+ <span class="fname">ntfs.sys</span> itself). Unfortunately after many years
+ of its development it did not yet reach the state of reliable read-write
+ access although its read-only part is considered trustworthy.</p>
+
+ <p>Using $LinuxNTFS for read-only access to existing partition with
+ <span class="productname">Microsoft Windows NT</span> installation is
+ implemented for successful acquire of <span class="fname">ntfs.sys</span>,
+ <span class="fname">ntoskrnl.exe</span> and possibly even
+ <span class="fname">fastfat.sys</span> and/or
+ <span class="fname">cdfs.sys</span> files from the user's
+ <span class="productname">NTFS</span> partition.</p>
+
+ <a name="NTPwd"><h2><span class="productname">@{[ a_href 'http://www.cgsecurity.org/ntfs.html',
+ 'NTPwd NTFS Driver' ]}</span></h2></a>
+
+ <p>DOS based @{[ a_href 'http://www.gnu.org/licenses/gpl.html','GPL-2.0' ]}
+ read-write NTFS driver. Filesystem structures are reverse engineered in the
+ way of @{[ a_href 'Related.html.pl#LinuxNTFScompet','Linux-NTFS Project' ]}. As it is not very
+ actively maintained it reaches a lower level of
+ <span class="productname">NTFS</span> compatibility.</p>
+
+ <a name="vmware"><h2>@{[ a_href 'http://www.vmware.com/download/workstation.html','VMware Workstation' ]}</h2></a>
+
+ <p>The only real competition: Closed-source read/write @{[ '$299' ]} equivalent.</p>
+
+ <p>Original Microsoft Windows operating system can be run inside a virtual
+ machine running under GNU/Linux and share the read-write NTFS disk by using
+ a network file sharing through a VMware virtual network card.</p>
+
+ <p>You need @{[ '$299' ]} for this product and you need to
+ give up your system security by running un@{[ a_href 'Details.html.pl#sandbox','sandbox' ]}ed
+ closed-source program in your GNU/Linux.</p>
+
+ <a name="wine"><h2>@{[ a_href 'http://www.winehq.com/','Wine Project' ]}</h2></a>
+
+ <p>No code could be shared – Wine emulates only Microsoft Windows userland.
+ Filesystem drivers completely belong to Microsoft Windows kernelland.</p>
+
+ <a name="ntfs98"<h2>@{[ a_href 'http://www.sysinternals.com/ntw2k/freeware/ntfswin98.shtml','NTFS for Windows 98' ]}</h2></a>
+
+ <p>Closed-source read-only-crippled @{[ '$0' ]} equivalent for Microsoft Windows.</p>
+
+ <p>There is a @{[ a_href 'http://www.sysinternals.com/images/screenshots/ntfs98ap.gif',
+ 'diagram' ]} showing exactly the principle of Captive NTFS project.
+ There is apparently disabled read/write functionality in <i>NTFS for
+ Windows 98</i> as the same company also sells the following product sharing
+ the same codebase:</p>
+
+ <a name="ntfsdos"><h2>@{[ a_href 'http://www.winternals.com/products/repairandrecovery/ntfsdospro.asp',
+ 'NTFSDOS Professional' ]}</h2></a>
+
+ <p>Closed-source read/write @{[ '$299' ]} equivalent for MS-DOS.</p>
+
+ <p>This product is the most close equivalent to Captive NTFS but it is
+ a commercial product, closed-source and it has filesystem interface only
+ for MS-DOS.</p>
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc Reverse Engineering page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::Reverse;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: Reverse Engineering',
+ "rel_prev"=>'Components.html.pl',
+ "rel_next"=>'CacheManager.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<a name="reverse"><h1>Reverse Engineering</h1></a>
+
+ <p>This project has no intentions to reverse engineer and document the
+ filesystem data structures themselves since they are being encapsulated by
+ the filesystem driver. For these reasons the resources available in
+ projects such as $LinuxNTFS get out of any possible use. This project goal
+ is to provide fully compatible API interface to the rest of the W32 system
+ to persuade the filesystem driver it is running in the native
+ <span class="productname">Microsoft Windows XP</span> environment.</p>
+
+ <p>All the W32 filesystem drivers are running in the W32 kernel address
+ space and this area of W32 API is not much documented by
+ <span class="productname">Microsoft</span>. Some API functions are not
+ documented at all and the others are documented insufficiently for a their
+ possibly needed reimplementation from scratch. Documentation being
+ consulted primarily consists of
+ <span class="productname">@{[ a_href 'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/kmhdr_6enb.asp','MSDN (Microsoft Developer Network) Kernel-Mode Driver Architecture: Windows DDK' ]}</span>
+ documentation and also various other 3rd party documentation resources such as
+ <span class="productname">@{[ a_href 'http://www.osr.com/ntinsider/1996/cacheman.htm',
+ 'The NT Cache Manager Description' ]}</span>,
+ <span class="productname">@{[ a_href 'http://www.winntmag.com/Articles/Print.cfm?ArticleID=3864',
+ 'Learn About NT'."'".'s File-system Cache' ]}</span>,
+ <span class="productname">@{[ a_href 'http://www.ntfsd.org/archive/',
+ 'NT File System Developers mailing list archives' ]}</span>
+ including various
+ @{[ a_href 'http://www.google.com/search?q=site%3Amicrosoft.com','fulltext searches' ]}
+ through Internet from case to case.</p>
+
+ <p>Sometimes no sufficient documentation was found and some code behaviour
+ had to be reverse engineered directly from the binaries of
+ <span class="fname">ntoskrnl.exe</span>,
+ <span class="fname">cdfs.sys</span>,
+ <span class="fname">fastfat.sys</span>
+ and primarily
+ <span class="fname">ntfs.sys</span>.
+ Up to now the code was disassembled by
+ <span class="productname">@{[ a_href 'http://www.simtel.net/pub/pd/29498.html','IDA Freeware' ]}</span>
+ and by
+ <span class="productname">dumpbin.exe</span> of
+ <span class="productname">Microsoft Visual Studio</span>.
+ <span class="productname">dumpbin.exe</span> is fortunately able to
+ interpret debug symbols from W32 <span class="fname">.PDB</span>
+ (Program DataBase) debug information files.</p>
+
+ <a name="dumpbin"><h2><span class="productname">dumpbin.exe</span></h2></a>
+
+ <p>You should use the following options for
+ <span class="productname">dumpbin.exe</span>:</p>
+
+ <blockquote class="command">
+ <p>dumpbin.exe /all /rawdata:none /disasm /pdbpath:verbose FILENAME.SYS</p>
+ </blockquote>
+
+ <p>You should see the following line in the output:</p>
+
+ <blockquote class="command">
+ <p>PDB file found at '.\\FILENAME.pdb'</p>
+ </blockquote>
+
+ <a name="WinDbg"><h2><span class="productname">WinDbg</span> Windows NT kernel debugging</h2></a>
+
+ <p><span class="productname">WinDbg</span> is downloadable from:
+ @{[ a_href 'http://www.microsoft.com/whdc/ddk/debugging/installx86.mspx' ]}</p>
+
+ <p>This is (the only?) tool able to debug filesystem drivers incl.
+ <span class="fname">ntfs.sys</span>. You will need two computers running
+ <span class="productname">Microsoft Windows</span> — one computer will run
+ <span class="productname">WinDbg</span> while the other one will be
+ frozen in remote Windows NT kernel debug mode. It does not matter which
+ <span class="productname">Microsoft Windows</span> version will be run
+ on the <span class="productname">WinDbg</span> side. Your goal is to
+ successfuly connect <span class="productname">WinDbg</span>:</p>
+
+ @{[ doc_img 'ntdebug-ntfs','<span class="productname">WinDbg</span> Remote NT Kernel NTFS Debugging' ]}
+
+ <p>The most easy way to setup two computers is to use commercial
+ <span class="productname">@{[ a_href 'http://www.vmware.com/download/workstation.html','VMware Workstation' ]}</span>
+ where you can run two virtual machines simultaneously on single PC
+ hardware and you can connect them by a virtual serial port provided by
+ <span class="productname">VMware</span>.</p>
+
+ <a name="WinDbg_WinDbg"><h3><span class="productname">WinDbg</span> side setup</h3></a>
+
+ @{[ doc_img 'ntdebug-vmware-windbg',
+ '<span class="productname">VMware</span> virtual serial port'
+ .' of <span class="productname">WinDbg</span> side' ]}
+
+ <p>You should setup <span class="productname">WinDbg</span> according
+ to:</p>
+
+ @{[ doc_img 'ntdebug-windbg-port','Port settings of <span class="productname">WinDbg</span>' ]}
+ @{[ doc_img 'ntdebug-windbg-sym','Symbols files location of <span class="productname">WinDbg</span>' ]}
+
+ <span class="constant">Symbols</span> should point to the directory where
+ reside files extracted from the symbol archive for your version of
+ <span class="productname">Microsoft Windows</span>. In the case of the
+ recommended <span class="productname">Microsoft Windows XP Service Pack 1 Checked Build</span>
+ you should use:
+ @{[ a_href 'http://msdl.microsoft.com/download/symbols/packages/windowsxp/xpsp1sym_x86_chk.exe' ]}</p>
+
+ <blockquote class="command">
+ <p># Rename xpsp1sym_x86_chk.exe contents .pdb files for WinDbg<br />
+ @{[ CGI::escapeHTML(q{for i in *.pdb*;do ext="`echo $i|sed 's/^.*\.pdb\.\(.*\)$/\1/'`";if [ "$i" = "$ext" ];then echo "BAD:$i";break;fi;base="`echo $i|sed 's/\(\.pdb\)\..*$/\1/'`";echo "md $ext";echo "move /-y $i $ext\\$base";done|sort -u|sed 's/$/'`echo -ne '\r'`'/g' >/tmp/rename.bat}) ]}</p>
+ </blockquote>
+
+ <p>The resulting <span class="command">rename.bat</span> for
+ <span class="command">xpsp1sym_x86_chk.exe</span> can be found at:
+ @{[ a_href 'xpsp1sym_x86_chk-rename.bat.zip' ]}</p>
+
+ <p>The resulting directory should contain at least
+ <span class="command">sys\\ntfs.pdb</span>
+ and
+ <span class="command">exe\\ntoskrnl.pdb</span>.</p>
+
+ <p>Your successfuly connected target (after the steps described
+ below) should look like:</p>
+
+ @{[ doc_img 'ntdebug-windbg-boot','Successfuly connected <span class="productname">WinDbg</span>' ]}
+
+ <a name="WinDbg_kern"><h3>Setup of the side being kernel-debugged</h3></a>
+
+ @{[ doc_img 'ntdebug-vmware-xpdebug',
+ '<span class="productname">VMware</span> virtual serial port'
+ .' of the side being kernel-debugged' ]}
+
+ <p>You must use the following options in your
+ <span class="command">c:\\boot.init</span> command-line:</p>
+
+ <blockquote class="command">
+ <p>/debug /debugport=COM1 /baudrate=115200</p>
+ </blockquote>
+
+ <p>After booting this <span class="command">boot.ini</span>-entry
+ should freeze at this point
+ (if no <span class="productname">WinDbg</span> is waiting in the other
+ virtual machine):</p>
+
+ @{[ doc_img 'ntdebug-wait','Side being kernel-debugged waiting for <span class="productname">WinDbg</span>' ]}
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Captive project doc TODO page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::captive::doc::TODO;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+BEGIN { Wuse 'project::captive::doc::Macros'; }
+
+
+project::captive::doc::Macros->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>'Captive NTFS Developer Documentation: TODO',
+ "rel_prev"=>'CallType.html.pl',
+ "rel_next"=>'Related.html.pl',
+ );
+
+
+print <<"HERE";
+
+
+<a name="todo_fsck"><h1>TODO: Fsck of NTFS</h1></a>
+
+ <p>Currently this project does not support checking of data structures
+ of NTFS volume as being provided by <span class="command">chkdsk.exe</span>
+ in W32 environment and <span class="command">fsck</span> in UNIX OS.</p>
+
+ <p>W32 has its disk checking functionality split to
+ <span class="fname">untfs.dll</span> W32 userland library.
+ according to
+ @{[ a_href 'http://www.sysinternals.com/ntw2k/source/fmifs.shtml',
+ 'Chkdskx and Formatx' ]}
+ by @{[ a_href 'http://www.sysinternals.com/aboutus.shtml',
+ 'Mark Russinovich' ]}.
+
+ <p>I assume its execution falls completely
+ @{[ a_href 'Architecture.html.pl#existing_emulation','out of scope' ]}
+ of this project as it is W32 userland.</p>
+
+ <p>This possibility was not yet investigated in any way.</p>
+
+
+<a name="todo_surprise"><h1>TODO: NTFS Support for
+ <span class="productname">@{[ a_href '/project/surprise/','Partition Surprise' ]}</span></h1></a>
+
+ <p>Although there currently exists
+ <span class="productname">@{[ a_href 'http://mlf.linux.rulez.org/mlf/ezaz/ntfsresize.html','ntfsresize' ]}</span>
+ I am not sure whether it is really reliable for all NTFS filesystems.
+ <span class="productname">@{[ a_href '/project/surprise/','Partition Surprise' ]}</span>
+ is the only partition manager capable of safely resize the disk
+ by using just the original W32 filesystem driver by full rebuild of
+ filesystem metadata.
+ Almost no file data blocks would be moved even on these generic filesystems
+ as W32 supports <span class="constant">FSCTL_MOVE_FILE</span> request
+ according to
+ @{[ a_href 'http://www.sysinternals.com/ntw2k/info/defrag.shtml',
+ 'Inside Windows NT Disk Defragmenting' ]}
+ by @{[ a_href 'http://www.sysinternals.com/aboutus.shtml',
+ 'Mark Russinovich' ]}.
+
+
+HERE
+
+
+project::captive::doc::Macros->footer();
-#! /usr/bin/perl
-#
# $Id$
-# Main page of 'My::Project::kware'
+# automake source for the Makefile of project/captive/ documentation .dia-s
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
-use strict;
-use warnings;
-
-use My::Web;
-use project::kware::ListItem;
+include $(top_srcdir)/Makefile-head.am
+EXTRA_DIST+= \
+ cache-manager.dia \
+ inheritance.dia \
+ parent-connector.dia
-My::Web->init_project(
- "ListItem"=>\%My::Project::kware::ListItem,
- );
+CLEANFILES+= \
+ *.dia~
-My::Web->footer();
+#CLEANFILES+= \
+# *.png \
+# *.gif
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+ <dia:diagramdata>
+ <dia:attribute name="background">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="paper">
+ <dia:composite type="paper">
+ <dia:attribute name="name">
+ <dia:string>#A4#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="tmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="bmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="lmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="rmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="is_portrait">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="scaling">
+ <dia:real val="0.25"/>
+ </dia:attribute>
+ <dia:attribute name="fitto">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="grid">
+ <dia:composite type="grid">
+ <dia:attribute name="width_x">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="width_y">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_x">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_y">
+ <dia:int val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="guides">
+ <dia:composite type="guides">
+ <dia:attribute name="hguides"/>
+ <dia:attribute name="vguides"/>
+ </dia:composite>
+ </dia:attribute>
+ </dia:diagramdata>
+ <dia:layer name="Background" visible="true">
+ <dia:object type="Standard - Box" version="0" id="O0">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-19,-6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-19.5,-6.5;47.5,36.5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-19,-6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="66"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="42"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O1">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.4,11.75;15.6,30.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="14,30"/>
+ <dia:point val="14,19"/>
+ <dia:point val="14,19"/>
+ <dia:point val="14,12"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="4"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O18" connection="1"/>
+ <dia:connection handle="1" to="O5" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O2">
+ <dia:attribute name="obj_pos">
+ <dia:point val="34,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.4,11.75;34.25,19.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="34,19"/>
+ <dia:point val="34,17"/>
+ <dia:point val="14,17"/>
+ <dia:point val="14,12"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O14" connection="1"/>
+ <dia:connection handle="1" to="O5" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O3">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="13.75,22.75;35.6,30.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="14,30"/>
+ <dia:point val="14,25"/>
+ <dia:point val="34,25"/>
+ <dia:point val="34,23"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O18" connection="1"/>
+ <dia:connection handle="1" to="O14" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O4">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-10,3"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-10.25,2.75;27.25,12.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-10,3"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="37"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="9"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O5">
+ <dia:attribute name="obj_pos">
+ <dia:point val="2,8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="1.75,7.75;26.25,12.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="2,8"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O6">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="2.1695,8.6;25.8305,11.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Cache Manager#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="14,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O7">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-6,8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-6.25,7.75;0.25,12.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-6,8"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-3,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-4.1385,8.6;-1.8615,11.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#...#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-3,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O9">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-9.504,3.6;9.504,6.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ntoskrnl.exe#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="0,6"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O10">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-7,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-7.25,11.75;-2.4,30.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="-7,30"/>
+ <dia:point val="-7,15"/>
+ <dia:point val="-4,15"/>
+ <dia:point val="-4,12"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O16" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O11">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-7,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-7.25,11.75;13.6,30.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="-7,30"/>
+ <dia:point val="-7,16"/>
+ <dia:point val="12,16"/>
+ <dia:point val="12,12"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O16" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O12">
+ <dia:attribute name="obj_pos">
+ <dia:point val="28,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27.95,21.3553;28,22.3053"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="28,22"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-3.6,11.75;14.25,30.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="14,30"/>
+ <dia:point val="14,27"/>
+ <dia:point val="-2,27"/>
+ <dia:point val="-2,12"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O18" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O14">
+ <dia:attribute name="obj_pos">
+ <dia:point val="24,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="23.75,18.75;44.25,23.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="24,19"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="20"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O15">
+ <dia:attribute name="obj_pos">
+ <dia:point val="34,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="24.4465,19.6;43.5535,22.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#TraceFS.sys#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="34,22"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O16">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-16,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-16.25,29.75;2.25,34.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-16,30"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O17">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-7,33"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-15.0685,30.55;1.1185,33.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#fastfat.sys#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-7,33"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O18">
+ <dia:attribute name="obj_pos">
+ <dia:point val="7,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="6.75,29.75;21.25,34.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="7,30"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O19">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,33"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="7.9115,30.55;20.1385,33.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ntfs.sys#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="14,33"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O20">
+ <dia:attribute name="obj_pos">
+ <dia:point val="15,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="15,19.35;22.442,21.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#hooked#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="15,21"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O21">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,-1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-19.858,-4.25;47.908,-0.1"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#TraceFS Cache Manager hooking#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="14,-1"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:layer>
+</dia:diagram>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+ <dia:diagramdata>
+ <dia:attribute name="background">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="paper">
+ <dia:composite type="paper">
+ <dia:attribute name="name">
+ <dia:string>#A4#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="tmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="bmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="lmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="rmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="is_portrait">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="scaling">
+ <dia:real val="0.25"/>
+ </dia:attribute>
+ <dia:attribute name="fitto">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="grid">
+ <dia:composite type="grid">
+ <dia:attribute name="width_x">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="width_y">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_x">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_y">
+ <dia:int val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="guides">
+ <dia:composite type="guides">
+ <dia:attribute name="hguides"/>
+ <dia:attribute name="vguides"/>
+ </dia:composite>
+ </dia:attribute>
+ </dia:diagramdata>
+ <dia:layer name="Background" visible="true">
+ <dia:object type="Standard - Box" version="0" id="O0">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,-97"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-23.5,-97.5;123.5,123.5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-23,-97"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="146"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="220"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O1">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-7,-26"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-7.5,-26.5;80.5,40.5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-7,-26"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="87"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="66"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O2">
+ <dia:attribute name="obj_pos">
+ <dia:point val="5,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="4.75,9.75;19.25,14.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="5,10"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O3">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,13"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="5.5155,10.6;18.4845,13.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#cdfs.sys#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12,13"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O4">
+ <dia:attribute name="obj_pos">
+ <dia:point val="21,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="20.75,9.75;39.25,14.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="21,10"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O5">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,13"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="21.9315,10.6;38.0685,13.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#fastfat.sys#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="30,13"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O6">
+ <dia:attribute name="obj_pos">
+ <dia:point val="41,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="40.75,9.75;59.25,14.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="41,10"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O7">
+ <dia:attribute name="obj_pos">
+ <dia:point val="50,13"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="41.1395,10.6;58.8605,13.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ext2fsd.sys#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="50,13"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Line" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,14"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="11.75,13.75;12.25,22.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="12,14"/>
+ <dia:point val="12,22"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O2" connection="6"/>
+ <dia:connection handle="1" to="O32" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O9">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,14"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,13.75;50.3536,17.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="30,14"/>
+ <dia:point val="30,17"/>
+ <dia:point val="50,17"/>
+ <dia:point val="50,17"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O4" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O10">
+ <dia:attribute name="obj_pos">
+ <dia:point val="50,14"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="49.75,13.75;50.25,17.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="50,14"/>
+ <dia:point val="50,17"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O6" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O11">
+ <dia:attribute name="obj_pos">
+ <dia:point val="68,14"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="49.6464,13.75;68.25,17.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="68,14"/>
+ <dia:point val="68,17"/>
+ <dia:point val="50,17"/>
+ <dia:point val="50,17"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O30" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O12">
+ <dia:attribute name="obj_pos">
+ <dia:point val="50,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="49.75,16.75;50.25,22.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="50,22"/>
+ <dia:point val="50,17"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O105" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,29"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="11.75,28.75;30.3536,32.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="12,29"/>
+ <dia:point val="12,32"/>
+ <dia:point val="30,32"/>
+ <dia:point val="30,32"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O32" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O14">
+ <dia:attribute name="obj_pos">
+ <dia:point val="50,29"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.6464,28.75;50.25,32.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="50,29"/>
+ <dia:point val="50,32"/>
+ <dia:point val="30,32"/>
+ <dia:point val="30,32"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O105" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O15">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,32"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,31.75;30.25,40.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,32"/>
+ <dia:point val="30,40"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O16">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,36"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,34.4;44.53,36.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[GIOChannel]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,36"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O17">
+ <dia:attribute name="obj_pos">
+ <dia:point val="32,43"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="32,41.4;47.774,43.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[CORBA/ORBit]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="32,43"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O18">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,50"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,48.4;44.53,50.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[GIOChannel]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,50"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O19">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,65"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,63.4;44.53,65.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[GIOChannel]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,65"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O20">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,62"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,61.75;30.25,67.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,62"/>
+ <dia:point val="30,67"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O107" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - PolyLine" version="0" id="O21">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,67"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="20.75,66.75;30.25,81.25"/>
+ </dia:attribute>
+ <dia:attribute name="poly_points">
+ <dia:point val="30,67"/>
+ <dia:point val="21,67"/>
+ <dia:point val="21,81"/>
+ <dia:point val="30,81"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O22">
+ <dia:attribute name="obj_pos">
+ <dia:point val="25,69"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="24.75,68.75;53.25,79.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="25,69"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="28"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="10"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O23">
+ <dia:attribute name="obj_pos">
+ <dia:point val="39,72"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="25.0905,69.6;52.9095,78.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#captive
+r/w-over-r/o buffer
+[giochannel-blind]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="39,72"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O24">
+ <dia:attribute name="obj_pos">
+ <dia:point val="39,69"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.6464,66.75;39.25,69.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="39,69"/>
+ <dia:point val="39,67"/>
+ <dia:point val="30,67"/>
+ <dia:point val="30,67"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O25">
+ <dia:attribute name="obj_pos">
+ <dia:point val="39,79"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.6464,78.75;39.25,81.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="39,79"/>
+ <dia:point val="39,81"/>
+ <dia:point val="30,81"/>
+ <dia:point val="30,81"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O22" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O26">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20,82"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="11.882,80.4;20,82.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#--ro/--rw#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20,82"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O27">
+ <dia:attribute name="obj_pos">
+ <dia:point val="39,82"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="39,80.4;45.336,82.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#--blind#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="39,82"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O28">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,86"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,84.4;44.53,86.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[GIOChannel]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,86"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O29">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,81"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,80.75;30.25,88.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,81"/>
+ <dia:point val="30,88"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O30">
+ <dia:attribute name="obj_pos">
+ <dia:point val="61,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="60.75,9.75;75.25,14.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="61,10"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O31">
+ <dia:attribute name="obj_pos">
+ <dia:point val="68,13"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="61.9115,10.6;74.0885,13.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ntfs.sys#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="68,13"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O32">
+ <dia:attribute name="obj_pos">
+ <dia:point val="1,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.75,21.75;23.25,29.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="1,22"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="22"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="7"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O33">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,25"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.912,22.6;23.088,28.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#captive
+storage/cdrom#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12,25"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O34">
+ <dia:attribute name="obj_pos">
+ <dia:point val="32,90"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31.75,89.75;52.25,97.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="32,90"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="20"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="7"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O35">
+ <dia:attribute name="obj_pos">
+ <dia:point val="42,93"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31.9515,90.6;52.0485,96.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#captive
+giognomevfs#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="42,93"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O36">
+ <dia:attribute name="obj_pos">
+ <dia:point val="42,100"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="42,98.136;66.805,100.636"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[GnomeVFSHandle]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2.5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="42,100"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O37">
+ <dia:attribute name="obj_pos">
+ <dia:point val="33,101"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="32.75,100.75;51.25,105.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="33,101"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O38">
+ <dia:attribute name="obj_pos">
+ <dia:point val="42,104"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="33.387,101.6;50.613,104.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GnomeVFS#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="42,104"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Line" version="0" id="O39">
+ <dia:attribute name="obj_pos">
+ <dia:point val="42,97"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="41.75,96.75;42.25,101.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="42,97"/>
+ <dia:point val="42,101"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O34" connection="6"/>
+ <dia:connection handle="1" to="O37" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O40">
+ <dia:attribute name="obj_pos">
+ <dia:point val="42,90"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.6464,87.75;42.25,90.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="42,90"/>
+ <dia:point val="42,88"/>
+ <dia:point val="30,88"/>
+ <dia:point val="30,88"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O34" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O41">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,88"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="14.75,87.75;30,95.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="30,88"/>
+ <dia:point val="30,88"/>
+ <dia:point val="15,88"/>
+ <dia:point val="15,95"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="1" to="O122" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O42">
+ <dia:attribute name="obj_pos">
+ <dia:point val="75,95"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="74.75,94.75;103.25,102.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="75,95"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="28"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="7"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O43">
+ <dia:attribute name="obj_pos">
+ <dia:point val="89,98"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="74.6945,95.6;103.306,101.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#captive-bug-replay
+[giochannel-blind]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="89,98"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O44">
+ <dia:attribute name="obj_pos">
+ <dia:point val="90,107"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="90,105.4;106.764,107.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[xmlTextReader]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="90,107"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O45">
+ <dia:attribute name="obj_pos">
+ <dia:point val="89,102"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="88.75,101.75;89.25,110.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="89,102"/>
+ <dia:point val="89,110"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O42" connection="6"/>
+ <dia:connection handle="1" to="O91" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O46">
+ <dia:attribute name="obj_pos">
+ <dia:point val="89,95"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.6464,87.75;89.25,95.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="89,95"/>
+ <dia:point val="89,88"/>
+ <dia:point val="30,88"/>
+ <dia:point val="30,88"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O42" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O47">
+ <dia:attribute name="obj_pos">
+ <dia:point val="42,105"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.6464,104.75;42.25,107.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="42,105"/>
+ <dia:point val="42,107"/>
+ <dia:point val="30,107"/>
+ <dia:point val="30,107"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O37" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O48">
+ <dia:attribute name="obj_pos">
+ <dia:point val="15,102"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="14.75,101.75;30.3536,107.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="15,102"/>
+ <dia:point val="15,107"/>
+ <dia:point val="30,107"/>
+ <dia:point val="30,107"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O122" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O49">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,110"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,106.75;30.25,110.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,110"/>
+ <dia:point val="30,107"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O124" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O50">
+ <dia:attribute name="obj_pos">
+ <dia:point val="11,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-5.038,17.4;11,19.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[W32 block IRP]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="11,19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O51">
+ <dia:attribute name="obj_pos">
+ <dia:point val="49,20"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="32.962,18.4;49,20.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[W32 block IRP]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="49,20"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O52">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="11.75,6.75;30.3536,10.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="12,10"/>
+ <dia:point val="12,7"/>
+ <dia:point val="30,7"/>
+ <dia:point val="30,7"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O2" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O53">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,6.75;30.25,10.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,10"/>
+ <dia:point val="30,7"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O4" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O54">
+ <dia:attribute name="obj_pos">
+ <dia:point val="50,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.6464,6.75;50.25,10.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="50,10"/>
+ <dia:point val="50,7"/>
+ <dia:point val="30,7"/>
+ <dia:point val="30,7"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O6" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O55">
+ <dia:attribute name="obj_pos">
+ <dia:point val="68,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.6464,6.75;68.25,10.25"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="68,10"/>
+ <dia:point val="68,7"/>
+ <dia:point val="30,7"/>
+ <dia:point val="30,7"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O30" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O56">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,7"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,1.75;30.25,7.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,7"/>
+ <dia:point val="30,2"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="1" to="O103" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O57">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,4.4;43.342,6.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[W32 fs IRP]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,6"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O58">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,-16.25;30.25,-10.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,-16"/>
+ <dia:point val="30,-11"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O101" connection="6"/>
+ <dia:connection handle="1" to="O103" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O59">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,-13"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,-14.6;47.698,-12.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[W32 kernel API]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,-13"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O60">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,-21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,-22.6;52.45,-20.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[libcaptive client API]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,-21"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O61">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-26"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27,-34.25;33,-25.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,-26"/>
+ <dia:point val="30,-34"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="1" to="O99" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O62">
+ <dia:attribute name="obj_pos">
+ <dia:point val="32,-28"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="32,-29.6;47.774,-27.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[CORBA/ORBit]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="32,-28"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O63">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,-32"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,-33.6;52.45,-31.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[libcaptive client API]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,-32"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O64">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-46"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,-49.25;30.25,-45.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,-46"/>
+ <dia:point val="30,-49"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="1" to="O97" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O65">
+ <dia:attribute name="obj_pos">
+ <dia:point val="31,-43"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="31,-44.6;52.45,-42.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[libcaptive client API]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="31,-43"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O66">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-20"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,-26.25;30.25,-19.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,-20"/>
+ <dia:point val="30,-26"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O101" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O67">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-42"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,-46.25;30.25,-41.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,-42"/>
+ <dia:point val="30,-46"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O99" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O68">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-46"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-6.25,-49.25;30,-45.75"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="30,-46"/>
+ <dia:point val="30,-46"/>
+ <dia:point val="-6,-46"/>
+ <dia:point val="-6,-49"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="1" to="O83" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O69">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-53"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="28.4,-57.25;31.6,-52.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,-53"/>
+ <dia:point val="30,-57"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O97" connection="1"/>
+ <dia:connection handle="1" to="O111" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O70">
+ <dia:attribute name="obj_pos">
+ <dia:point val="45,-61"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="38.75,-62.6;45.25,-59.4"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="45,-61"/>
+ <dia:point val="39,-61"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O109" connection="3"/>
+ <dia:connection handle="1" to="O111" connection="4"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O71">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-69"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="28.4,-69.25;31.6,-64.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,-69"/>
+ <dia:point val="30,-65"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O118" connection="6"/>
+ <dia:connection handle="1" to="O111" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O72">
+ <dia:attribute name="obj_pos">
+ <dia:point val="27,-82"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="25.4,-86.25;28.6,-81.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="27,-82"/>
+ <dia:point val="27,-86"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O116" connection="1"/>
+ <dia:connection handle="1" to="O113" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - ZigZagLine" version="0" id="O73">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-46"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="30,-49.25;88.25,-45.75"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="30,-46"/>
+ <dia:point val="30,-46"/>
+ <dia:point val="88,-46"/>
+ <dia:point val="88,-49"/>
+ </dia:attribute>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="1"/>
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="1" to="O74" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O74">
+ <dia:attribute name="obj_pos">
+ <dia:point val="72,-53"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="71.75,-53.25;104.25,-48.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="72,-53"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="32"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O75">
+ <dia:attribute name="obj_pos">
+ <dia:point val="88,-50"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="72.4075,-52.4;103.593,-49.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#libcaptive-gnomevfs#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="88,-50"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O76">
+ <dia:attribute name="obj_pos">
+ <dia:point val="79,-63"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="78.75,-63.25;97.25,-58.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="79,-63"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O77">
+ <dia:attribute name="obj_pos">
+ <dia:point val="88,-60"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="79.387,-62.4;96.613,-59.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GnomeVFS#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="88,-60"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Line" version="0" id="O78">
+ <dia:attribute name="obj_pos">
+ <dia:point val="88,-53"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="87.75,-59.25;88.25,-52.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="88,-53"/>
+ <dia:point val="88,-59"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O74" connection="1"/>
+ <dia:connection handle="1" to="O76" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O79">
+ <dia:attribute name="obj_pos">
+ <dia:point val="88,-63"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="87.75,-69.25;88.25,-62.75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="88,-63"/>
+ <dia:point val="88,-69"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O76" connection="1"/>
+ <dia:connection handle="1" to="O80" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O80">
+ <dia:attribute name="obj_pos">
+ <dia:point val="70,-75"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="69.75,-75.25;106.25,-68.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="70,-75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="36"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O81">
+ <dia:attribute name="obj_pos">
+ <dia:point val="71,-74"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="70.75,-74.25;105.25,-69.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="71,-74"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="34"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O82">
+ <dia:attribute name="obj_pos">
+ <dia:point val="88,-71"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="71.8135,-73.4;104.187,-70.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GnomeVFS/test-shell#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="88,-71"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O83">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-19,-58"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-19.25,-58.25;7.25,-48.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-19,-58"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="26"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="9"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O84">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-18,-57"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-18.25,-57.25;6.25,-49.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-18,-57"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="7"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O85">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-6,-54"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-18.177,-56.4;6.177,-50.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#captive-cmdline
+[custom client]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-6,-54"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O86">
+ <dia:attribute name="obj_pos">
+ <dia:point val="11,33"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="3.212,31.4;11,33.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#--cdrom#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="11,33"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O87">
+ <dia:attribute name="obj_pos">
+ <dia:point val="51,33"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="51,31.4;56.676,33.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#--disk#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="51,33"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O88">
+ <dia:attribute name="obj_pos">
+ <dia:point val="42,-38"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="41.75,-39.6;65.25,-36.4"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="42,-38"/>
+ <dia:point val="65,-38"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O99" connection="4"/>
+ <dia:connection handle="1" to="O89" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O89">
+ <dia:attribute name="obj_pos">
+ <dia:point val="65,-42"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="64.75,-42.25;95.25,-33.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="65,-42"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="30"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="corner_radius">
+ <dia:real val="4"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O90">
+ <dia:attribute name="obj_pos">
+ <dia:point val="80,-38"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="65.5955,-40.4;94.4045,-34.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#.captivebug.xml.gz
+[file]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="80,-38"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O91">
+ <dia:attribute name="obj_pos">
+ <dia:point val="74,110"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="73.75,109.75;104.25,118.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="74,110"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="30"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="corner_radius">
+ <dia:real val="4"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O92">
+ <dia:attribute name="obj_pos">
+ <dia:point val="89,114"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="74.5955,111.6;103.404,117.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#.captivebug.xml.gz
+[file]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="89,114"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - PolyLine" version="0" id="O93">
+ <dia:attribute name="obj_pos">
+ <dia:point val="73,28"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="71.6464,27.6464;73.3536,36.3536"/>
+ </dia:attribute>
+ <dia:attribute name="poly_points">
+ <dia:point val="73,28"/>
+ <dia:point val="72,29"/>
+ <dia:point val="73,30"/>
+ <dia:point val="72,31"/>
+ <dia:point val="73,32"/>
+ <dia:point val="72,33"/>
+ <dia:point val="73,34"/>
+ <dia:point val="72,35"/>
+ <dia:point val="73,36"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O94">
+ <dia:attribute name="obj_pos">
+ <dia:point val="73,32"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="72.75,31.75;105.25,32.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="73,32"/>
+ <dia:point val="105,32"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O95">
+ <dia:attribute name="obj_pos">
+ <dia:point val="81,31"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="81,28.6;104.661,31.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#[CORBA/ORBit]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="81,31"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O96">
+ <dia:attribute name="obj_pos">
+ <dia:point val="72,25"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="66.819,23.4;77.181,27.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#W32
+DbgPrint()#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="72,25"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O97">
+ <dia:attribute name="obj_pos">
+ <dia:point val="17,-53"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="16.75,-53.25;43.25,-48.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="17,-53"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="26"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O98">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-50"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.7735,-52.4;42.2265,-49.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#liblufs-captivefs#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="30,-50"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O99">
+ <dia:attribute name="obj_pos">
+ <dia:point val="18,-42"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.75,-42.25;42.25,-33.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="18,-42"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O100">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-38"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.526,-40.4;42.474,-34.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#captive
+sandbox master#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="30,-38"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O101">
+ <dia:attribute name="obj_pos">
+ <dia:point val="18,-20"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.75,-20.25;42.25,-15.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="18,-20"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O102">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="18.021,-19.4;41.979,-16.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#libcaptive/client#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="30,-17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Box" version="0" id="O103">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,-11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.25,-11.25;62.25,2.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-2,-11"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="64"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="13"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O104">
+ <dia:attribute name="obj_pos">
+ <dia:point val="8,-6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-0.547,-8.8;16.547,-5.3"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#libcaptive#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3.5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="8,-6"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O105">
+ <dia:attribute name="obj_pos">
+ <dia:point val="40,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="39.75,21.75;60.25,29.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="40,22"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="20"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="7"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O106">
+ <dia:attribute name="obj_pos">
+ <dia:point val="50,25"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="40.496,22.6;59.504,28.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#captive
+storage/disk#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="50,25"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O107">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,52"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="11.75,51.75;48.25,62.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="12,52"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="36"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="10"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O108">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,55"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.0315,52.6;47.9685,61.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#captive
+sandbox commit buffer
+[giochannel-blind]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="30,55"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O109">
+ <dia:attribute name="obj_pos">
+ <dia:point val="45,-65"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="44.75,-65.25;63.25,-56.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="45,-65"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O110">
+ <dia:attribute name="obj_pos">
+ <dia:point val="54,-61"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="45.387,-63.4;62.613,-57.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#lufsd
+fsctl thread#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="54,-61"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O111">
+ <dia:attribute name="obj_pos">
+ <dia:point val="21,-65"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="20.75,-65.25;39.25,-56.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="21,-65"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O112">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-61"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="21.882,-63.4;38.118,-57.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#lufsd
+slot thread#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="30,-61"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O113">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,-92"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="13.75,-92.25;40.25,-85.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="14,-92"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="26"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O114">
+ <dia:attribute name="obj_pos">
+ <dia:point val="15,-91"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="14.75,-91.25;39.25,-86.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="15,-91"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O115">
+ <dia:attribute name="obj_pos">
+ <dia:point val="27,-88"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="14.823,-90.4;39.177,-87.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#user application#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="27,-88"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O116">
+ <dia:attribute name="obj_pos">
+ <dia:point val="9,-82"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="8.75,-82.25;45.25,-68.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="9,-82"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="36"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="13"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O117">
+ <dia:attribute name="obj_pos">
+ <dia:point val="19,-78"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="9.6445,-80.4;28.3555,-77.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Linux kernel#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="19,-78"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O118">
+ <dia:attribute name="obj_pos">
+ <dia:point val="16,-76"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="15.75,-76.25;44.25,-68.75"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="16,-76"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="28"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="7"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O119">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,-73"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="15.546,-75.4;44.454,-69.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#lufs
+Linux kernel driver#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="30,-73"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O120">
+ <dia:attribute name="obj_pos">
+ <dia:point val="105,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="104.75,29.75;117.25,34.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="105,30"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="12"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="corner_radius">
+ <dia:real val="4"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O121">
+ <dia:attribute name="obj_pos">
+ <dia:point val="111,33"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="105.951,30.6;116.049,33.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#syslog#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="111,33"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O122">
+ <dia:attribute name="obj_pos">
+ <dia:point val="2,95"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="1.75,94.75;28.25,102.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="2,95"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="26"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="7"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O123">
+ <dia:attribute name="obj_pos">
+ <dia:point val="15,98"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="2.328,95.6;27.672,101.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GLib
+GIOUnixChannel#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="15,98"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O124">
+ <dia:attribute name="obj_pos">
+ <dia:point val="15,110"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="14.75,109.75;45.25,118.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="15,110"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="30"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="corner_radius">
+ <dia:real val="4"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O125">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,114"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="18.1695,111.6;41.8305,117.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#partition device
+[file]#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="30,114"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O126">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,-4"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="5.75,-4.25;26.25,0.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="6,-4"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="20"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O127">
+ <dia:attribute name="obj_pos">
+ <dia:point val="16,-1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="6.496,-3.4;25.504,-0.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ntoskrnl.exe#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="16,-1"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O128">
+ <dia:attribute name="obj_pos">
+ <dia:point val="44,-4"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="43.75,-4.25;60.25,0.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="44,-4"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O129">
+ <dia:attribute name="obj_pos">
+ <dia:point val="52,-1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="44.2285,-3.4;59.7715,-0.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#halcaptive#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="52,-1"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O130">
+ <dia:attribute name="obj_pos">
+ <dia:point val="28,-4"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27.75,-4.25;42.25,0.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="28,-4"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff007f"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O131">
+ <dia:attribute name="obj_pos">
+ <dia:point val="35,-1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="28.466,-3.4;41.534,-0.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ReactOS#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="35,-1"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O132">
+ <dia:attribute name="obj_pos">
+ <dia:point val="98,-8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="82.3003,-12.4;113.7,-1.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Sandboxed
+Slave#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="5.5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="98,-8"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O133">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,40"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27,39.75;33,52.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="30,40"/>
+ <dia:point val="30,52"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="1" to="O107" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O134">
+ <dia:attribute name="obj_pos">
+ <dia:point val="70,74"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="70,71.2;95.9875,74.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#opt. reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3.5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="70,74"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O135">
+ <dia:attribute name="obj_pos">
+ <dia:point val="97,73"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="96.75,71;105.25,75"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="97,73"/>
+ <dia:point val="105,73"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="2"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O136">
+ <dia:attribute name="obj_pos">
+ <dia:point val="70,70"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="70,67.2;95.2945,70.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#N:1 reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3.5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="70,70"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O137">
+ <dia:attribute name="obj_pos">
+ <dia:point val="97,69"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="96.75,67;105.25,71"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="97,69"/>
+ <dia:point val="105,69"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="2"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O138">
+ <dia:attribute name="obj_pos">
+ <dia:point val="70,66"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="70,63.2;88.1335,66.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3.5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="70,66"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O139">
+ <dia:attribute name="obj_pos">
+ <dia:point val="97,65"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="96.75,63;105.25,67"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="97,65"/>
+ <dia:point val="105,65"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="2"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ </dia:group>
+ </dia:layer>
+</dia:diagram>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+ <dia:diagramdata>
+ <dia:attribute name="background">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="paper">
+ <dia:composite type="paper">
+ <dia:attribute name="name">
+ <dia:string>#A4#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="tmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="bmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="lmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="rmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="is_portrait">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="scaling">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ <dia:attribute name="fitto">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="grid">
+ <dia:composite type="grid">
+ <dia:attribute name="width_x">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="width_y">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_x">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_y">
+ <dia:int val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="guides">
+ <dia:composite type="guides">
+ <dia:attribute name="hguides"/>
+ <dia:attribute name="vguides"/>
+ </dia:composite>
+ </dia:attribute>
+ </dia:diagramdata>
+ <dia:layer name="Background" visible="true">
+ <dia:object type="Standard - Box" version="0" id="O0">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,-6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.5,-6.5;118.5,33.5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-2,-6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="120"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="39"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O1">
+ <dia:attribute name="obj_pos">
+ <dia:point val="51,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="50.7172,-0.213244;79.5586,6.28284"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="51,6"/>
+ <dia:point val="79,2"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="2.2"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="2.2"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O32" connection="4"/>
+ <dia:connection handle="1" to="O12" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O2">
+ <dia:attribute name="obj_pos">
+ <dia:point val="51,27"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="50.6528,7.65276;79.3472,27.3472"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="51,27"/>
+ <dia:point val="79,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O38" connection="4"/>
+ <dia:connection handle="1" to="O12" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O3">
+ <dia:attribute name="obj_pos">
+ <dia:point val="51,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="50.6855,7.68549;79.3145,17.3145"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="51,17"/>
+ <dia:point val="79,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O35" connection="4"/>
+ <dia:connection handle="1" to="O12" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O4">
+ <dia:attribute name="obj_pos">
+ <dia:point val="28,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27.6742,9.42393;55.8352,22.3258"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="28,22"/>
+ <dia:point val="55,11"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O30" connection="4"/>
+ <dia:connection handle="1" to="O41" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O5">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.4,5.75;15.6,11.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="14,6"/>
+ <dia:point val="14,11"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O26" connection="6"/>
+ <dia:connection handle="1" to="O28" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O6">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.4,14.75;15.6,20.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="14,15"/>
+ <dia:point val="14,20"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O28" connection="6"/>
+ <dia:connection handle="1" to="O30" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O7">
+ <dia:attribute name="obj_pos">
+ <dia:point val="28,20"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27.6646,5.06085;36.5429,20.3354"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="28,20"/>
+ <dia:point val="35,6"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O30" connection="2"/>
+ <dia:connection handle="1" to="O32" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="28,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27.6513,15.5527;36.1334,22.3487"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="28,22"/>
+ <dia:point val="35,17"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O30" connection="4"/>
+ <dia:connection handle="1" to="O35" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O9">
+ <dia:attribute name="obj_pos">
+ <dia:point val="28,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27.6513,21.6513;36.1334,28.4473"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="28,22"/>
+ <dia:point val="35,27"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O30" connection="4"/>
+ <dia:connection handle="1" to="O38" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O10">
+ <dia:attribute name="obj_pos">
+ <dia:point val="28,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27.75,20.4;55.25,23.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="28,22"/>
+ <dia:point val="55,22"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O30" connection="4"/>
+ <dia:connection handle="1" to="O44" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O11">
+ <dia:attribute name="obj_pos">
+ <dia:point val="59,-1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="34.9925,-5;83.0075,0"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#NT Cache Manager#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="59,-1"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O12">
+ <dia:attribute name="obj_pos">
+ <dia:point val="79,2"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="78.75,1.75;116.25,14.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="79,2"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="37"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="12"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff00ff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="87,5"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="83.3865,2.6;90.6135,5.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#page#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="87,5"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O14">
+ <dia:attribute name="obj_pos">
+ <dia:point val="83,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="83,8.4;116.264,12.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#dirty
+dirty: <LSNoldest .. LSNnewest>#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="83,10"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Line" version="0" id="O15">
+ <dia:attribute name="obj_pos">
+ <dia:point val="80,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="79.6464,6.64645;82.3536,9.35355"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="80,9"/>
+ <dia:point val="82,7"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O16">
+ <dia:attribute name="obj_pos">
+ <dia:point val="80,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="79.75,8.75;82.25,9.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="80,9"/>
+ <dia:point val="82,9"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O17">
+ <dia:attribute name="obj_pos">
+ <dia:point val="80,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="79.6464,8.64645;82.3536,11.3536"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="80,9"/>
+ <dia:point val="82,11"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Line" version="0" id="O18">
+ <dia:attribute name="obj_pos">
+ <dia:point val="73,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="72.6646,7.66459;79.3354,11.3354"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="73,11"/>
+ <dia:point val="79,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O41" connection="4"/>
+ <dia:connection handle="1" to="O12" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O19">
+ <dia:attribute name="obj_pos">
+ <dia:point val="73,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="72.6717,7.67173;79.3283,22.3283"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="73,22"/>
+ <dia:point val="79,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O44" connection="4"/>
+ <dia:connection handle="1" to="O12" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O20">
+ <dia:attribute name="obj_pos">
+ <dia:point val="90,28"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="90,26.4;104.85,28.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#opt. reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="90,28"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O21">
+ <dia:attribute name="obj_pos">
+ <dia:point val="106,27"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="105.75,25.4;111.25,28.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="106,27"/>
+ <dia:point val="111,27"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O22">
+ <dia:attribute name="obj_pos">
+ <dia:point val="90,25"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="90,23.4;104.454,25.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#N:1 reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="90,25"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O23">
+ <dia:attribute name="obj_pos">
+ <dia:point val="106,24"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="105.75,22.4;111.25,25.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="106,24"/>
+ <dia:point val="111,24"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O24">
+ <dia:attribute name="obj_pos">
+ <dia:point val="90,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="90,20.4;100.362,22.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="90,22"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O25">
+ <dia:attribute name="obj_pos">
+ <dia:point val="106,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="105.75,19.4;111.25,22.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="106,21"/>
+ <dia:point val="111,21"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O26">
+ <dia:attribute name="obj_pos">
+ <dia:point val="2,2"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="1.75,1.75;26.25,6.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="2,2"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#007fff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O27">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,5"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="2.5655,2.6;25.4345,5.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#W32 FileObject#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="14,5"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O28">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="5.75,10.75;22.25,15.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="6,11"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#007fff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O29">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,14"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="7.0205,11.6;20.9795,14.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#W32 FCB#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="14,14"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O30">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0,20"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-0.25,19.75;28.25,24.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="0,20"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="28"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O31">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.5855,20.6;27.4145,23.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#SharedCacheMap#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="14,23"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O32">
+ <dia:attribute name="obj_pos">
+ <dia:point val="35,2"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="34.75,1.75;51.25,10.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="35,2"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O33">
+ <dia:attribute name="obj_pos">
+ <dia:point val="43,7"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="37.654,5.4;48.346,9.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#pages:
+start .. end#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="43,7"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O34">
+ <dia:attribute name="obj_pos">
+ <dia:point val="43,5"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="35.971,2.6;50.029,5.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Map BCB#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="43,5"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O35">
+ <dia:attribute name="obj_pos">
+ <dia:point val="35,13"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="34.75,12.75;51.25,21.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="35,13"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O36">
+ <dia:attribute name="obj_pos">
+ <dia:point val="43,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="36.664,13.6;49.336,16.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Pin BCB#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="43,16"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O37">
+ <dia:attribute name="obj_pos">
+ <dia:point val="43,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="38.875,16.4;47.125,20.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#page:
+start + x#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="43,18"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O38">
+ <dia:attribute name="obj_pos">
+ <dia:point val="35,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="34.75,22.75;51.25,31.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="35,23"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O39">
+ <dia:attribute name="obj_pos">
+ <dia:point val="43,26"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="36.664,23.6;49.336,26.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Pin BCB#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="43,26"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O40">
+ <dia:attribute name="obj_pos">
+ <dia:point val="43,28"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="38.875,26.4;47.125,30.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#page:
+start + y#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="43,28"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O41">
+ <dia:attribute name="obj_pos">
+ <dia:point val="55,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="54.75,5.75;73.25,16.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="55,6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="10"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O42">
+ <dia:attribute name="obj_pos">
+ <dia:point val="64,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="57.664,6.6;70.336,9.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Pin BCB#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="64,9"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O43">
+ <dia:attribute name="obj_pos">
+ <dia:point val="64,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="55.816,9.4;72.184,15.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ThreadId owned
+page:
+start + x#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="64,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O44">
+ <dia:attribute name="obj_pos">
+ <dia:point val="55,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="54.75,16.75;73.25,27.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="55,17"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="10"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O45">
+ <dia:attribute name="obj_pos">
+ <dia:point val="64,20"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="57.664,17.6;70.336,20.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Pin BCB#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="64,20"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O46">
+ <dia:attribute name="obj_pos">
+ <dia:point val="64,22"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="55.816,20.4;72.184,26.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ThreadId owned
+page:
+start + x#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="64,22"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Text" version="0" id="O47">
+ <dia:attribute name="obj_pos">
+ <dia:point val="83,8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="83,6.4;88.214,8.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#clean#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="83,8"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:layer>
+</dia:diagram>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+ <dia:diagramdata>
+ <dia:attribute name="background">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="paper">
+ <dia:composite type="paper">
+ <dia:attribute name="name">
+ <dia:string>#A4#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="tmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="bmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="lmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="rmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="is_portrait">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="scaling">
+ <dia:real val="0.3"/>
+ </dia:attribute>
+ <dia:attribute name="fitto">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="grid">
+ <dia:composite type="grid">
+ <dia:attribute name="width_x">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="width_y">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_x">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_y">
+ <dia:int val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="guides">
+ <dia:composite type="guides">
+ <dia:attribute name="hguides"/>
+ <dia:attribute name="vguides"/>
+ </dia:composite>
+ </dia:attribute>
+ </dia:diagramdata>
+ <dia:layer name="Background" visible="true">
+ <dia:object type="Standard - Box" version="0" id="O0">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-39,-9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-39.5,-9.5;77.5,87.5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-39,-9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="116"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="96"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O1">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-3,14"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-3.25,13.75;75.25,20.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-3,14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="78"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O2">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-37,0"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-37.25,-0.25;75.25,11.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-37,0"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="112"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="11"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O3">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-10,3"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-10.25,1.4;41.25,4.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-10,3"/>
+ <dia:point val="41,3"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="2"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O59" connection="4"/>
+ <dia:connection handle="1" to="O61" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O4">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-10,3"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-10.343,2.657;-5.49939,9.03757"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-10,3"/>
+ <dia:point val="-7,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O59" connection="4"/>
+ <dia:connection handle="1" to="O25" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O5">
+ <dia:attribute name="obj_pos">
+ <dia:point val="19,8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="18.75,6.4;22.25,9.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="19,8"/>
+ <dia:point val="22,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O25" connection="4"/>
+ <dia:connection handle="1" to="O57" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O6">
+ <dia:attribute name="obj_pos">
+ <dia:point val="57,3"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="56.75,1.4;60.25,4.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="57,3"/>
+ <dia:point val="60,3"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="2"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O61" connection="4"/>
+ <dia:connection handle="1" to="O19" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O7">
+ <dia:attribute name="obj_pos">
+ <dia:point val="49,5"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="47.4,4.75;50.6,15.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="49,5"/>
+ <dia:point val="49,15"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O61" connection="6"/>
+ <dia:connection handle="1" to="O23" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="52,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="51.75,15.4;60.25,18.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="52,17"/>
+ <dia:point val="60,17"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O23" connection="4"/>
+ <dia:connection handle="1" to="O21" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O9">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="13.75,15.4;46.25,18.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="14,17"/>
+ <dia:point val="46,17"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O27" connection="4"/>
+ <dia:connection handle="1" to="O23" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O10">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="4.4,9.75;7.6,15.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="6,10"/>
+ <dia:point val="6,15"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O25" connection="6"/>
+ <dia:connection handle="1" to="O27" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O11">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,31"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-24.6,30.75;-21.4,41.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-23,31"/>
+ <dia:point val="-23,41"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O63" connection="6"/>
+ <dia:connection handle="1" to="O66" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O12">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,31"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="4.4,30.75;7.6,41.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="6,31"/>
+ <dia:point val="6,41"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O30" connection="6"/>
+ <dia:connection handle="1" to="O34" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-38,36"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-38.5,35.5;75.5,36.5"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-38,36"/>
+ <dia:point val="75,36"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O14">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20,-3"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-16.531,-7.8;56.531,-1.8"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Sandboxing/Inheritance#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20,-3"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O15">
+ <dia:attribute name="obj_pos">
+ <dia:point val="48,33"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="27.705,29;68.295,34"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Sandbox parent#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="48,33"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O16">
+ <dia:attribute name="obj_pos">
+ <dia:point val="48,43"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="25.9725,39;70.0275,44"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Sandboxed slave#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="5"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="48,43"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O17">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-5,-2"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-5,-3.18938;-5,-1.58938"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-5,-2"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O18">
+ <dia:attribute name="obj_pos">
+ <dia:point val="68,8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="68,6.81062;68,8.41062"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="68,8"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O19">
+ <dia:attribute name="obj_pos">
+ <dia:point val="60,1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="59.75,0.75;74.25,5.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="60,1"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O20">
+ <dia:attribute name="obj_pos">
+ <dia:point val="67,4"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="60.862,1.6;73.138,4.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GObject#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="67,4"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O21">
+ <dia:attribute name="obj_pos">
+ <dia:point val="60,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="59.75,14.75;74.25,19.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="60,15"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O22">
+ <dia:attribute name="obj_pos">
+ <dia:point val="67,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="60.862,15.6;73.138,18.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GObject#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="67,18"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O23">
+ <dia:attribute name="obj_pos">
+ <dia:point val="46,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="45.75,14.75;52.25,19.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="46,15"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O24">
+ <dia:attribute name="obj_pos">
+ <dia:point val="49,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="46.5745,15.6;51.4255,18.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Vfs#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="49,18"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O25">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-7,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-7.25,5.75;19.25,10.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-7,6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="26"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O26">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-7.0185,6.6;19.0185,9.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ParentConnector#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="6,9"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O27">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.25,14.75;14.25,19.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-2,15"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O28">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-1.524,15.6;13.524,18.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#VfsParent#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="6,18"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Line" version="0" id="O29">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,5"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-24.6,4.75;-21.4,23.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-23,5"/>
+ <dia:point val="-23,23"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O59" connection="6"/>
+ <dia:connection handle="1" to="O63" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O30">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-1,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-1.25,22.75;13.25,31.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-1,23"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O31">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-0.336,27.6;12.336,30.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Vfs stub#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="6,30"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O32">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,27"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.159,24.6;11.841,27.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#CORBA#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="6,27"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Line" version="0" id="O33">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="4.4,18.75;7.6,23.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="6,19"/>
+ <dia:point val="6,23"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O27" connection="6"/>
+ <dia:connection handle="1" to="O30" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O34">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-3,41"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-3.25,40.75;15.25,49.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-3,41"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O35">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,48"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.7615,45.6;14.7615,48.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Vfs servant#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="6,48"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O36">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,45"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.159,42.6;11.841,45.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#CORBA#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="6,45"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Line" version="0" id="O37">
+ <dia:attribute name="obj_pos">
+ <dia:point val="19,62"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.4,56.75;20.6,62.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="19,62"/>
+ <dia:point val="19,57"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O71" connection="1"/>
+ <dia:connection handle="1" to="O50" connection="6"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O38">
+ <dia:attribute name="obj_pos">
+ <dia:point val="54,66"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="54,64.8106;54,66.4106"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Courier"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="54,66"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O39">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,49"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-24.6,48.75;-21.4,62.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-23,49"/>
+ <dia:point val="-23,62"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O66" connection="6"/>
+ <dia:connection handle="1" to="O69" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Box" version="0" id="O40">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-36,61"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-36.25,60.75;45.25,67.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-36,61"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="81"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O41">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-32,64"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-32.25,62.4;21.25,65.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-32,64"/>
+ <dia:point val="21,64"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="2"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O42">
+ <dia:attribute name="obj_pos">
+ <dia:point val="27,64"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="26.75,62.4;30.25,65.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="27,64"/>
+ <dia:point val="30,64"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="2"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O71" connection="4"/>
+ <dia:connection handle="1" to="O43" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O43">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,62"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,61.75;44.25,66.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="30,62"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O44">
+ <dia:attribute name="obj_pos">
+ <dia:point val="37,65"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="30.862,62.6;43.138,65.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GObject#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="37,65"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Box" version="0" id="O45">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,52"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.25,51.75;45.25,58.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-2,52"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="47"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O46">
+ <dia:attribute name="obj_pos">
+ <dia:point val="22,55"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="21.75,53.4;30.25,56.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="22,55"/>
+ <dia:point val="30,55"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O50" connection="4"/>
+ <dia:connection handle="1" to="O48" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O47">
+ <dia:attribute name="obj_pos">
+ <dia:point val="13,55"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.75,53.4;16.25,56.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="13,55"/>
+ <dia:point val="16,55"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O52" connection="4"/>
+ <dia:connection handle="1" to="O50" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O48">
+ <dia:attribute name="obj_pos">
+ <dia:point val="30,53"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="29.75,52.75;44.25,57.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="30,53"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O49">
+ <dia:attribute name="obj_pos">
+ <dia:point val="37,56"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="30.862,53.6;43.138,56.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GObject#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="37,56"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O50">
+ <dia:attribute name="obj_pos">
+ <dia:point val="16,53"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="15.75,52.75;22.25,57.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="16,53"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O51">
+ <dia:attribute name="obj_pos">
+ <dia:point val="19,56"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="16.5745,53.6;21.4255,56.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Vfs#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="19,56"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O52">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-1,53"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-1.25,52.75;13.25,57.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-1,53"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="14"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O53">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,56"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-0.732,53.6;12.732,56.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#VfsSlave#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="6,56"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:object type="Standard - Line" version="0" id="O54">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,49"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="4.4,48.75;7.6,53.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="6,49"/>
+ <dia:point val="6,53"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O34" connection="6"/>
+ <dia:connection handle="1" to="O52" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O55">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,75"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-24.6,74.75;-21.4,79.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-23,75"/>
+ <dia:point val="-23,79"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O81" connection="6"/>
+ <dia:connection handle="1" to="O83" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O56">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,66"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-24.6,65.75;-21.4,71.25"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="-23,66"/>
+ <dia:point val="-23,71"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O69" connection="6"/>
+ <dia:connection handle="1" to="O81" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O57">
+ <dia:attribute name="obj_pos">
+ <dia:point val="22,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="21.75,5.75;46.25,10.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="22,6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O58">
+ <dia:attribute name="obj_pos">
+ <dia:point val="34,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="22.318,6.6;45.682,9.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GTypeInterface#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="34,9"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O59">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-36,1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-36.25,0.75;-9.75,5.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-36,1"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="26"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O60">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,4"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-35.078,1.6;-10.922,4.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#DirectoryParent#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-23,4"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O61">
+ <dia:attribute name="obj_pos">
+ <dia:point val="41,1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="40.75,0.75;57.25,5.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="41,1"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O62">
+ <dia:attribute name="obj_pos">
+ <dia:point val="49,4"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="42.0205,1.6;55.9795,4.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Directory#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="49,4"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O63">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-35,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-35.25,22.75;-10.75,31.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-35,23"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O64">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,30"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-33.89,27.6;-12.11,30.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Directory stub#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-23,30"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O65">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,27"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-28.841,24.6;-17.159,27.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#CORBA#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-23,27"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O66">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-37,41"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-37.25,40.75;-8.75,49.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-37,41"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="28"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O67">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,48"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-36.3155,45.6;-9.6845,48.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Directory servant#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-23,48"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O68">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,45"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-28.841,42.6;-17.159,45.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#CORBA#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-23,45"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O69">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-35,62"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-35.25,61.75;-10.75,66.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-35,62"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O70">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,65"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-34.286,62.6;-11.714,65.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#DirectorySlave#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-23,65"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O71">
+ <dia:attribute name="obj_pos">
+ <dia:point val="11,62"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.75,61.75;27.25,66.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="11,62"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O72">
+ <dia:attribute name="obj_pos">
+ <dia:point val="19,65"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.0205,62.6;25.9795,65.6"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Directory#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="19,65"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O73">
+ <dia:attribute name="obj_pos">
+ <dia:point val="49,79"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="49,77.4;63.85,79.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#opt. reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="49,79"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O74">
+ <dia:attribute name="obj_pos">
+ <dia:point val="65,78"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="64.75,76.4;70.25,79.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="65,78"/>
+ <dia:point val="70,78"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="9"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O75">
+ <dia:attribute name="obj_pos">
+ <dia:point val="49,76"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="49,74.4;63.454,76.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#N:1 reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="49,76"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O76">
+ <dia:attribute name="obj_pos">
+ <dia:point val="65,75"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="64.75,73.4;70.25,76.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="65,75"/>
+ <dia:point val="70,75"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="20"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O77">
+ <dia:attribute name="obj_pos">
+ <dia:point val="49,73"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="49,71.4;59.362,73.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#reference:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="49,73"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O78">
+ <dia:attribute name="obj_pos">
+ <dia:point val="65,72"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="64.75,70.4;70.25,73.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="65,72"/>
+ <dia:point val="70,72"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Text" version="0" id="O79">
+ <dia:attribute name="obj_pos">
+ <dia:point val="49,70"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="49,68.4;61.144,70.4"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#inheritance:#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-BoldOblique"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="2"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="49,70"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O80">
+ <dia:attribute name="obj_pos">
+ <dia:point val="65,69"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="64.75,67.4;70.25,70.6"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="65,69"/>
+ <dia:point val="70,69"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_color">
+ <dia:color val="#0000ff"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="1.6"/>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O81">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-35,71"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-35.25,70.75;-10.75,75.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-35,71"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="24"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#007fff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O82">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,74"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-34.4345,71.55;-11.5155,74.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#W32 FileObject#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-23,74"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ <dia:group>
+ <dia:object type="Standard - Box" version="0" id="O83">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-31,79"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-31.25,78.75;-14.75,83.25"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-31,79"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="16"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#007fff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O84">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-23,82"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-29.9795,79.55;-15.9705,82.7"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#W32 FCB#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="3"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-23,82"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:group>
+ </dia:layer>
+</dia:diagram>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+ <dia:diagramdata>
+ <dia:attribute name="background">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="paper">
+ <dia:composite type="paper">
+ <dia:attribute name="name">
+ <dia:string>#A4#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="tmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="bmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="lmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="rmargin">
+ <dia:real val="2.8222"/>
+ </dia:attribute>
+ <dia:attribute name="is_portrait">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="scaling">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="fitto">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="grid">
+ <dia:composite type="grid">
+ <dia:attribute name="width_x">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="width_y">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_x">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_y">
+ <dia:int val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="guides">
+ <dia:composite type="guides">
+ <dia:attribute name="hguides"/>
+ <dia:attribute name="vguides"/>
+ </dia:composite>
+ </dia:attribute>
+ </dia:diagramdata>
+ <dia:layer name="Background" visible="true">
+ <dia:object type="Standard - Box" version="0" id="O0">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-4,1"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-4,1;24,26"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="-4,1"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="28"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="25"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O1">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0.736,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.686,5.95;7.3508,7.95"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="0.736,6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="6.5648"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="1.9"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#disconnected#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="4.0184,7.19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O2">
+ <dia:attribute name="obj_pos">
+ <dia:point val="10.868,6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.818,5.95;14.79,7.95"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="10.868,6"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="3.872"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="1.9"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#broken#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12.804,7.19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O3">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0.868,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.768,11.9;4.808,14.9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="0.868,12"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="3.84"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2.8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#closed
+clean#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="2.788,13.24"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O4">
+ <dia:attribute name="obj_pos">
+ <dia:point val="10.8548,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.7548,11.9;14.9004,14.9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="10.8548,12"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="3.9456"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2.8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#closed
+dirty #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12.8276,13.24"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O5">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0.9076,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.8076,17.9;5.1644,20.9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="0.9076,18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="4.1568"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2.8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#00ff00"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#opened
+clean#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="2.986,19.24"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O6">
+ <dia:attribute name="obj_pos">
+ <dia:point val="10.9076,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.8076,17.9;15.1644,20.9"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="10.9076,18"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="4.1568"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="2.8"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.2"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#ff0000"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#opened
+dirty#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12.986,19.24"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O7">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-0.05,8.95;23.05,9.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="0,9"/>
+ <dia:point val="23,9"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20,8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="18.0217,7.12;21.9784,8.22"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#no VFS#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.1"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20,8"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O9">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.0053,10.12;22.9948,11.22"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#VFS exists#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.1"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O10">
+ <dia:attribute name="obj_pos">
+ <dia:point val="10.8548,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="6.66355,7.33822;10.9253,12.0705"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="10.8548,12"/>
+ <dia:point val="7.3008,7.9"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O4" connection="0"/>
+ <dia:connection handle="1" to="O1" connection="15"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O11">
+ <dia:attribute name="obj_pos">
+ <dia:point val="8,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="6.8252,10.3647;9.1748,11.1647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string># cease#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="8,11"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O12">
+ <dia:attribute name="obj_pos">
+ <dia:point val="4,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="3.2,7.95;4.8,12.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="4,12"/>
+ <dia:point val="4,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="3,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="1.878,9.36471;4.122,10.9647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#cease
+abort #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="3,10"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O14">
+ <dia:attribute name="obj_pos">
+ <dia:point val="13,12"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="12.2,7.95;13.8,12.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="13,12"/>
+ <dia:point val="13,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O15">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.878,9.36471;13.122,10.1647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#abort #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12,10"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O16">
+ <dia:attribute name="obj_pos">
+ <dia:point val="5,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="4.2,7.95;5.8,18.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="5,18"/>
+ <dia:point val="5,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O17">
+ <dia:attribute name="obj_pos">
+ <dia:point val="7,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="5.5612,16.3647;8.4388,17.1647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#abort #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="7,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O18">
+ <dia:attribute name="obj_pos">
+ <dia:point val="14.0252,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="13.1999,7.94798;14.8001,18.0501"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="14.0252,18"/>
+ <dia:point val="14,8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O6" connection="3"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O19">
+ <dia:attribute name="obj_pos">
+ <dia:point val="16,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="14.6668,16.3647;17.3332,17.1647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#abort #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="16,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O20">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0.9076,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.0674425,14.7401;1.66856,18.0506"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="0.9076,18"/>
+ <dia:point val="0.868,14.8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O5" connection="0"/>
+ <dia:connection handle="1" to="O3" connection="11"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O21">
+ <dia:attribute name="obj_pos">
+ <dia:point val="3,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="1.4556,16.3647;4.5444,17.1647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#detach #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="3,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O22">
+ <dia:attribute name="obj_pos">
+ <dia:point val="10.9076,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.0541,14.7368;11.6555,18.0508"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="10.9076,18"/>
+ <dia:point val="10.8548,14.8"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O6" connection="0"/>
+ <dia:connection handle="1" to="O4" connection="11"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O23">
+ <dia:attribute name="obj_pos">
+ <dia:point val="9,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="7.7988,15.3647;10.2012,16.1647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#detach#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="9,16"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O24">
+ <dia:attribute name="obj_pos">
+ <dia:point val="5.0644,19.4"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="5.0144,18.6;10.9576,20.2"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="5.0644,19.4"/>
+ <dia:point val="10.9076,19.4"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O5" connection="8"/>
+ <dia:connection handle="1" to="O6" connection="7"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O25">
+ <dia:attribute name="obj_pos">
+ <dia:point val="8,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="6.3764,18.3647;9.6236,19.1647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#write op.#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="8,19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Arc" version="0" id="O26">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0.736,7.9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-0.24883,7.84842;1.66919,12.0757"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="0.736,7.9"/>
+ <dia:point val="0.868,12"/>
+ </dia:attribute>
+ <dia:attribute name="curve_distance">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O1" connection="11"/>
+ <dia:connection handle="1" to="O3" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O27">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,10"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-3.6236,9.36471;-0.3764,10.9647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#read op.
+write op.#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-2,10"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Arc" version="0" id="O28">
+ <dia:attribute name="obj_pos">
+ <dia:point val="0.868,14.8"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="0.073501,14.7494;1.70816,18.0599"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="0.868,14.8"/>
+ <dia:point val="0.9076,18"/>
+ </dia:attribute>
+ <dia:attribute name="curve_distance">
+ <dia:real val="0.7642"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O3" connection="11"/>
+ <dia:connection handle="1" to="O5" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O29">
+ <dia:attribute name="obj_pos">
+ <dia:point val="-2,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-3.6236,16.3647;-0.3764,17.9647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#read op.
+write op.#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="-2,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O30">
+ <dia:attribute name="obj_pos">
+ <dia:point val="1,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="1,22.3147;17.418,24.8647"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#shutdown: <detach> [unmount OK] <cease>
+shutdown: <detach> [crash] <abort>
+unsolicited: [crash] <abort> #</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Bookman-Demi"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.8"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="1,23"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O31">
+ <dia:attribute name="obj_pos">
+ <dia:point val="10,3"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="-2.7908,1.48;22.7908,5.28"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#ParentConnector interface
+state machine#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.9"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="10,3"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O32">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20,14"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="16.7148,13.12;23.2852,14.22"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#no HANDLE#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.1"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20,14"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="0" id="O33">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="17.6042,18.12;22.3958,20.32"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#HANDLE
+exists#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font name="Helvetica-Bold"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.1"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="20,19"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ </dia:layer>
+</dia:diagram>
-#! /usr/bin/perl
-#
# $Id$
-# Main page of 'My::Project::cvsutil'
+# automake source for the Makefile of project/captive/ documentation .fig-s
# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
#
# This program is free software; you can redistribute it and/or modify
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
-use strict;
-use warnings;
-
-use My::Web;
-use project::cvsutil::ListItem;
-
+include $(top_srcdir)/Makefile-head.am
-My::Web->init_project(
- "ListItem"=>\%My::Project::cvsutil::ListItem,
- );
+EXTRA_DIST+= \
+ functype_native_fromunix.fig \
+ functype_patched_native_fromw32.fig \
+ functype_patched_pass_fromunix.fig \
+ functype_patched_pass_fromw32.fig \
+ functype_patched_wrap_fromunix.fig \
+ functype_patched_wrap_fromw32.fig \
+ functype_unpatched_native_fromw32.fig \
+ calltype_cdecl.fig \
+ calltype_stdcall.fig \
+ calltype_fastcall.fig
-My::Web->footer();
+CLEANFILES+= \
+ *.png \
+ *.gif
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 2
+ 3750 1050 3750 3750
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1800 3450 1800 3450 2100 2250 2100 2250 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2032 2250 2032
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 1732 2250 1732
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2325 2250 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2100 3450 2100 3450 2400 2250 2400 2250 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1275 3450 1275 3450 1800 2250 1800 2250 1275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2400 3450 2400 3450 2700 2250 2700 2250 2400
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2700 3450 2700 3450 3000 2250 3000 2250 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2625 2250 2625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2925 2250 2925
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 1800 6600 1800 6600 2100 5400 2100 5400 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2032 5400 2032
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 1732 5400 1732
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2325 5400 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 2100 6600 2100 6600 2400 5400 2400 5400 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 1275 6600 1275 6600 1800 5400 1800 5400 1275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 2400 6600 2400 6600 2700 5400 2700 5400 2400
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 2700 6600 2700 6600 3000 5400 3000 5400 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2625 5400 2625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2925 5400 2925
+4 0 0 50 0 16 13 0.0000 4 210 2745 2550 750 W32 cdecl calling convention\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2011 argument 3\001
+4 0 0 50 0 0 12 0.0000 4 135 960 2415 1696 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 2775 1485 ...\001
+4 0 0 50 0 0 12 0.0000 4 180 915 923 2977 [ESP+0x00]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 922 2377 [ESP+0x08]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 922 1778 [ESP+0x10]\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2910 argument 0\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2610 argument 1\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2310 argument 2\001
+4 0 0 50 0 0 12 0.0000 4 180 840 5579 2011 argument 3\001
+4 0 0 50 0 0 12 0.0000 4 135 960 5565 1696 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 5925 1485 ...\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4073 2977 [ESP+0x00]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4073 2677 [ESP+0x04]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4072 2377 [ESP+0x08]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4072 1778 [ESP+0x10]\001
+4 0 0 50 0 0 12 0.0000 4 180 840 5579 2910 argument 0\001
+4 0 0 50 0 0 12 0.0000 4 180 840 5579 2610 argument 1\001
+4 0 0 50 0 0 12 0.0000 4 180 840 5579 2310 argument 2\001
+4 0 0 50 0 0 12 0.0000 4 180 945 923 2078 [ESP+0x0C]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 923 2677 [ESP+0x04]\001
+4 0 0 50 0 0 12 0.0000 4 180 945 4073 2078 [ESP+0x0C]\001
+4 0 0 50 0 0 12 0.0000 4 135 795 1950 3750 before call\001
+4 0 0 50 0 0 12 0.0000 4 135 675 4950 3750 after call\001
+4 0 0 50 0 0 12 0.0000 4 135 1830 4050 3375 EDX:EAX=return value\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1800 3450 1800 3450 2100 2250 2100 2250 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2032 2250 2032
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 1732 2250 1732
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2325 2250 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2100 3450 2100 3450 2400 2250 2400 2250 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1275 3450 1275 3450 1800 2250 1800 2250 1275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 4725 2325 5100 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5100 1275 6300 1275 6300 2400 5100 2400 5100 1275
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 2
+ 3750 1050 3750 3450
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2011 argument 3\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2310 argument 2\001
+4 0 0 50 0 0 12 0.0000 4 135 960 2415 1696 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 2775 1485 ...\001
+4 0 0 50 0 0 12 0.0000 4 135 960 5258 1982 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 135 1830 4050 2850 EDX:EAX=return value\001
+4 0 0 50 0 0 12 0.0000 4 180 1320 1200 3000 ECX=argument 0\001
+4 0 0 50 0 0 12 0.0000 4 180 1335 1200 2700 EDX=argument 1\001
+4 0 0 50 0 0 12 0.0000 4 180 645 1215 2377 [ESP+0]\001
+4 0 0 50 0 0 12 0.0000 4 180 645 1215 2078 [ESP+4]\001
+4 0 0 50 0 0 12 0.0000 4 180 645 1215 1778 [ESP+8]\001
+4 0 0 50 0 0 12 0.0000 4 180 645 4058 2385 [ESP+0]\001
+4 0 0 50 0 0 12 0.0000 4 15 135 5641 1755 ...\001
+4 0 0 50 0 0 12 0.0000 4 135 795 1950 3450 before call\001
+4 0 0 50 0 0 12 0.0000 4 135 675 4800 3450 after call\001
+4 0 0 50 0 16 13 0.0000 4 210 2910 2550 750 W32 fastcall calling convention\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1800 3450 1800 3450 2100 2250 2100 2250 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2032 2250 2032
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 1732 2250 1732
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2325 2250 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2100 3450 2100 3450 2400 2250 2400 2250 2100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 1275 3450 1275 3450 1800 2250 1800 2250 1275
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 2
+ 3750 1050 3750 3450
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2400 3450 2400 3450 2700 2250 2700 2250 2400
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2250 2700 3450 2700 3450 3000 2250 3000 2250 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2625 2250 2625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1875 2925 2250 2925
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5025 2325 5400 2325
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5400 1275 6600 1275 6600 2400 5400 2400 5400 1275
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2011 argument 3\001
+4 0 0 50 0 0 12 0.0000 4 135 960 2415 1696 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 2775 1485 ...\001
+4 0 0 50 0 0 12 0.0000 4 135 1830 4050 2850 EDX:EAX=return value\001
+4 0 0 50 0 0 12 0.0000 4 135 795 1950 3450 before call\001
+4 0 0 50 0 16 13 0.0000 4 210 2850 2550 750 W32 stdcall calling convention\001
+4 0 0 50 0 0 12 0.0000 4 180 915 923 2977 [ESP+0x00]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 923 2677 [ESP+0x04]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 922 2377 [ESP+0x08]\001
+4 0 0 50 0 0 12 0.0000 4 180 945 893 2078 [ESP+0x0C]\001
+4 0 0 50 0 0 12 0.0000 4 180 915 922 1778 [ESP+0x10]\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2910 argument 0\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2610 argument 1\001
+4 0 0 50 0 0 12 0.0000 4 180 840 2429 2310 argument 2\001
+4 0 0 50 0 0 12 0.0000 4 180 915 4058 2385 [ESP+0x00]\001
+4 0 0 50 0 0 12 0.0000 4 135 960 5558 1982 rest of stack\001
+4 0 0 50 0 0 12 0.0000 4 15 135 5941 1755 ...\001
+4 0 0 50 0 0 12 0.0000 4 135 675 4950 3450 after call\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 3150 5535 3870 6255
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 5535 3870 5535 3870 6075 3150 6075 3150 5535
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 6075 3870 6075 3870 6255 3150 6255 3150 6075
+4 0 0 50 0 0 12 0.0000 4 135 585 3237 5887 callee...\001
+4 0 0 50 0 0 9 0.0000 4 75 150 3439 6203 ret\001
+-6
+6 4275 5490 4950 5850
+4 0 0 50 0 0 12 0.0000 4 180 600 4309 5631 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 4382 5817 cdecl\001
+-6
+6 3060 3375 4005 3780
+6 3060 3555 4005 3780
+4 0 0 50 0 0 12 0.0000 4 180 900 3083 3698 calling code\001
+-6
+4 0 0 50 0 0 12 0.0000 4 135 465 3270 3510 UNIX\001
+-6
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3510 4140 3510 4410
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+ 2 1 1.00 120.00 90.00
+ 3510 5085 3510 4815
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 4410 3870 4410 3870 4815 3150 4815 3150 4410
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 3510 6255 3510 6435 4185 6435 4185 4680 3870 4680
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 6
+ 0 0 1.00 60.00 120.00
+ 3870 4545 4320 4545 4320 5400 2835 5400 2835 5805 3150 5805
+4 0 0 50 0 0 12 0.0000 4 135 555 3242 4674 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 570 3240 4095 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3330 5265 END\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 2625 2550 3225 3150
+4 0 0 50 0 1 10 0.0000 4 105 405 2720 2841 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 2674 2720 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 2657 2969 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 2645 3096 /fastcall\001
+-6
+6 4725 1350 5550 1950
+4 0 0 50 0 1 12 0.0000 4 135 720 4778 1718 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4901 1531 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 4864 1893 handler\001
+-6
+6 1650 1500 2475 1950
+4 0 0 50 0 0 12 0.0000 4 135 465 1831 1674 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 180 735 1719 1849 jumptable\001
+-6
+6 2925 1500 4425 1950
+4 0 0 50 0 1 12 0.0000 4 180 1470 2939 1665 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 3225 1852 binary code\001
+-6
+6 600 1500 1125 1875
+4 0 0 50 0 0 12 0.0000 4 135 465 615 1665 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 360 668 1846 code\001
+-6
+6 4815 3240 5445 3420
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 3240 5445 3240 5445 3420 4815 3420 4815 3240
+4 0 0 50 0 0 9 0.0000 4 90 405 4950 3375 redirect\001
+-6
+6 953 3343 1628 3718
+4 0 0 50 0 0 12 0.0000 4 180 600 1017 3514 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 1090 3700 cdecl\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 2070 3375 2070 3555 2430 3555 2430 2520 3195 2520
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3195 2385 2565 2385 2565 3330 3240 3330
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 7
+ 0 0 1.00 60.00 120.00
+ 5130 3420 5130 3555 5670 3555 5670 2025 1440 2025 1440 2475
+ 1845 2475
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 855 3150 855 3330 1665 3330 1665 2880 1845 2880
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1845 2700 1215 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2790 2295 2790 2295 2970 1845 2970 1845 2790
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3240 2295 3240 2295 3375 1845 3375 1845 3240
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2970 2295 2970 2295 3240 1845 3240 1845 2970
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2340 2295 2340 2295 2610 1845 2610 1845 2340
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2610 2295 2610 2295 2790 1845 2790 1845 2610
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 4275 4185 4275 4185 4635 3195 4635 3195 4275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 2655 4185 2655 4185 2250 3195 2250 3195 2655
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3690 2655 3690 2835
+2 1 0 4 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3150 2115 3465 2250
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3195 4185 3195 4185 3465 3195 3465 3195 3195
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3465 4185 3465 4185 4275 3195 4275 3195 3465
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 4140 3330 4815 3330
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2430 1215 2430 1215 2970 495 2970 495 2430
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2970 1215 2970 1215 3150 495 3150 495 2970
+4 0 0 50 0 0 12 0.0000 4 105 210 3594 4507 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 150 1993 3345 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 1931 2457 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 2558 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 1957 3093 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 3193 trace\001
+4 0 0 50 0 0 12 0.0000 4 135 555 3430 2510 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 570 2564 2212 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3517 2981 END\001
+4 0 0 50 0 0 9 0.0000 4 75 270 3540 3382 break\001
+4 0 0 50 0 0 12 0.0000 4 135 540 3427 3885 unused\001
+4 0 0 50 0 0 12 0.0000 4 135 585 3413 4102 callee...\001
+4 0 0 50 0 0 12 0.0000 4 135 360 3484 3720 W32\001
+4 0 0 50 0 0 12 0.0000 4 135 585 582 2782 callee...\001
+4 0 0 50 0 0 9 0.0000 4 75 150 784 3098 ret\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 4594 4305 4849 4495
+4 0 0 50 0 0 9 0.0000 4 75 255 4594 4495 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 4615 4395 exit\001
+-6
+6 4589 3696 4859 3872
+4 0 0 50 0 0 9 0.0000 4 105 270 4589 3771 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4594 3872 trace\001
+-6
+6 4990 3300 5740 4050
+4 0 0 50 0 1 12 0.0000 4 180 600 5049 3949 /fastcall\001
+4 0 0 50 0 1 12 0.0000 4 135 600 5066 3782 /stdcall/\001
+4 0 0 50 0 1 12 0.0000 4 135 435 5114 3634 cdecl/\001
+4 0 0 50 0 0 12 0.0000 4 180 600 5068 3463 calltype\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 4950 4005 5985 4005
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 6165 5400 6165 5580 5310 5580 5310 4275 4950 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 57.15 114.30
+ 6255 4005 6975 4005 6975 3690 7290 3690
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 57.15 114.30
+ 7605 3960 7605 4140 6615 4140
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 6615 4275 7290 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 7605 4590 7605 4770 6975 4770 6975 4455 6255 4455
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3870 4545 4185 4545 4185 3870 4500 3870
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4500 6660 4500 6660 5040 5670 5040 5670 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 5040 6660 5040 6660 5400 5670 5400 5670 5040
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4230 5940 4230 5940 4500 5670 4500 5670 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 4230 6300 4230 6300 4500 5940 4500 5940 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 4230 6660 4230 6660 4500 6300 4500 6300 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 3960 6300 3960 6300 4230 5940 4230 5940 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 3960 6660 3960 6660 4230 6300 4230 6300 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3600 7922 3600 7922 3780 7290 3780 7290 3600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3780 7920 3780 7920 3960 7290 3960 7290 3780
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4230 7920 4230 7920 4410 7290 4410 7290 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4410 7920 4410 7920 4590 7290 4590 7290 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 3960 5940 3960 5940 4230 5670 4230 5670 3960
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3510 4140 3510 4410
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+ 2 1 1.00 120.00 90.00
+ 3510 5085 3510 4815
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 4410 3870 4410 3870 4815 3150 4815 3150 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4275 4950 4275 4950 4545 4500 4545 4500 4275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4545 4950 4545 4950 4680 4500 4680 4500 4545
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 4725 4680 4725 4950 4185 4950 4185 4680 3870 4680
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3645 4950 3645 4950 3915 4500 3915 4500 3645
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3915 4950 3915 4950 4095 4500 4095 4500 3915
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4095 4950 4095 4950 4275 4500 4275 4500 4095
+4 0 0 50 0 0 12 0.0000 4 180 900 3083 3338 calling code\001
+4 0 0 50 0 1 12 0.0000 4 180 1470 5414 3150 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 5700 3337 binary code\001
+4 0 0 50 0 0 12 0.0000 4 135 465 3270 3150 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 105 210 6069 5272 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4140 #1\001
+4 0 0 50 0 0 9 0.0000 4 75 270 5970 4140 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 6360 4140 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 270 6331 4410 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 5996 4410 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4410 #2\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7369 3921 #2=break\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7366 4373 #1=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7371 3744 #1=instr\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7362 4545 #2=instr\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4486 3159 UNIX\001
+4 0 0 50 0 1 12 0.0000 4 135 720 7253 3248 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 7376 3061 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 7339 3423 handler\001
+4 0 0 50 0 0 12 0.0000 4 135 555 3242 4674 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 585 5919 4837 callee...\001
+4 0 0 50 0 0 12 0.0000 4 135 570 3240 4095 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3330 5265 END\001
+4 0 0 50 0 0 9 0.0000 4 75 150 4657 4662 ret\001
+4 0 0 50 0 0 12 0.0000 4 180 600 3904 3606 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 3977 3792 cdecl\001
+4 0 0 50 0 0 12 0.0000 4 180 735 4374 3334 jumptable\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 7275 3675 7950 4125
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3735 7922 3735 7922 3915 7290 3915 7290 3735
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3915 7920 3915 7920 4095 7290 4095 7290 3915
+4 0 0 50 0 0 9 0.0000 4 75 465 7369 4056 #2=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7371 3879 #1=instr\001
+-6
+6 5100 3375 5700 3975
+4 0 0 50 0 1 10 0.0000 4 105 405 5195 3606 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 5149 3485 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 5132 3734 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 5120 3861 /fastcall\001
+-6
+6 5175 4275 5775 4875
+4 0 0 50 0 1 10 0.0000 4 105 405 5250 4501 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 5204 4380 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 5187 4629 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 5175 4756 /fastcall\001
+-6
+6 5400 2250 6900 2700
+4 0 0 50 0 1 12 0.0000 4 180 1470 5414 2430 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 5700 2617 binary code\001
+-6
+6 4350 2250 5175 2700
+4 0 0 50 0 0 12 0.0000 4 180 735 4374 2614 jumptable\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4486 2439 UNIX\001
+-6
+6 7200 2175 8025 2775
+4 0 0 50 0 1 12 0.0000 4 135 720 7253 2528 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 7376 2341 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 7339 2703 handler\001
+-6
+6 4595 4475 4850 4665
+4 0 0 50 0 0 9 0.0000 4 90 210 4616 4565 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4595 4665 trace\001
+-6
+6 4588 3872 4858 4048
+4 0 0 50 0 0 9 0.0000 4 75 255 4593 4048 trace\001
+4 0 0 50 0 0 9 0.0000 4 105 270 4588 3947 entry\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 4950 4185 5985 4185
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 6165 5400 6165 5580 5130 5580 5130 4365 4950 4365
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 57.15 114.30
+ 6255 4140 7065 4140 7065 3825 7290 3825
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 57.15 114.30
+ 7605 4095 7605 4185 6615 4185
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 6615 4275 7290 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 7605 4590 7605 4725 6975 4725 6975 4455 6255 4455
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 4725 4860 4725 5040 4275 5040 4275 3285 5670 3285
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4500 6660 4500 6660 5040 5670 5040 5670 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 5040 6660 5040 6660 5400 5670 5400 5670 5040
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4230 5940 4230 5940 4500 5670 4500 5670 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 4230 6300 4230 6300 4500 5940 4500 5940 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 4230 6660 4230 6660 4500 6300 4500 6300 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 3960 6300 3960 6300 4230 5940 4230 5940 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 3960 6660 3960 6660 4230 6300 4230 6300 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 3960 5940 3960 5940 4230 5670 4230 5670 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 3420 6660 3420 6660 3015 5670 3015 5670 3420
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 5670 3150 5040 3150 5040 4005 5985 4005
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3375 7920 3375 7920 3555 7290 3555 7290 3375
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 6255 4005 6885 4005 6885 3465 7290 3465
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 7
+ 0 0 1.00 60.00 120.00
+ 7605 3555 7605 3645 8145 3645 8145 2790 4140 2790 4140 3960
+ 4500 3960
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 6165 3420 6165 3690
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 5670 2880 5940 3015
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4725 4950 4725 4950 4860 4500 4860 4500 4725
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4455 4950 4455 4950 4725 4500 4725 4500 4455
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4275 4950 4275 4950 4455 4500 4455 4500 4275
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4095 4950 4095 4950 4275 4500 4275 4500 4095
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3825 4950 3825 4950 4095 4500 4095 4500 3825
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4230 7920 4230 7920 4410 7290 4410 7290 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4410 7920 4410 7920 4590 7290 4590 7290 4410
+4 0 0 50 0 0 12 0.0000 4 105 210 6069 5272 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4140 #1\001
+4 0 0 50 0 0 9 0.0000 4 75 270 5970 4140 break\001
+4 0 0 50 0 0 9 0.0000 4 75 270 6331 4410 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 5996 4410 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4410 #2\001
+4 0 0 50 0 0 12 0.0000 4 135 585 5919 4837 callee...\001
+4 0 0 50 0 0 12 0.0000 4 135 555 5905 3275 caller...\001
+4 0 0 50 0 0 9 0.0000 4 90 405 7425 3510 redirect\001
+4 0 0 50 0 0 12 0.0000 4 135 390 5985 3825 END\001
+4 0 0 50 0 0 12 0.0000 4 135 570 5085 2970 START\001
+4 0 0 50 0 0 9 0.0000 4 75 150 4660 4819 ret\001
+4 0 0 50 0 0 9 0.0000 4 90 225 6356 4121 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7365 4369 #1=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7373 4545 #2=instr\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 3900 3450 4575 3825
+4 0 0 50 0 0 12 0.0000 4 180 600 3904 3606 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 3977 3792 cdecl\001
+-6
+6 5400 5475 6075 6225
+4 0 0 50 0 1 12 0.0000 4 180 600 5417 6123 /fastcall\001
+4 0 0 50 0 1 12 0.0000 4 135 600 5434 5956 /stdcall/\001
+4 0 0 50 0 1 12 0.0000 4 135 435 5482 5808 cdecl/\001
+4 0 0 50 0 0 12 0.0000 4 180 600 5436 5637 calltype\001
+-6
+6 3150 5550 3900 6600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 5580 3690 5580 3690 5715 3150 5715 3150 5580
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 5715 3870 5715 3870 6075 3150 6075 3150 5715
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 6075 3870 6075 3870 6255 3150 6255 3150 6075
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3870 6255 3150 6255 3150 6435 3870 6435 3870 6255
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 6435 3870 6435 3870 6570 3150 6570 3150 6435
+4 0 0 50 0 16 8 0.0000 4 90 450 3195 5685 wrapper\001
+4 0 0 50 0 0 9 0.0000 4 90 510 3244 5881 arguments\001
+4 0 0 50 0 0 9 0.0000 4 75 300 3361 6007 check\001
+4 0 0 50 0 0 9 0.0000 4 75 150 3424 6540 ret\001
+-6
+6 4500 5850 4950 7125
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6480 4950 6480 4950 6660 4500 6660 4500 6480
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6930 4950 6930 4950 7065 4500 7065 4500 6930
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6660 4950 6660 4950 6930 4500 6930 4500 6660
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6300 4950 6300 4950 6480 4500 6480 4500 6300
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 6030 4950 6030 4950 6300 4500 6300 4500 6030
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4860 6030 4500 6030 4500 5895 4860 5895 4860 6030
+4 0 0 50 0 0 9 0.0000 4 75 150 4648 7035 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 4586 6147 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4591 6248 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 4612 6783 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4591 6883 trace\001
+4 0 0 50 0 16 8 0.0000 4 105 285 4548 6007 inner\001
+-6
+6 4275 5175 4950 5625
+4 0 0 50 0 0 12 0.0000 4 180 600 4347 5382 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 4420 5568 cdecl\001
+-6
+6 3375 6975 4050 7350
+4 0 0 50 0 0 12 0.0000 4 180 600 3422 7127 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 3495 7313 cdecl\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 57.15 114.30
+ 6255 4005 6975 4005 6975 3690 7290 3690
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 57.15 114.30
+ 7605 3960 7605 4185 6615 4185
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 6615 4275 7290 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 7605 4590 7605 4770 6975 4770 6975 4455 6255 4455
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3870 4545 4050 4545 4050 3870 4500 3870
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 4725 4770 4725 4950 4050 4950 4050 4680 3870 4680
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4500 6660 4500 6660 5040 5670 5040 5670 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 5040 6660 5040 6660 5400 5670 5400 5670 5040
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 4230 5940 4230 5940 4500 5670 4500 5670 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 4230 6300 4230 6300 4500 5940 4500 5940 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 4230 6660 4230 6660 4500 6300 4500 6300 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5940 3960 6300 3960 6300 4230 5940 4230 5940 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6300 3960 6660 3960 6660 4230 6300 4230 6300 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3600 7922 3600 7922 3780 7290 3780 7290 3600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 3780 7920 3780 7920 3960 7290 3960 7290 3780
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4230 7920 4230 7920 4410 7290 4410 7290 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 7290 4410 7920 4410 7920 4590 7290 4590 7290 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3150 4410 3870 4410 3870 4815 3150 4815 3150 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 5670 3960 5940 3960 5940 4230 5670 4230 5670 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4185 4950 4185 4950 4365 4500 4365 4500 4185
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4635 4950 4635 4950 4770 4500 4770 4500 4635
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4365 4950 4365 4950 4635 4500 4635 4500 4365
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3735 4950 3735 4950 4005 4500 4005 4500 3735
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 3735 4860 3735 4860 3600 4500 3600 4500 3735
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 4725 7065 4725 7155 4050 7155 4050 6345 3870 6345
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 4500 4095 4185 4095 4185 5895 3870 5895
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 3510 6570 3510 6750 4320 6750 4320 4275 4500 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 3870 6165 4500 6165
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 60.00 120.00
+ 6165 5400 6165 6570 4950 6570
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 4950 6390 5310 6390 5310 4005 5985 4005
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4500 4005 4950 4005 4950 4185 4500 4185 4500 4005
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3510 4140 3510 4410
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3510 4815 3510 5085
+4 0 0 50 0 1 12 0.0000 4 180 1470 5414 3150 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 135 465 3270 3150 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 105 210 6069 5272 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4140 #1\001
+4 0 0 50 0 0 9 0.0000 4 75 270 5970 4140 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 6360 4140 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 270 6331 4410 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 5996 4410 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 120 5737 4410 #2\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7369 3921 #2=break\001
+4 0 0 50 0 0 9 0.0000 4 75 465 7366 4373 #1=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7371 3744 #1=instr\001
+4 0 0 50 0 0 9 0.0000 4 90 420 7362 4545 #2=instr\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4486 3159 UNIX\001
+4 0 0 50 0 1 12 0.0000 4 135 720 7253 3248 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 7376 3061 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 7339 3423 handler\001
+4 0 0 50 0 0 12 0.0000 4 135 555 3242 4674 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 585 5919 4837 callee...\001
+4 0 0 50 0 0 9 0.0000 4 75 150 4648 4740 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 4586 3852 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4591 3953 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 4612 4488 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 4591 4588 trace\001
+4 0 0 50 0 16 8 0.0000 4 105 285 4543 3705 outer\001
+4 0 0 50 0 0 12 0.0000 4 180 735 4374 3334 jumptable\001
+4 0 0 50 0 0 12 0.0000 4 180 870 5700 3337 binary code\001
+4 0 0 50 0 0 12 0.0000 4 135 360 3323 3331 code\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3342 5247 END\001
+4 0 0 50 0 0 12 0.0000 4 135 570 3240 4110 START\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 2625 2550 3225 3150
+4 0 0 50 0 1 10 0.0000 4 105 405 2720 2841 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 2674 2720 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 2657 2969 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 2645 3096 /fastcall\001
+-6
+6 4725 1350 5550 1950
+4 0 0 50 0 1 12 0.0000 4 135 720 4778 1718 SIGSEGV\001
+4 0 0 50 0 0 12 0.0000 4 135 465 4901 1531 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 555 4864 1893 handler\001
+-6
+6 1800 3825 2325 5025
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 4410 2295 4410 2295 4590 1845 4590 1845 4410
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 4860 2295 4860 2295 4995 1845 4995 1845 4860
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 4590 2295 4590 2295 4860 1845 4860 1845 4590
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 4230 2295 4230 2295 4410 1845 4410 1845 4230
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3960 2295 3960 2295 4230 1845 4230 1845 3960
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2205 3960 1845 3960 1845 3825 2205 3825 2205 3960
+4 0 0 50 0 0 9 0.0000 4 75 150 1993 4965 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 1931 4077 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 4178 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 1957 4713 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 4813 trace\001
+4 0 0 50 0 16 8 0.0000 4 105 285 1893 3937 inner\001
+-6
+6 675 4200 1350 4575
+4 0 0 50 0 0 12 0.0000 4 180 600 722 4382 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 795 4568 cdecl\001
+-6
+6 750 1950 1425 2325
+4 0 0 50 0 0 12 0.0000 4 180 600 814 2121 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 887 2307 cdecl\001
+-6
+6 1650 1500 2475 1950
+4 0 0 50 0 0 12 0.0000 4 135 465 1831 1674 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 180 735 1719 1849 jumptable\001
+-6
+6 2925 1500 4425 1950
+4 0 0 50 0 1 12 0.0000 4 180 1470 2939 1665 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 3225 1852 binary code\001
+-6
+6 600 1500 1125 1875
+4 0 0 50 0 0 12 0.0000 4 135 465 615 1665 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 360 668 1846 code\001
+-6
+6 525 2550 1125 2850
+4 0 0 50 0 0 9 0.0000 4 90 510 581 2675 arguments\001
+4 0 0 50 0 0 9 0.0000 4 75 300 698 2801 check\001
+-6
+6 2625 3900 3225 4500
+4 0 0 50 0 1 10 0.0000 4 105 405 2720 4146 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 2674 4025 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 2657 4274 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 2645 4401 /fastcall\001
+-6
+6 4800 2925 5475 3375
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 2970 5447 2970 5447 3150 4815 3150 4815 2970
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 3150 5445 3150 5445 3330 4815 3330 4815 3150
+4 0 0 50 0 0 9 0.0000 4 75 465 4894 3291 #2=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 4896 3114 #1=instr\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 2070 3375 2070 3555 2430 3555 2430 2520 3195 2520
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3735 4185 3735 4185 4275 3195 4275 3195 3735
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3465 3465 3465 3465 3735 3195 3735 3195 3465
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3465 3465 3825 3465 3825 3735 3465 3735 3465 3465
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3825 3465 4185 3465 4185 3735 3825 3735 3825 3465
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3465 3195 3825 3195 3825 3465 3465 3465 3465 3195
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3825 3195 4185 3195 4185 3465 3825 3465 3825 3195
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 3195 3465 3195 3465 3465 3195 3465 3195 3195
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3195 2385 2565 2385 2565 3240 3510 3240
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 2610 5445 2610 5445 2790 4815 2790 4815 2610
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3780 3240 4410 3240 4410 2700 4815 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 7
+ 0 0 1.00 60.00 120.00
+ 5130 2790 5130 2880 5670 2880 5670 2025 1440 2025 1440 2475
+ 1845 2475
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 855 3420 855 3600 1665 3600 1665 2880 1845 2880
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1845 2700 1215 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2790 2295 2790 2295 2970 1845 2970 1845 2790
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3240 2295 3240 2295 3375 1845 3375 1845 3240
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2970 2295 2970 2295 3240 1845 3240 1845 2970
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2340 2295 2340 2295 2610 1845 2610 1845 2340
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2340 2205 2340 2205 2205 1845 2205 1845 2340
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2610 2295 2610 2295 2790 1845 2790 1845 2610
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 2070 4995 2070 5085 1395 5085 1395 3150 1215 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 1215 2970 1530 2970 1530 4095 1845 4095
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2385 1035 2385 1035 2520 495 2520 495 2385
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2520 1215 2520 1215 2880 495 2880 495 2520
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2880 1215 2880 1215 3060 495 3060 495 2880
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1215 3060 495 3060 495 3240 1215 3240 1215 3060
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 3240 1215 3240 1215 3420 495 3420 495 3240
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 2295 4320 2565 4320 2565 3420 3510 3420
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 4275 4185 4275 4185 4635 3195 4635 3195 4275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 3690 4635 3690 4815 2565 4815 2565 4500 2295 4500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 2655 4185 2655 4185 2250 3195 2250 3195 2655
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 57.15 114.30
+ 3780 3375 4590 3375 4590 3060 4815 3060
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 57.15 114.30
+ 5130 3330 5130 3420 4140 3420
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 57.15 114.30
+ 4140 3510 4815 3510
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 57.15 114.30
+ 5130 3825 5130 3960 4500 3960 4500 3690 3780 3690
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 3465 5445 3465 5445 3645 4815 3645 4815 3465
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4815 3645 5445 3645 5445 3825 4815 3825 4815 3645
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3690 2655 3690 2835
+2 1 0 4 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3150 2115 3465 2250
+4 0 0 50 0 0 12 0.0000 4 105 210 3594 4507 ret\001
+4 0 0 50 0 0 9 0.0000 4 75 120 3262 3375 #1\001
+4 0 0 50 0 0 9 0.0000 4 75 270 3495 3375 break\001
+4 0 0 50 0 0 9 0.0000 4 75 270 3856 3645 break\001
+4 0 0 50 0 0 9 0.0000 4 90 225 3521 3645 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 120 3262 3645 #2\001
+4 0 0 50 0 0 12 0.0000 4 135 585 3444 4072 callee...\001
+4 0 0 50 0 0 9 0.0000 4 90 405 4950 2745 redirect\001
+4 0 0 50 0 0 9 0.0000 4 75 150 1993 3345 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 1931 2457 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 2558 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 1957 3093 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 3193 trace\001
+4 0 0 50 0 16 8 0.0000 4 105 285 1888 2310 outer\001
+4 0 0 50 0 16 8 0.0000 4 90 450 548 2490 wrapper\001
+4 0 0 50 0 0 9 0.0000 4 75 150 784 3363 ret\001
+4 0 0 50 0 0 12 0.0000 4 135 555 3430 2510 caller...\001
+4 0 0 50 0 0 9 0.0000 4 90 225 3885 3356 instr\001
+4 0 0 50 0 0 9 0.0000 4 75 465 4895 3608 #1=break\001
+4 0 0 50 0 0 9 0.0000 4 90 420 4894 3780 #2=instr\001
+4 0 0 50 0 0 12 0.0000 4 135 570 2564 2212 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3517 2981 END\001
--- /dev/null
+#FIG 3.2
+Landscape
+Center
+Metric
+Letter
+100.00
+Single
+-2
+1200 2
+6 2625 2550 3225 3150
+4 0 0 50 0 1 10 0.0000 4 105 405 2720 2841 cdecl/\001
+4 0 0 50 0 0 10 0.0000 4 135 510 2674 2720 calltype\001
+4 0 0 50 0 1 10 0.0000 4 105 540 2657 2969 /stdcall/\001
+4 0 0 50 0 1 10 0.0000 4 150 525 2645 3096 /fastcall\001
+-6
+6 1650 1500 2475 1950
+4 0 0 50 0 0 12 0.0000 4 135 465 1831 1674 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 180 735 1719 1849 jumptable\001
+-6
+6 2925 1500 4425 1950
+4 0 0 50 0 1 12 0.0000 4 180 1470 2939 1665 Microsoft Windows\001
+4 0 0 50 0 0 12 0.0000 4 180 870 3225 1852 binary code\001
+-6
+6 600 1500 1125 1875
+4 0 0 50 0 0 12 0.0000 4 135 465 615 1665 UNIX\001
+4 0 0 50 0 0 12 0.0000 4 135 360 668 1846 code\001
+-6
+6 975 3555 1650 3930
+4 0 0 50 0 0 12 0.0000 4 180 600 1017 3694 calltype\001
+4 0 0 50 0 1 12 0.0000 4 135 375 1090 3880 cdecl\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 2070 3555 2070 3735 2430 3735 2430 2520 3195 2520
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 3195 2385 1620 2385 1620 2655 1845 2655
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3195 2655 4185 2655 4185 2250 3195 2250 3195 2655
+2 1 0 3 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3690 2655 3690 2835
+2 1 0 4 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 2 1 1.00 120.00 90.00
+ 3150 2115 3465 2250
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 5
+ 0 0 1.00 60.00 120.00
+ 855 3330 855 3510 1665 3510 1665 3060 1845 3060
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 1845 2880 1215 2880
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2970 2295 2970 2295 3150 1845 3150 1845 2970
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3420 2295 3420 2295 3555 1845 3555 1845 3420
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 3150 2295 3150 2295 3420 1845 3420 1845 3150
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2520 2295 2520 2295 2790 1845 2790 1845 2520
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1845 2790 2295 2790 2295 2970 1845 2970 1845 2790
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 2610 1215 2610 1215 3150 495 3150 495 2610
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 495 3150 1215 3150 1215 3330 495 3330 495 3150
+4 0 0 50 0 0 12 0.0000 4 135 555 3430 2510 caller...\001
+4 0 0 50 0 0 12 0.0000 4 135 570 2564 2212 START\001
+4 0 0 50 0 0 12 0.0000 4 135 390 3517 2981 END\001
+4 0 0 50 0 0 9 0.0000 4 75 150 1993 3525 ret\001
+4 0 0 50 0 0 9 0.0000 4 105 270 1931 2637 entry\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 2738 trace\001
+4 0 0 50 0 0 9 0.0000 4 90 210 1957 3273 exit\001
+4 0 0 50 0 0 9 0.0000 4 75 255 1936 3373 trace\001
+4 0 0 50 0 0 12 0.0000 4 135 585 582 2962 callee...\001
+4 0 0 50 0 0 9 0.0000 4 75 150 784 3278 ret\001
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>captive-cmdline - Command-line client for B<captive> NTFS disk access</title>
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+<p><a name="__index__"></a></p>
+<!-- INDEX BEGIN -->
+
+<ul>
+
+ <li><a href="#name">NAME</a></li>
+ <li><a href="#synopsis">SYNOPSIS</a></li>
+ <li><a href="#description">DESCRIPTION</a></li>
+ <li><a href="#options">OPTIONS</a></li>
+ <li><a href="#see_also">SEE ALSO</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+</ul>
+<!-- INDEX END -->
+
+<hr />
+<p>
+</p>
+<h1><a name="name">NAME</a></h1>
+<p>captive-cmdline - Command-line client for <strong>captive</strong>(7) NTFS disk access</p>
+<p>
+</p>
+<hr />
+<h1><a name="synopsis">SYNOPSIS</a></h1>
+<p>
+</p>
+<hr />
+<h1><a name="description">DESCRIPTION</a></h1>
+<p>Simple <strong>ftp</strong>(1)-like client to access disks by Microsoft Windows drivers.
+Use if <strong>lufs-captivefs</strong>(7) not available; also useful during debugging.</p>
+<p>
+</p>
+<hr />
+<h1><a name="options">OPTIONS</a></h1>
+<p>All programs using <strong>captive</strong>(7) library share the common set of configuration
+options:</p>
+<dl>
+<dt><strong><a name="item_%2d%2dfilesystem%3dpathname"><strong>--filesystem</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to <strong>.sys</strong> or <strong>.so</strong> filesystem module file. You will use exactly
+once this option. Possible choices are
+<strong>/usr/local/var/lib/captive/ntfs.sys</strong>
+etc.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dload%2dmodule%3dpathname"><strong>--load-module</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to any W32 module to load w/o initialization. Multiple modules can be
+loaded although in common case you will use just
+<strong>/usr/local/var/lib/captive/ntoskrnl.exe</strong>
+here.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dro"><strong>--ro</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: Any write access will be forbidden. You should set this mode
+for <strong>cdfs.sys</strong> (<em>CD-ROM</em> filesystem). This option is mutually exclusive with
+<strong>--blind</strong> and <strong>--rw</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dblind"><strong>--blind</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: All writes are just simulated in memory (default). Microsoft
+Windows filesystem driver will see no difference between <strong>--blind</strong> and <strong>--rw</strong>
+although the UNIX image file/device will be open read/only as for <strong>--ro</strong>.
+All the changes get 'written' as long as <strong>captive</strong>(7) program runs - all the
+changes will be lost afterwards. This mode is the most suitable for debugging.
+This option is mutually exclusive with <strong>--ro</strong> and <strong>--rw</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2drw"><strong>--rw</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: Write directly to the image file/device. Standard read/write
+disk mode. You should use <strong>--sandbox-server</strong> option in this case to have the
+disk protected against Microsoft Windows filesystem driver crashes. Modified
+disk image blocks are in <strong>--sandbox-server</strong> <strong>--rw</strong> mode buffered in the
+memory and they get reflected to the disk only after successful completion
+of all filesystem operations including filesystem unmount.
+This option is mutually exclusive with <strong>--ro</strong> and <strong>--blind</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dcdrom"><strong>--cdrom</strong></a></strong><br />
+</dt>
+<dd>
+Media type: CD-ROM. You must set this media type for <strong>cdfs.sys</strong>.
+Virtual Microsoft Windows block device driver used by Captive maps to
+<strong>\Device\CdRom0</strong>. This option is mutually exclusive with <strong>--disk</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2ddisk"><strong>--disk</strong></a></strong><br />
+</dt>
+<dd>
+Media type: Disk (default). You must set this media type for all the Microsoft
+Windows filesystem drivers except <strong>cdfs.sys</strong>. Virtual Microsoft Windows block
+device driver used by Captive maps to <strong>\Device\CaptiveHarddisk0</strong>.
+This option is mutually exclusive with <strong>--cdrom</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2ddebug%2dmessages"><strong>--debug-messages</strong></a></strong><br />
+</dt>
+<dd>
+Turn on debugging messages. Be prepared for substation debug output.
+Use of <strong>--syslog</strong> feature is not recommended in this case.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsandbox%2dserver%3dpathname"><strong>--sandbox-server</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+program, turns on sandboxing.
+You should always use this option in conjunction with <strong>--rw</strong>, see it for
+details. Although this program is <em>setuid root</em> and it drops it privileges
+to <strong>@CAPTIVE_SANDBOX_SETUID@</strong> user. Your system gets protected by
+<strong>chroot</strong>(2), <strong>setuid</strong>(2), <strong>setgid</strong>(2) and <strong>setrlimit</strong>(2) UNIX security
+features against malicious Microsoft Windows drivers. You should never use this
+option during debugging.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsandbox%2dserver%2dior%3dior"><strong>--sandbox-server-ior</strong>=<strong>IOR</strong></a></strong><br />
+</dt>
+<dd>
+Specify <em>CORBA IOR</em> of
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+program, turns on
+sandboxing. Specified <em>CORBA IOR</em> should be the string starting by ``<strong>IOR:</strong>''
+text. This option is useful only for debugging. No sandbox restarting is
+possible in this case.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dno%2dsandbox"><strong>--no-sandbox</strong></a></strong><br />
+</dt>
+<dd>
+Turn off sandboxing feature (default). No
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+is run. Microsoft Windows filesystem driver is run in native UNIX environment
+without any <em>CORBA</em> separation. This option is recommended only for debugging.
+It is dangerous to use <strong>--rw</strong> together, see its description for the details.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dbug%2dpathname%3dpathname"><strong>--bug-pathname</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to <strong>strftime</strong>(3) for <strong>.captivebug.xml.gz</strong> bugreports. Every crash of
+sandbox child gets bugreported to the specified file. You should attempt to
+minimize the number of operations from the mount operation till the expected
+crash to minimize the snapshot file size. <strong>--sandbox-server</strong> option is
+required for <strong>--bug-pathname</strong>.
+</dd>
+<dd>
+<p><strong>!!! Be aware '.captivebug.xml.gz' will contain data from your disk drive !!!</strong></p>
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsyslog"><strong>--syslog</strong></a></strong><br />
+</dt>
+<dd>
+Messages sent to <strong>syslog</strong>(3) instead of <em>stderr</em>. This option gets handy
+for <strong>mount</strong>(8) operation as the messages would be lost otherway.
+Watch our for possible ``<strong>Filesystem crash broke dirty object</strong>'' messages where
+some written filesystem data got lost in the case of Microsoft Windows
+filesystem driver crash.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsyslog%2dfacility%3dfacility"><strong>--syslog-facility</strong>=<strong>facility</strong></a></strong><br />
+</dt>
+<dd>
+<strong>openlog</strong>(3) facility for <strong>--syslog</strong>. See <strong>facility</strong> section of
+<strong>openlog</strong>(3) man page for details. Lowercased values such as <strong>daemon</strong> or
+<strong>user</strong> are supported.
+</dd>
+<p></p></dl>
+<p>
+</p>
+<hr />
+<h1><a name="see_also">SEE ALSO</a></h1>
+<p><strong>captive</strong>(7), <strong>lufs-captivefs</strong>(7)</p>
+<p>
+</p>
+<hr />
+<h1><a name="author">AUTHOR</a></h1>
+<p><table cellspacing="0" cellpadding="0"><tr><td>Jan Kratochvil <<strong><a href="mailto:project-captive@jankratochvil.net">project-captive@jankratochvil.net</a></strong>>,
+<tr><td><td><em><a href="http://www.jankratochvil.net/">http://www.jankratochvil.net/</a></em></table></p>
+
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>captive-install-acquire - Find MS Windows XP driver files for B<NTFS></title>
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+<p><a name="__index__"></a></p>
+<!-- INDEX BEGIN -->
+
+<ul>
+
+ <li><a href="#name">NAME</a></li>
+ <li><a href="#synopsis">SYNOPSIS</a></li>
+ <li><a href="#description">DESCRIPTION</a></li>
+ <li><a href="#options">OPTIONS</a></li>
+ <li><a href="#see_also">SEE ALSO</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+</ul>
+<!-- INDEX END -->
+
+<hr />
+<p>
+</p>
+<h1><a name="name">NAME</a></h1>
+<p>captive-install-acquire - Find MS Windows XP driver files for <strong>NTFS</strong></p>
+<p>
+</p>
+<hr />
+<h1><a name="synopsis">SYNOPSIS</a></h1>
+<p>
+</p>
+<hr />
+<h1><a name="description">DESCRIPTION</a></h1>
+<p>Program acquires the needed <em>Microsoft Windows XP</em> driver files. Multiple
+methods of getting the driver files are supported. All the driver files are
+stored to the directory
+<strong>/usr/local/var/lib/captive/</strong>
+where they are
+expected by <strong>mount.captive</strong>(8).</p>
+<p>
+</p>
+<hr />
+<h1><a name="options">OPTIONS</a></h1>
+<p>Program will run interactively if no action options (<strong>--scan-disks</strong>,
+<strong>--scan-disks-quick</strong>, <strong>--scan-path</strong> or <strong>--microsoft-com</strong>) are specified.
+Otherwise the requested <code>action(s)</code> is proceeded in silent batch mode.</p>
+<dl>
+<dt><strong><a name="item_%2d%2dtext"><strong>--text</strong></a></strong><br />
+</dt>
+<dd>
+Disable <em>Gnome</em> user interface even if <em>X Window System</em> is available.
+You must specify this option as the first one. This option has effect only for
+interactive mode (no action options specified).
+</dd>
+<p></p>
+<dt><strong><a name="item_%2dv%7c%2d%2dverbose"><strong>-v</strong>|<strong>--verbose</strong></a></strong><br />
+</dt>
+<dd>
+Display additional information during disks scanning.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2dn%7c%2d%2ddry"><strong>-n</strong>|<strong>--dry</strong></a></strong><br />
+</dt>
+<dd>
+Perform all the operations but do not modify anything (no drivers are
+stored to
+<strong>/usr/local/var/lib/captive/</strong>
+directory).
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dmodid%2dpath%3dpath"><strong>--modid-path</strong>=<strong>path</strong></a></strong><br />
+</dt>
+<dd>
+Path to <strong>.captivemodid.xml</strong> database (default:
+<strong>/usr/local/etc/w32-mod-id.captivemodid.xml</strong>). This file contains
+identifications (<strong>md5sum</strong>(1)) of known compatible <em>Microsoft Windows XP</em>
+driver files. <strong>captive-install-acquire</strong>(1) will ignore any files not
+identified by this file although you may try to copy them to
+<strong>/usr/local/var/lib/captive/</strong>
+manually for <strong>captive</strong>(7) clients.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dscan%2ddisks"><strong>--scan-disks</strong></a></strong><br />
+</dt>
+<dd>
+Scan all files on any local hard drive (mounted or unmounted) <strong>NTFS</strong> or
+(mounted) <strong>FAT</strong> partitions. This scanning includes <em>cabinet</em> (<strong>.cab</strong>)
+archives. This scanning can last for very long time.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dscan%2ddisks%2dquick"><strong>--scan-disks-quick</strong></a></strong><br />
+</dt>
+<dd>
+Reduced version of <strong>--scan-disks</strong>. Only <strong>windows/system32</strong> subdirectory in
+the root of any local hard drive (mounted or unmounted) <strong>NTFS</strong> or (mounted)
+<strong>FAT</strong> partition is investigated. This scan should find existing driver files
+in already existing <em>Microsoft Windows XP</em> installations.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dscan%2dpath%3dpath%2furi"><strong>--scan-path</strong>=<strong>path/URI</strong></a></strong><br />
+</dt>
+<dd>
+Scan the specified <strong>path/URI</strong> for device driver files. You may use either
+filename (<strong>/tmp/ntoskrnl.ex_</strong>), directory (<strong>/tmp/servicepack.cab</strong>), <strong>NTFS</strong>
+disk file/directory (<strong>file:///dev/hda1#libntfs:/windows/system32</strong>) or remote
+<em>URI</em> filename (<strong><a href="http://server/path/to/ntfs.sys">http://server/path/to/ntfs.sys</a></strong>). Remote <em>URI</em> directory
+(such as <strong><a href="http://server/subdir/">http://server/subdir/</a></strong>) is not supported.
+</dd>
+<dd>
+<p>Possibly specified directory is always scanned recursively.</p>
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dmicrosoft%2dcom"><strong>--microsoft-com</strong></a></strong><br />
+</dt>
+<dd>
+You can download the best available version of needed drivers from
+<em>Microsoft</em>. They can be found in <em>Microsoft Windows XP Service Pack 1
+Checked Build</em> (URL
+<strong><a href="http://www.microsoft.com/WindowsXP/pro/downloads/servicepacks/sp1/checkedbuild.asp">http://www.microsoft.com/WindowsXP/pro/downloads/servicepacks/sp1/checkedbuild.asp</a></strong>)
+</dd>
+<dd>
+<p>Legal: In some countries you need to have valid <em>Microsoft Windows XP</em> license
+to use it.</p>
+</dd>
+<dd>
+<p>Program will need to download approx 29MB of data (the cabinet file is 151MB;
+1MB=1e6B here).</p>
+</dd>
+<p></p></dl>
+<p>
+</p>
+<hr />
+<h1><a name="see_also">SEE ALSO</a></h1>
+<p><strong>captive-install-fstab</strong>(1), <strong>captive</strong>(7), <strong>lufs-captivefs</strong>(7)</p>
+<p>
+</p>
+<hr />
+<h1><a name="author">AUTHOR</a></h1>
+<p><table cellspacing="0" cellpadding="0"><tr><td>Jan Kratochvil <<strong><a href="mailto:project-captive@jankratochvil.net">project-captive@jankratochvil.net</a></strong>>,
+<tr><td><td><em><a href="http://www.jankratochvil.net/">http://www.jankratochvil.net/</a></em></table></p>
+
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>captive-install-fstab - Manage B<captive-ntfs> B</etc/fstab> entries</title>
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+<p><a name="__index__"></a></p>
+<!-- INDEX BEGIN -->
+
+<ul>
+
+ <li><a href="#name">NAME</a></li>
+ <li><a href="#synopsis">SYNOPSIS</a></li>
+ <li><a href="#description">DESCRIPTION</a></li>
+ <li><a href="#options">OPTIONS</a></li>
+ <li><a href="#see_also">SEE ALSO</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+</ul>
+<!-- INDEX END -->
+
+<hr />
+<p>
+</p>
+<h1><a name="name">NAME</a></h1>
+<p>captive-install-fstab - Manage <strong>captive-ntfs</strong> <strong>/etc/fstab</strong> entries</p>
+<p>
+</p>
+<hr />
+<h1><a name="synopsis">SYNOPSIS</a></h1>
+<p>
+</p>
+<hr />
+<h1><a name="description">DESCRIPTION</a></h1>
+<p>Program will scan your local disk drive partitions (from <strong>/proc/partitions</strong>)
+and it will add/remove appropriate file-system type <strong>captive-ntfs</strong> entries
+in <strong>/etc/fstab</strong>.</p>
+<p>Destination directory is chosen automatically as <strong>/mnt/captive-</strong>LABEL_NAME
+where <strong>LABEL_NAME</strong> is the label used for the <strong>NTFS</strong> partition. Directory
+<strong>/mnt/captive-</strong> may be used if no volume label is set. Different (numbered)
+directory name is used if multiple disks have the same volume label set.</p>
+<p>
+</p>
+<hr />
+<h1><a name="options">OPTIONS</a></h1>
+<dl>
+<dt><strong><a name="item_%2dv%7c%2d%2dverbose"><strong>-v</strong>|<strong>--verbose</strong></a></strong><br />
+</dt>
+<dd>
+Display additional information during disks scanning.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2dn%7c%2d%2ddry"><strong>-n</strong>|<strong>--dry</strong></a></strong><br />
+</dt>
+<dd>
+Perform all the operations but do not modify anything (file <strong>/etc/fstab</strong>).
+You will probably use this option together with [<strong>-v</strong>|<strong>--verbose</strong>].
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dadd"><strong>--add</strong></a></strong><br />
+</dt>
+<dd>
+Add all the found <strong>NTFS</strong> disk drive partitions to <strong>/etc/fstab</strong>.
+Any previous <strong>captive-ntfs</strong> entries will be deleted as described in
+<strong>--remove</strong> option.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dremove"><strong>--remove</strong></a></strong><br />
+</dt>
+<dd>
+Remove all lines of filesystem type <strong>captive-ntfs</strong> and device name in
+<strong>/dev</strong> directory.
+</dd>
+<p></p></dl>
+<p>
+</p>
+<hr />
+<h1><a name="see_also">SEE ALSO</a></h1>
+<p><strong>captive-install-acquire</strong>(1), <strong>captive</strong>(7), <strong>lufs-captivefs</strong>(7)</p>
+<p>
+</p>
+<hr />
+<h1><a name="author">AUTHOR</a></h1>
+<p><table cellspacing="0" cellpadding="0"><tr><td>Jan Kratochvil <<strong><a href="mailto:project-captive@jankratochvil.net">project-captive@jankratochvil.net</a></strong>>,
+<tr><td><td><em><a href="http://www.jankratochvil.net/">http://www.jankratochvil.net/</a></em></table></p>
+
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>captive-sandbox-server - Security+safety wrapper for NTFS disk access</title>
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+<p><a name="__index__"></a></p>
+<!-- INDEX BEGIN -->
+
+<ul>
+
+ <li><a href="#name">NAME</a></li>
+ <li><a href="#synopsis">SYNOPSIS</a></li>
+ <li><a href="#description">DESCRIPTION</a></li>
+ <li><a href="#options">OPTIONS</a></li>
+ <li><a href="#see_also">SEE ALSO</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+</ul>
+<!-- INDEX END -->
+
+<hr />
+<p>
+</p>
+<h1><a name="name">NAME</a></h1>
+<p>captive-sandbox-server - Security+safety wrapper for NTFS disk access</p>
+<p>
+</p>
+<hr />
+<h1><a name="synopsis">SYNOPSIS</a></h1>
+<p><strong>captive-sandbox-server</strong></p>
+<p>
+</p>
+<hr />
+<h1><a name="description">DESCRIPTION</a></h1>
+<p>Program implementing separation of emulated <em>Microsoft Windows NT</em> kernel
+environment from the rest of <em>UNIX</em> system. Your system gets protected by
+<strong>chroot</strong>(2), <strong>setuid</strong>(2), <strong>setgid</strong>(2) and <strong>setrlimit</strong>(2) UNIX security
+features against malicious Microsoft Windows drivers.</p>
+<p>Use this program as argument of <strong>--sandbox-server</strong> option of <strong>captive</strong>(7).
+Do not use this option/program during <strong>captive</strong>(7) debugging.</p>
+<p>
+</p>
+<hr />
+<h1><a name="options">OPTIONS</a></h1>
+<p>No options are permitted for this command - it will display its <em>CORBA/ORBit</em>
+connection properties on its standard output.</p>
+<p>
+</p>
+<hr />
+<h1><a name="see_also">SEE ALSO</a></h1>
+<p><strong>captive</strong>(7), <strong>captive-cmdline</strong>(1), <strong>lufs-captivefs</strong>(7)</p>
+<p>
+</p>
+<hr />
+<h1><a name="author">AUTHOR</a></h1>
+<p><table cellspacing="0" cellpadding="0"><tr><td>Jan Kratochvil <<strong><a href="mailto:project-captive@jankratochvil.net">project-captive@jankratochvil.net</a></strong>>,
+<tr><td><td><em><a href="http://www.jankratochvil.net/">http://www.jankratochvil.net/</a></em></table></p>
+
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>captive - Microsoft Windows NT kernel emulation for NTFS disk access</title>
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+<p><a name="__index__"></a></p>
+<!-- INDEX BEGIN -->
+
+<ul>
+
+ <li><a href="#name">NAME</a></li>
+ <li><a href="#description">DESCRIPTION</a></li>
+ <li><a href="#options">OPTIONS</a></li>
+ <li><a href="#see_also">SEE ALSO</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+</ul>
+<!-- INDEX END -->
+
+<hr />
+<p>
+</p>
+<h1><a name="name">NAME</a></h1>
+<p>captive - Microsoft Windows NT kernel emulation for NTFS disk access</p>
+<p>
+</p>
+<hr />
+<h1><a name="description">DESCRIPTION</a></h1>
+<p><strong>captive</strong>(7) library allows applications running under the <strong>GNU/Linux</strong>
+operating system to access <strong>NTFS</strong> drives. File system driver compatibility
+with <strong>VFAT</strong>, <strong>ISO9660</strong> and <strong>EXT2</strong> is also provided.</p>
+<p>This man page <strong>captive</strong>(7) show the common options of all <strong>captive</strong>
+clients. You will always use a specific client such as
+<strong>mount.captive</strong>(8) or <strong>captive-cmdline</strong>(1).</p>
+<p>
+</p>
+<hr />
+<h1><a name="options">OPTIONS</a></h1>
+<p>All programs using <strong>captive</strong>(7) library share the common set of configuration
+options:</p>
+<dl>
+<dt><strong><a name="item_%2d%2dfilesystem%3dpathname"><strong>--filesystem</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to <strong>.sys</strong> or <strong>.so</strong> filesystem module file. You will use exactly
+once this option. Possible choices are
+<strong>/usr/local/var/lib/captive/ntfs.sys</strong>
+etc.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dload%2dmodule%3dpathname"><strong>--load-module</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to any W32 module to load w/o initialization. Multiple modules can be
+loaded although in common case you will use just
+<strong>/usr/local/var/lib/captive/ntoskrnl.exe</strong>
+here.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dro"><strong>--ro</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: Any write access will be forbidden. You should set this mode
+for <strong>cdfs.sys</strong> (<em>CD-ROM</em> filesystem). This option is mutually exclusive with
+<strong>--blind</strong> and <strong>--rw</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dblind"><strong>--blind</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: All writes are just simulated in memory (default). Microsoft
+Windows filesystem driver will see no difference between <strong>--blind</strong> and <strong>--rw</strong>
+although the UNIX image file/device will be open read/only as for <strong>--ro</strong>.
+All the changes get 'written' as long as <strong>captive</strong>(7) program runs - all the
+changes will be lost afterwards. This mode is the most suitable for debugging.
+This option is mutually exclusive with <strong>--ro</strong> and <strong>--rw</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2drw"><strong>--rw</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: Write directly to the image file/device. Standard read/write
+disk mode. You should use <strong>--sandbox-server</strong> option in this case to have the
+disk protected against Microsoft Windows filesystem driver crashes. Modified
+disk image blocks are in <strong>--sandbox-server</strong> <strong>--rw</strong> mode buffered in the
+memory and they get reflected to the disk only after successful completion
+of all filesystem operations including filesystem unmount.
+This option is mutually exclusive with <strong>--ro</strong> and <strong>--blind</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dcdrom"><strong>--cdrom</strong></a></strong><br />
+</dt>
+<dd>
+Media type: CD-ROM. You must set this media type for <strong>cdfs.sys</strong>.
+Virtual Microsoft Windows block device driver used by Captive maps to
+<strong>\Device\CdRom0</strong>. This option is mutually exclusive with <strong>--disk</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2ddisk"><strong>--disk</strong></a></strong><br />
+</dt>
+<dd>
+Media type: Disk (default). You must set this media type for all the Microsoft
+Windows filesystem drivers except <strong>cdfs.sys</strong>. Virtual Microsoft Windows block
+device driver used by Captive maps to <strong>\Device\CaptiveHarddisk0</strong>.
+This option is mutually exclusive with <strong>--cdrom</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2ddebug%2dmessages"><strong>--debug-messages</strong></a></strong><br />
+</dt>
+<dd>
+Turn on debugging messages. Be prepared for substation debug output.
+Use of <strong>--syslog</strong> feature is not recommended in this case.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsandbox%2dserver%3dpathname"><strong>--sandbox-server</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+program, turns on sandboxing.
+You should always use this option in conjunction with <strong>--rw</strong>, see it for
+details. Although this program is <em>setuid root</em> and it drops it privileges
+to <strong>@CAPTIVE_SANDBOX_SETUID@</strong> user. Your system gets protected by
+<strong>chroot</strong>(2), <strong>setuid</strong>(2), <strong>setgid</strong>(2) and <strong>setrlimit</strong>(2) UNIX security
+features against malicious Microsoft Windows drivers. You should never use this
+option during debugging.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsandbox%2dserver%2dior%3dior"><strong>--sandbox-server-ior</strong>=<strong>IOR</strong></a></strong><br />
+</dt>
+<dd>
+Specify <em>CORBA IOR</em> of
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+program, turns on
+sandboxing. Specified <em>CORBA IOR</em> should be the string starting by ``<strong>IOR:</strong>''
+text. This option is useful only for debugging. No sandbox restarting is
+possible in this case.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dno%2dsandbox"><strong>--no-sandbox</strong></a></strong><br />
+</dt>
+<dd>
+Turn off sandboxing feature (default). No
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+is run. Microsoft Windows filesystem driver is run in native UNIX environment
+without any <em>CORBA</em> separation. This option is recommended only for debugging.
+It is dangerous to use <strong>--rw</strong> together, see its description for the details.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dbug%2dpathname%3dpathname"><strong>--bug-pathname</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to <strong>strftime</strong>(3) for <strong>.captivebug.xml.gz</strong> bugreports. Every crash of
+sandbox child gets bugreported to the specified file. You should attempt to
+minimize the number of operations from the mount operation till the expected
+crash to minimize the snapshot file size. <strong>--sandbox-server</strong> option is
+required for <strong>--bug-pathname</strong>.
+</dd>
+<dd>
+<p><strong>!!! Be aware '.captivebug.xml.gz' will contain data from your disk drive !!!</strong></p>
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsyslog"><strong>--syslog</strong></a></strong><br />
+</dt>
+<dd>
+Messages sent to <strong>syslog</strong>(3) instead of <em>stderr</em>. This option gets handy
+for <strong>mount</strong>(8) operation as the messages would be lost otherway.
+Watch our for possible ``<strong>Filesystem crash broke dirty object</strong>'' messages where
+some written filesystem data got lost in the case of Microsoft Windows
+filesystem driver crash.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsyslog%2dfacility%3dfacility"><strong>--syslog-facility</strong>=<strong>facility</strong></a></strong><br />
+</dt>
+<dd>
+<strong>openlog</strong>(3) facility for <strong>--syslog</strong>. See <strong>facility</strong> section of
+<strong>openlog</strong>(3) man page for details. Lowercased values such as <strong>daemon</strong> or
+<strong>user</strong> are supported.
+</dd>
+<p></p></dl>
+<p>
+</p>
+<hr />
+<h1><a name="see_also">SEE ALSO</a></h1>
+<p><strong>mount.captive</strong>(8), <strong>captive-cmdline</strong>(1), <strong>captive-install-acquire</strong>(1)</p>
+<p>
+</p>
+<hr />
+<h1><a name="author">AUTHOR</a></h1>
+<p><table cellspacing="0" cellpadding="0"><tr><td>Jan Kratochvil <<strong><a href="mailto:project-captive@jankratochvil.net">project-captive@jankratochvil.net</a></strong>>,
+<tr><td><td><em><a href="http://www.jankratochvil.net/">http://www.jankratochvil.net/</a></em></table></p>
+
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>lufs-captivefs - Linux Userland File System module for NTFS as filesystem</title>
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+<p><a name="__index__"></a></p>
+<!-- INDEX BEGIN -->
+
+<ul>
+
+ <li><a href="#name">NAME</a></li>
+ <li><a href="#description">DESCRIPTION</a></li>
+ <li><a href="#options">OPTIONS</a></li>
+ <li><a href="#see_also">SEE ALSO</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+</ul>
+<!-- INDEX END -->
+
+<hr />
+<p>
+</p>
+<h1><a name="name">NAME</a></h1>
+<p>lufs-captivefs - Linux Userland File System module for NTFS as filesystem</p>
+<p>
+</p>
+<hr />
+<h1><a name="description">DESCRIPTION</a></h1>
+<p><strong>lufs-captivefs</strong>(7) module for Linux Userland File System (LUFS) enables
+<strong>GNU/Linux</strong> system to access NTFS drives by Microsoft Windows drivers in
+the most common way of kernel-level filesystem implementation.</p>
+<p>{<strong>-c CHAN</strong>|<strong>--channels</strong>=<strong>CHAN</strong>} option of <strong>lufsmount</strong>(1) is respected
+although the final filesystem operations are always processed in single-channel
+mode. Do not set <strong>CHAN</strong> to <strong>1</strong> as it would invoke errors by LUFS kernel
+driver.</p>
+<p>
+</p>
+<hr />
+<h1><a name="options">OPTIONS</a></h1>
+<p>All programs using <strong>captive</strong>(7) library share the common set of configuration
+options:</p>
+<dl>
+<dt><strong><a name="item_%2d%2dfilesystem%3dpathname"><strong>--filesystem</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to <strong>.sys</strong> or <strong>.so</strong> filesystem module file. You will use exactly
+once this option. Possible choices are
+<strong>/usr/local/var/lib/captive/ntfs.sys</strong>
+etc.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dload%2dmodule%3dpathname"><strong>--load-module</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to any W32 module to load w/o initialization. Multiple modules can be
+loaded although in common case you will use just
+<strong>/usr/local/var/lib/captive/ntoskrnl.exe</strong>
+here.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dro"><strong>--ro</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: Any write access will be forbidden. You should set this mode
+for <strong>cdfs.sys</strong> (<em>CD-ROM</em> filesystem). This option is mutually exclusive with
+<strong>--blind</strong> and <strong>--rw</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dblind"><strong>--blind</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: All writes are just simulated in memory (default). Microsoft
+Windows filesystem driver will see no difference between <strong>--blind</strong> and <strong>--rw</strong>
+although the UNIX image file/device will be open read/only as for <strong>--ro</strong>.
+All the changes get 'written' as long as <strong>captive</strong>(7) program runs - all the
+changes will be lost afterwards. This mode is the most suitable for debugging.
+This option is mutually exclusive with <strong>--ro</strong> and <strong>--rw</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2drw"><strong>--rw</strong></a></strong><br />
+</dt>
+<dd>
+Read/write mode: Write directly to the image file/device. Standard read/write
+disk mode. You should use <strong>--sandbox-server</strong> option in this case to have the
+disk protected against Microsoft Windows filesystem driver crashes. Modified
+disk image blocks are in <strong>--sandbox-server</strong> <strong>--rw</strong> mode buffered in the
+memory and they get reflected to the disk only after successful completion
+of all filesystem operations including filesystem unmount.
+This option is mutually exclusive with <strong>--ro</strong> and <strong>--blind</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dcdrom"><strong>--cdrom</strong></a></strong><br />
+</dt>
+<dd>
+Media type: CD-ROM. You must set this media type for <strong>cdfs.sys</strong>.
+Virtual Microsoft Windows block device driver used by Captive maps to
+<strong>\Device\CdRom0</strong>. This option is mutually exclusive with <strong>--disk</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2ddisk"><strong>--disk</strong></a></strong><br />
+</dt>
+<dd>
+Media type: Disk (default). You must set this media type for all the Microsoft
+Windows filesystem drivers except <strong>cdfs.sys</strong>. Virtual Microsoft Windows block
+device driver used by Captive maps to <strong>\Device\CaptiveHarddisk0</strong>.
+This option is mutually exclusive with <strong>--cdrom</strong>.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2ddebug%2dmessages"><strong>--debug-messages</strong></a></strong><br />
+</dt>
+<dd>
+Turn on debugging messages. Be prepared for substation debug output.
+Use of <strong>--syslog</strong> feature is not recommended in this case.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsandbox%2dserver%3dpathname"><strong>--sandbox-server</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+program, turns on sandboxing.
+You should always use this option in conjunction with <strong>--rw</strong>, see it for
+details. Although this program is <em>setuid root</em> and it drops it privileges
+to <strong>@CAPTIVE_SANDBOX_SETUID@</strong> user. Your system gets protected by
+<strong>chroot</strong>(2), <strong>setuid</strong>(2), <strong>setgid</strong>(2) and <strong>setrlimit</strong>(2) UNIX security
+features against malicious Microsoft Windows drivers. You should never use this
+option during debugging.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsandbox%2dserver%2dior%3dior"><strong>--sandbox-server-ior</strong>=<strong>IOR</strong></a></strong><br />
+</dt>
+<dd>
+Specify <em>CORBA IOR</em> of
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+program, turns on
+sandboxing. Specified <em>CORBA IOR</em> should be the string starting by ``<strong>IOR:</strong>''
+text. This option is useful only for debugging. No sandbox restarting is
+possible in this case.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dno%2dsandbox"><strong>--no-sandbox</strong></a></strong><br />
+</dt>
+<dd>
+Turn off sandboxing feature (default). No
+<strong>/usr/local/sbin/captive-sandbox-server</strong>
+is run. Microsoft Windows filesystem driver is run in native UNIX environment
+without any <em>CORBA</em> separation. This option is recommended only for debugging.
+It is dangerous to use <strong>--rw</strong> together, see its description for the details.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dbug%2dpathname%3dpathname"><strong>--bug-pathname</strong>=<strong>pathname</strong></a></strong><br />
+</dt>
+<dd>
+Pathname to <strong>strftime</strong>(3) for <strong>.captivebug.xml.gz</strong> bugreports. Every crash of
+sandbox child gets bugreported to the specified file. You should attempt to
+minimize the number of operations from the mount operation till the expected
+crash to minimize the snapshot file size. <strong>--sandbox-server</strong> option is
+required for <strong>--bug-pathname</strong>.
+</dd>
+<dd>
+<p><strong>!!! Be aware '.captivebug.xml.gz' will contain data from your disk drive !!!</strong></p>
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsyslog"><strong>--syslog</strong></a></strong><br />
+</dt>
+<dd>
+Messages sent to <strong>syslog</strong>(3) instead of <em>stderr</em>. This option gets handy
+for <strong>mount</strong>(8) operation as the messages would be lost otherway.
+Watch our for possible ``<strong>Filesystem crash broke dirty object</strong>'' messages where
+some written filesystem data got lost in the case of Microsoft Windows
+filesystem driver crash.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2d%2dsyslog%2dfacility%3dfacility"><strong>--syslog-facility</strong>=<strong>facility</strong></a></strong><br />
+</dt>
+<dd>
+<strong>openlog</strong>(3) facility for <strong>--syslog</strong>. See <strong>facility</strong> section of
+<strong>openlog</strong>(3) man page for details. Lowercased values such as <strong>daemon</strong> or
+<strong>user</strong> are supported.
+</dd>
+<p></p></dl>
+<p>
+</p>
+<hr />
+<h1><a name="see_also">SEE ALSO</a></h1>
+<p><strong>mount.captive</strong>(8), <strong>lufsmount</strong>(1), <strong>captive</strong>(7)</p>
+<p>
+</p>
+<hr />
+<h1><a name="author">AUTHOR</a></h1>
+<p><table cellspacing="0" cellpadding="0"><tr><td>Jan Kratochvil <<strong><a href="mailto:project-captive@jankratochvil.net">project-captive@jankratochvil.net</a></strong>>,
+<tr><td><td><em><a href="http://www.jankratochvil.net/">http://www.jankratochvil.net/</a></em></table></p>
+
+</body>
+
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>mount.captive - B<mount> interface for NTFS disk access</title>
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+<p><a name="__index__"></a></p>
+<!-- INDEX BEGIN -->
+
+<ul>
+
+ <li><a href="#name">NAME</a></li>
+ <li><a href="#synopsis">SYNOPSIS</a></li>
+ <li><a href="#description">DESCRIPTION</a></li>
+ <li><a href="#options">OPTIONS</a></li>
+ <li><a href="#see_also">SEE ALSO</a></li>
+ <li><a href="#author">AUTHOR</a></li>
+</ul>
+<!-- INDEX END -->
+
+<hr />
+<p>
+</p>
+<h1><a name="name">NAME</a></h1>
+<p>mount.captive - <strong>mount</strong>(8) interface for NTFS disk access</p>
+<p>
+</p>
+<hr />
+<h1><a name="synopsis">SYNOPSIS</a></h1>
+<p><strong>mount.ntfs</strong> {<strong>image-file</strong>|<strong>device</strong>} <strong>mountdir</strong>
+[<strong>-n</strong>] [<strong>-v</strong>] [<strong>-o</strong> <strong>options</strong>]</p>
+<p><strong>mount</strong> <strong>-t</strong> <strong>captive-ntfs</strong>
+[<strong>-n</strong>] [<strong>-v</strong>] [<strong>-o</strong> <strong>options</strong>]
+{<strong>image-file</strong>|<strong>device</strong>} <strong>dir</strong></p>
+<p>
+</p>
+<hr />
+<h1><a name="description">DESCRIPTION</a></h1>
+<p><strong>mount.captive</strong>(8) provides <strong>mount</strong>(8) interface to <strong>lufs-captivefs</strong>(7)
+by calling <strong>lufsmount</strong>(1) with appropriate arguments. You should never call
+this command directly - use <strong>mount</strong>(8) instead.</p>
+<p><strong>mount.captive</strong>(8) (<strong>captive</strong> filesystem type) is never used - this command
+is provided just as a base <code>mount(8)</code> interface to <strong>captive</strong>(7). You must always
+use captive-<strong>fstype</strong> filesystem type such as <strong>captive-ntfs</strong>. Other supported
+filesystem types are:
+<strong>ntfs</strong>, <strong>fastfat</strong>, <strong>cdfs</strong>, <strong>ext2fsd</strong></p>
+<p>
+</p>
+<hr />
+<h1><a name="options">OPTIONS</a></h1>
+<dl>
+<dt><strong><a name="item_%7bimage%2dfile%7cdevice%7d">{<strong>image-file</strong>|<strong>device</strong>}</a></strong><br />
+</dt>
+<dd>
+Pathname such as <strong>/dev/hda1</strong> or <strong>/tmp/ntfs.bin</strong>. You should refer to the
+partition name, not the whole device (<strong>/dev/hda</strong> is forbidden).
+<strong>/dev/hda1</strong> may correspond to <strong>/dev/ide/host0/bus0/target0/lun0/part1</strong>
+on your system.
+</dd>
+<p></p>
+<dt><strong><a name="item_mountdir"><strong>mountdir</strong></a></strong><br />
+</dt>
+<dd>
+Existing empty target directory where {<strong>image-file</strong>|<strong>device</strong>} will be
+mounted.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2dn"><strong>-n</strong></a></strong><br />
+</dt>
+<dd>
+Do not modify <strong>/etc/mtab</strong>. This option is currently not supported (ignored),
+<strong>/etc/mtab</strong> is modified notwithstanding.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2dv"><strong>-v</strong></a></strong><br />
+</dt>
+<dd>
+Enable verbose mode. Command <strong>lufsmount</strong>(1) being called is shown.
+</dd>
+<p></p>
+<dt><strong><a name="item_%2do_options"><strong>-o</strong> <strong>options</strong></a></strong><br />
+</dt>
+<dd>
+Custom options passed to <strong>captive</strong>(7). See its manpage for details. Options
+double-dashes (<strong>--</strong>) can be omitted for <strong>lufs-captivefs</strong>(7) or
+<strong>mount.captive</strong>(8).
+</dd>
+<p></p></dl>
+<p>
+</p>
+<hr />
+<h1><a name="see_also">SEE ALSO</a></h1>
+<p><strong>lufs-captivefs</strong>(7), <strong>lufsmount</strong>(1)</p>
+<p>
+</p>
+<hr />
+<h1><a name="author">AUTHOR</a></h1>
+<p><table cellspacing="0" cellpadding="0"><tr><td>Jan Kratochvil <<strong><a href="mailto:project-captive@jankratochvil.net">project-captive@jankratochvil.net</a></strong>>,
+<tr><td><td><em><a href="http://www.jankratochvil.net/">http://www.jankratochvil.net/</a></em></table></p>
+
+</body>
+
+</html>
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::checkListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
my %item;
for my $dir (keys(%dirs)) {
- require "$dir/ListItem.pm";
+ Wrequire "$dir/ListItem.pm";
my $item=eval('\%My::Project::'.$dir.'::ListItem');
do { warn "Broken $dir/List.pm"; next; } if !defined %$item;
$item{$dir}=$item;
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::checkstatic::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::checkstatic::ListItem;
+Wuse 'My::Project';
+Wuse 'project::checkstatic::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::checkstatic::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::checkstatic::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::checkstatic;
+package project::checkstatic::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"C Sources Symbol Attributes Checker",
- "priority"=>7,
- "download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/home/lace/bin/checkstatic?rev=HEAD",
- "summary"=>"Development tool",
+
+our @ListItem=(
+ "name"=>"checkstatic",
+ "platform"=>"unixdevel",
+ "priority"=>510,
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "download"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/nethome/home/lace/bin/checkstatic?rev=HEAD",
+ "summary"=>"C sources symbol attributes checker",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"Perl",
- "description"=>""
- .'<p>Gives additional warnings not provided by GNU C Compiler'
- .' such as dead code declared as <code>global</code> in separate file,'
- .' missing <code>static</code> keywords etc.</p>'
- .' <p>It can get very valuable during stripping functionality off of'
- .' a big package for embedded resource-limited machines.</p>'
+ "description"=><<"HERE",
+<p>Scripts gives additional warnings not provided by GNU C Compiler
+such as dead code declared as <code>global</code> in separate file,
+missing <code>static</code> keywords etc.</p>
+<p>It can get very valuable during stripping functionality off of
+a big package for embedded resource-limited machines.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::cvsbranchdiff::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::cvsbranchdiff::ListItem;
+Wuse 'My::Project';
+Wuse 'project::cvsbranchdiff::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::cvsbranchdiff::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::cvsbranchdiff::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::cvsbranchdiff;
+package project::cvsbranchdiff::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"CVS Branching Utility",
- "priority"=>6,
- "download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/home/lace/bin/cvsbranchdiff?rev=HEAD",
- "summary"=>"CVS addon",
+
+our @ListItem=(
+ "name"=>"cvsbranchdiff",
+ "platform"=>"unixdevel",
+ "priority"=>490,
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "download"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/nethome/home/lace/bin/cvsbranchdiff?rev=HEAD",
+ "summary"=>"CVS Branching Utility",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"bash",
- "description"=>""
- .'<p>During patching of foreign CVS trees you have to regularly import them'
- .' as CVS does not support multiple repositories. There is a problem with'
- .' new or removed files, this simple tool will take care of them.</p>'
+ "description"=><<"HERE",
+<p>During patching of foreign CVS trees you have to regularly import them
+as CVS does not support multiple repositories. There is a problem with
+new or removed files, this simple tool will take care of them.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::cvsutil'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::cvsutil::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::cvsutil::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::cvsutil::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>There already exists package @{[ a_href 'http://www.red-bean.com/cvsutils/','CVS Utilities' ]}
+with similiar features - this utility should be merged into it.
+Pointed out by the courtesy of Jesse Glick.</p>
+HERE
+
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::cvsutil;
+package project::cvsutil::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"CVS General Utility",
- "priority"=>7,
- "download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/home/lace/bin/cvsutil?rev=HEAD",
- "summary"=>"CVS addon",
+
+our @ListItem=(
+ "name"=>"cvsutil",
+ "platform"=>"unixdevel",
+ "priority"=>500,
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "download"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/nethome/home/lace/bin/cvsutil?rev=HEAD",
+ "summary"=>"Clean CVS checkout working files or safely change CVS/Root",
"license"=>"PD",
"maintenance"=>"merge",
"language"=>"Perl",
- "description"=>""
- .'<p>Lists of specified types of files and safe settings of CVSROOT'
- .' for already checkouted package.</p>'
- .' <p>There exists package <a href=\"http://www.red-bean.com/cvsutils/\">CVS Utilities</a>'
- .' doing similiar things and more - this utility should be merged into it.'
- .' Pointed out by the courtesy of Jesse Glick.</p>'
+ "description"=><<"HERE",
+<p>List the specified types of files and safe settings of CVSROOT
+for already checkouted package. As an example of its many applications
+can serve a handy prevention of grepping built files: <span class="quote">
+ grep -w wanted_sym `cvsfiles`
+ </span></p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::d1xnet::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::d1xnet::ListItem;
+Wuse 'My::Project';
+Wuse 'project::d1xnet::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::d1xnet::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::d1xnet::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::d1xnet;
+package project::d1xnet::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"<a href=\"http://d1x.warpcore.org/\">D1X</a> native TCP/IP support patch",
- "priority"=>2,
+
+our @ListItem=(
+ "name"=>a_href('http://d1x.warpcore.org/','D1X').' TCP/IP',
+ "platform"=>"patch",
+ "priority"=>200,
+ "icon"=>"exit03.jpeg",
"download"=>"d1x-tcpip-0.99.1.diff.gz",
- "summary"=>"Network patch",
+ "summary"=>a_href('http://d1x.warpcore.org/','D1X').' native TCP/IP support patch',
"license"=>"PD",
"maintenance"=>"accepted",
"language"=>"C module",
- "description"=>""
- .'<p>No further mess with <a href="ftp://linux.kali.net/outgoing/kalinix/">KaliNix</a>,'
- .' KIX or any other IPX layer convertor. This patch adds true TCP/IP networking'
- .' capability to <a href="http://d1x.warpcore.org/">D1X</a> version 1.30.</p>'
+ "description"=><<"HERE",
+<p>No further mess with @{[ a_href 'ftp://linux.kali.net/outgoing/kalinix/','KaliNix' ]},
+KIX or any other IPX layer convertor. This patch adds true TCP/IP networking
+capability to @{[ a_href 'http://d1x.warpcore.org/','D1X' ]} version 1.30.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::doswatch::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::doswatch::ListItem;
+Wuse 'My::Project';
+Wuse 'project::doswatch::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::doswatch::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::doswatch::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::doswatch;
+package project::doswatch::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"DOSWatcher - DOS File Access Snooper",
- "priority"=>2,
+
+our @ListItem=(
+ "name"=>"DOSWatcher",
+ "platform"=>"dos",
+ "priority"=>390,
"download"=>"doswatch.zip",
- "summary"=>"DOS files snooper",
+ "summary"=>"DOS files access strace(1) equivalent",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"i386 asm",
- "description"=>""
- .'<p>Resident program which displays all the file (and other) DOS function'
- .' calls access on the secondary console. Useful for many failure discoveries'
- .' for weird software packages with broken file/directory access.</p>'
- .' <ul>'
- .' <li>Requires MDA/Hercules secondary adapter to be usable'
- .' <li>Contains also MDABIOS, generic secondary adapter display layer'
- .' <li>Can be run on primary-only VGA (with not much comfort, indeed)'
- .' </ul>'
+ "description"=><<"HERE",
+<p>Resident program which displays all the file (and other) DOS function
+calls access on the secondary console. Useful for many failure discoveries
+for weird software packages with broken file/directory access.</p>
+<ul>
+ <li>MDA/Hercules secondary adapter recommended for DOSWATCH</li>
+ <li>Package contains also MDABIOS - generic secondary adapter driver</li>
+ <li>MDABIOS features DOS commands accessible device "mda$"</li>
+ <li>DOSWATCH can be run on single VGA card (with not much comfort, indeed)</li>
+</ul>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::energie'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::energie::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::energie::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::energie::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::energie' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::energie::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"PHP Web",
+ "platform"=>"web",
+ "priority"=>240,
+ "cvs"=>"www/www.energie.vellum.cz",
+ "link-Example web"=>a_href('http://www.energie.vellum.cz/'),
+ "summary"=>a_href('http://www.php.net/','PHP')." web framework",
+ "license"=>"GPL",
+ "maintenance"=>"obsolete-".a_href('http://www.php.net/','PHP')." is deprecated in favor of "
+ .a_href('http://www.perl.org/','Perl')." - use ".a_href("/project/MyWeb/","My::Web"),
+ "language"=>"PHP",
+ "description"=><<"HERE",
+<p>Each web author has his own web framework reusable for other web developers
+as a generic engine. Here is mine. I am not a fool to expect you would use
+it.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/energie/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::etherealmmse'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::etherealmmse::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::etherealmmse::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::etherealmmse::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::etherealmmse' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::etherealmmse::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://www.ethereal.com/','Ethereal').' MMSE fix',
+ "platform"=>"patch",
+ "priority"=>360,
+ "icon"=>"elogo3d100x100",
+ "summary"=>'Fixed MMS Encapsulation protocol decoding',
+ "link-ChangeLog entry"=>'http://www.ethereal.com/cgi-bin/viewcvs.cgi/ethereal/packet-mmse.c#rev1.15',
+ "download-patch"=>'http://www.ethereal.com/cgi-bin/viewcvs.cgi/ethereal/packet-mmse.c.diff?r2=1.15&r1=1.14&diff_format=u',
+ "license"=>"GPL",
+ "maintenance"=>"accepted",
+ "sponsorship"=>a_href('http://www.atspraha.cz/','Advanced Telecom Services'),
+ "language"=>"C patch",
+ "description"=><<"HERE",
+<p>Fixed a tiny bug in MMS Encapsulation protocol decoding.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/etherealmmse/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::etherealwsp'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::etherealwsp::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::etherealwsp::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::etherealwsp::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::etherealwsp' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::etherealwsp::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://www.ethereal.com/','Ethereal').' WSP patch',
+ "platform"=>"patch",
+ "priority"=>350,
+ "icon"=>"elogo3d100x100",
+ "summary"=>'Enhanced WSP headers decoding',
+ "download-patch"=>'ethereal-2002-08-03-packet-wsp.c-contentlocation.diff',
+ "license"=>"GPL",
+ "maintenance"=>"ignored",
+ "sponsorship"=>a_href('http://www.atspraha.cz/','Advanced Telecom Services'),
+ "language"=>"C patch",
+ "description"=><<"HERE",
+<p>Extended decoded headers for '<i>Content-Location</i>'. This header
+is used for MMS encoding in WSP.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/etherealwsp/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+--- ethereal-2002-08-03/packet-wsp.c-orig Sat Aug 3 01:36:04 2002
++++ ethereal-2002-08-03/packet-wsp.c Mon Aug 5 06:25:00 2002
+@@ -109,6 +109,7 @@
+ static int hf_wsp_header_connection_str = HF_EMPTY;
+ static int hf_wsp_header_cache_control_field_name_str = HF_EMPTY;
+ static int hf_wsp_header_content_length = HF_EMPTY;
++static int hf_wsp_header_content_location = HF_EMPTY;
+ static int hf_wsp_header_age = HF_EMPTY;
+ static int hf_wsp_header_bearer_indication = HF_EMPTY;
+ static int hf_wsp_header_date = HF_EMPTY;
+@@ -1724,7 +1725,13 @@
+ hf_wsp_header_content_length,
+ headerType);
+ break;
+-
++
++ case FN_CONTENT_LOCATION: /* Content-Location */
++ add_string_value_header (tree, header_buff, headerLen,
++ value_buff, valueType, valueLen,
++ hf_wsp_header_content_location, headerType);
++ break;
++
+ case FN_DATE: /* Date */
+ add_date_value_header (tree, header_buff, headerLen,
+ value_buff, valueType, valueLen,
+@@ -4538,6 +4545,13 @@
+ "Content-Length", HFILL
+ }
+ },
++ { &hf_wsp_header_content_location,
++ { "Content-Location",
++ "wsp.header.content_location",
++ FT_STRING, BASE_NONE, NULL, 0x00,
++ "Content-Location", HFILL
++ }
++ },
+ { &hf_wsp_header_date,
+ { "Date",
+ "wsp.header.date",
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::fixhtml::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::fixhtml::ListItem;
+Wuse 'My::Project';
+Wuse 'project::fixhtml::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::fixhtml::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::fixhtml::ListItem::ListItem,
);
+
+print <<"HERE";
+<p>If you download/grab the whole (or its part) of some web site (for example
+by <b>WebCopy</b> tool), you will
+probably want to browse it locally on your computer offline. Unfortunately
+the authors are usually using server-name protocol reference or absolute
+path referration which will broke on your local machine.</p>
+HERE
+
+
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::fixhtml;
+package project::fixhtml::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Converter of HTML Files URLs to Relative",
- "priority"=>3,
+
+our @ListItem=(
+ "name"=>"fixhtml",
+ "platform"=>"unixuser",
+ "trivia"=>1,
+ "priority"=>20,
"download"=>"fixhtml.pl",
- "summary"=>"HTML converter",
+ "summary"=>"Convert HTML files URLs to relative",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"obsolete-".a_href('http://wget.sunsite.dk/','Wget')." option <b>--convert-links</b> does the same.",
"language"=>"Perl",
- "description"=>""
- .'<p>If you download/grab the whole (or its part) of some web site (for example'
- .' by <b>WebCopy</b> tool), you will'
- .' probably want to browse it locally on your computer offline. Unfortunately'
- .' the authors are usually using server-name protocol reference or absolute'
- .' path referration which will broke on your local machine.</p>'
- .' <p>This software is derived from <b>WebCopy</b> and initially it was only'
- .' its extension. I separated it afterwards - you really do not want to do'
- .' the opposite, think twice before trying to integrate it back.</p>'
+ "description"=><<"HERE",
+<p>Program translates the URL references in your downloaded web pages to be relative
+and therefore browsable without Internet access.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::gladewsrc'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::gladewsrc::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::gladewsrc::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::gladewsrc::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>Patch got integrated to <b>glade/main.c</b> revision <b>1.10</b> (although
+modified by Damon Chaplin).</p>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::gladewsrc' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::gladewsrc::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://glade.gnome.org/','Glade').' -w',
+ "platform"=>"patch",
+ "priority"=>310,
+ "icon"=>"glade-icon",
+ "summary"=>'Option <i>--write-source</i> for batch compilation',
+ "download-original patch"=>'glade-0.5.7-writesource.diff',
+ "link-ChangeLog entry"=>'http://cvs.gnome.org/bonsai/cvslog.cgi?file=glade%2Fglade/main.c&root=/cvs/gnome#1.10',
+ "license"=>"GPL",
+ "maintenance"=>"accepted",
+ "sponsorship"=>a_href('http://www.suse.com/','SuSE'),
+ "language"=>"C patch",
+ "description"=><<"HERE",
+<p>Automatically generate {interface,support}.[ch] and other source files
+by @{[ a_href 'http://glade.gnome.org/','Glade' ]}.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/gladewsrc/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+diff -ru -x *.pot -x cat-id-tbl* glade-0.5.7-orig/glade/main.c glade-0.5.7/glade/main.c
+--- glade-0.5.7-orig/glade/main.c Wed Dec 22 17:01:00 1999
++++ glade-0.5.7/glade/main.c Sun Mar 12 20:44:11 2000
+@@ -36,14 +36,31 @@
+ static void parse_command_line (int argc,
+ char *argv[],
+ GladeProjectWindow *project_window);
++static void post_command_line (GladeProjectWindow *project_window);
+ static void usage (void);
+
+
++/* Currently we handle only command-line arguments an XML file to load
++ and request for source build.
++ For Gnome we have to use popt, even though we have no options. */
++
++static gchar *arg_filename=NULL;
++static int arg_write_source=0;
++
+ #ifdef USE_GNOME
+ static poptContext pctx;
+
+ static struct poptOption options[] = {
+ {
++ "writesource",
++ 'w',
++ 0,
++ &arg_write_source,
++ 0,
++ N_("Whether to automatically (and only) build the source files"),
++ NULL
++ },
++ {
+ NULL,
+ '\0',
+ 0,
+@@ -95,6 +112,7 @@
+ glade_show_property_editor ();
+
+ parse_command_line (argc, argv, project_window);
++ post_command_line (project_window);
+ if (current_project == NULL)
+ glade_project_new ();
+
+@@ -104,15 +122,44 @@
+ return 0;
+ }
+
++static void
++post_command_line (GladeProjectWindow *project_window)
++{
++ gchar *directory;
++ GladeProject *project;
++ GladeError *error;
++
++ if (arg_filename)
++ {
++ directory = g_get_current_dir ();
++ arg_filename = glade_util_make_absolute_path (directory, arg_filename);
++ glade_project_window_open_project (project_window, arg_filename);
++ g_free (directory);
++ g_free (arg_filename);
++ }
++ if (arg_write_source)
++ {
++ if (!arg_filename) {
++ fprintf(stderr,_("Project name not specified, requited for \"--writesource\" option.\n"));
++ exit(1);
++ }
++ project = glade_project_view_get_project (GLADE_PROJECT_VIEW (project_window->project_view));
++ g_return_if_fail (project != NULL);
++ error = glade_project_write_source (project);
++ if (error) {
++ fprintf(stderr,_("Error writing source, use GUI to fix it.\n"));
++ glade_error_free (error);
++ exit(1);
++ }
++ exit(0);
++ }
++}
+
+-/* Currently the only command-line argument we handle is an XML file to load.
+- For Gnome we have to use popt, even though we have no options. */
+ #ifdef USE_GNOME
+ static void
+ parse_command_line (int argc, char *argv[],
+ GladeProjectWindow *project_window)
+ {
+- gchar *filename = NULL, *directory;
+ const gchar **args;
+ gint i;
+
+@@ -120,22 +167,13 @@
+
+ for (i = 0; args && args[i]; i++)
+ {
+- if (filename == NULL)
+- filename = (gchar*) args[i];
+- else
+- usage ();
++ if (arg_filename == NULL)
++ arg_filename = (gchar*) args[i];
++ else
++ usage ();
+ }
+
+ poptFreeContext (pctx);
+-
+- if (filename)
+- {
+- directory = g_get_current_dir ();
+- filename = glade_util_make_absolute_path (directory, filename);
+- glade_project_window_open_project (project_window, filename);
+- g_free (directory);
+- g_free (filename);
+- }
+ }
+
+ #else
+@@ -143,28 +181,18 @@
+ parse_command_line (int argc, char *argv[],
+ GladeProjectWindow *project_window)
+ {
+- gchar *filename = NULL, *directory;
+ gint i;
+
+ /* GTK parses argc & argv and sets arguments to NULL if it has used them. */
+ for (i = 1; i < argc; i++)
+ {
+- if (argv[i])
+- {
+- if (filename == NULL)
+- filename = argv[i];
+- else
+- usage ();
+- }
+- }
+-
+- if (filename)
+- {
+- directory = g_get_current_dir ();
+- filename = glade_util_make_absolute_path (directory, filename);
+- glade_project_window_open_project (project_window, filename);
+- g_free (directory);
+- g_free (filename);
++ if (!argv[i]) continue;
++ if (!strcmp(argv[i],"-w") || !strcmp(argv[i],"--writesource"))
++ arg_write_source = 1;
++ else if (arg_filename == NULL)
++ arg_filename = (gchar*) argv[i];
++ else
++ usage ();
+ }
+ }
+ #endif
+@@ -173,6 +201,6 @@
+ static void
+ usage (void)
+ {
+- fprintf (stderr, "Usage: glade [filename]\n");
++ fprintf (stderr, "Usage: glade [-w|--writesource] [<filename>]\n");
+ exit (0);
+ }
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::gsmperl'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::gsmperl::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::gsmperl::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::gsmperl::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::gsmperl' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::gsmperl::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://www.tektonica.com/projects/gsmsms/','GSM::SMS').' patch',
+ "platform"=>"patch",
+ "priority"=>520,
+ "cvs"=>"gsmperl/GSM:lace",
+ "summary"=>'Extension of '.a_href('http://www.tektonica.com/projects/gsmsms/','GSM::SMS')
+ .' for EMS+Alcatel',
+ "license"=>"PD",
+ "maintenance"=>"pending",
+ "sponsorship"=>a_href('http://www.atspraha.cz/','Advanced Telecom Services'),
+ "language"=>"Perl",
+ "description"=><<"HERE",
+<p>Patch extends @{[ a_href 'http://www.tektonica.com/projects/gsmsms/','GSM::SMS' ]}
+package by EMS and Alcatel-proprietary formats. Only picture/animations have
+been implemented now, EMS/Alcatel ringtones are not yet supported.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/gsmperl/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::int13sniff'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::int13sniff::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::int13sniff::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::int13sniff::ListItem::ListItem,
+ );
+
+
+print centerimg "int13sniff-snap","Boot Snapshot";
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::int13sniff' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::int13sniff::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"Int13Sniff",
+ "platform"=>"unixdevel",
+ "priority"=>370,
+ "icon"=>"int13sniff-icon",
+ "summary"=>'Trace PC bootloader disk operations',
+ "download-source"=>'http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/surprise/surprise/misc/int13sniff.S?rev=HEAD',
+ "download-gzip(1)ped floppy image head"=>'int13sniff.bin.gz',
+ "link-parent Surprise project"=>"/project/surprise/",
+ "license"=>"GPL",
+ "maintenance"=>"ready",
+ "sponsorship"=>a_href('http://www.suse.com/','SuSE'),
+ "language"=>"i386 asm",
+ "description"=><<"HERE",
+<p>Developer tool for PC boot loading analysis. Report all sectors being read
+to display, back to its own floppy disk and/or to serial port(s).</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/int13sniff/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::ircon::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::ircon::ListItem;
+Wuse 'My::Project';
+Wuse 'project::ircon::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::ircon::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::ircon::ListItem::ListItem,
);
-print <<'HERE';
+print <<"HERE";
<p>Package consists of:</p>
<ul>
<li>Linux kernel module implementing <code>/dev/ircon</code> device as hardware interface</li>
should be more intelligent and generate the signal itself as PC hardware simply is too slow to keep up strictly
with the original frequencies and so in about 1 of 30 button presses it misses. Due to this the automatic Maspro
tuning software (generating hundreds of button presses) is not usable.</p>
+
+@{[ centerimg
+ ['ircon-parport-small.jpeg','Parallel Port Adapter',"a_href_img"=>'ircon-parport.jpeg'],
+ ['ircon-led-small.jpeg','Remote LED Transmitter',"a_href_img"=>'ircon-led.jpeg']
+ ]}
HERE
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::ircon;
+package project::ircon::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"IRCon - Infrared Remote Control",
- "priority"=>5,
+
+our @ListItem=(
+ "name"=>"IRCon",
+ "platform"=>"unixuser",
+ "priority"=>580,
+ "icon"=>"ircon-icon.jpeg",
"download"=>"ircon.tar.gz",
"link-index of scanned images"=>"ircon-img/",
"download-all scanned images"=>"ircon-img.tar",
- "summary"=>"InfraRed control",
+ "summary"=>"InfraRed remote control hardware",
"license"=>"PD",
- "maintenance"=>"obsolete",
- "reason"=>"Linux kernel driver no longer maintained. Superseded by <a href=\"http://www.lirc.org/\">LIRC</a>",
+ "maintenance"=>"obsolete-Superseded by ".a_href('http://www.lirc.org/','LIRC'),
"language"=>"C, Java",
- "description"=>""
- .'<p>Software package for custom simple hardware connected to PC parallel port'
- .' and transmitting infrared singals to fake real remote TV/video controllers. Hardware'
- .' is also equipped with receiver which is only used during development to grab and decode'
- .' original signals.</p>'
+ "description"=><<"HERE",
+<p>Software package for custom simple hardware connected to PC parallel port
+and transmitting infrared singals to fake real remote TV/video controllers. Hardware
+is also equipped with receiver which is only used during development to grab and decode
+original signals.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::kewensis'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::kewensis::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::kewensis::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::kewensis::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<iframe src="out-list.html" width="90%" height="1500">
+</iframe>
+@{[ vskip "3ex" ]}
+<iframe src="out-edit.html" width="90%" height="500">
+</iframe>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::kewensis' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::kewensis::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"kewensis",
+ "platform"=>"web",
+ "priority"=>120,
+ "cvs"=>"kewensis",
+ "summary"=>a_href('http://www.ipni.org/','Plant Name Index').' custom engine',
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"PHP, Perl",
+ "description"=><<"HERE",
+<p>@{[ a_href 'http://www.ipni.org/','International Plant Name Index' ]}
+provides information about plants in duplicated and unconveniently searchable
+pages. You can download their database and run your own engine on it locally.</p>
+<p>This engine allows you to modify the database to fix names of your own
+plants and it groups synonyms of the same plant.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/kewensis/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs">
+<head><title>Kewensis</title>
+<style type="text/css"><!--
+.cvs-id { font-family: monospace; }
+.error { color: red; background-color: transparent; }
+.quote { font-family: monospace; }
+.nowrap { white-space: nowrap; }
+.centered { text-align: center; }
+body {
+ background-color: black;
+ color: white;
+ }
+:link { color: aqua; background-color: transparent; }
+:visited { color: teal; background-color: transparent; }
+h1,h2 { color: yellow; background-color: transparent; }
+.name { font-weight: bold; }
+.PublAuthor { font-variant: small-caps; }
+.Publication { }
+--></style>
+</head><body>
+<!-- ID=646463-1 --><form action="index.php#id_646463-1" method="POST">
+<table border="0" width="100%"><tr><td align="center"><table border="0"><tr><td>
+<input type="text" name="name" size="25" value="Odontoglossum crispatulum" />
+<input type="text" name="PublAuthor" size="25" value="Reichb.f." /><br />
+<input type="text" name="Publication" size="50" value="in Walp. Ann. vi. 853." /><br /><textarea name="html" rows="6" cols="40"><p></p><p></p><br>
+
+<h4>Original Data</h2>
+Notes: =Gomesa crispa</textarea>
+</td></tr></table><p> </p>
+<input type="submit" name="update" value="Update entry" />
+<input type="hidden" name="id" value="646463-1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</td></tr></table></form><p> </p>
+<hr />
+<table border="0" width="100%">
+<tr><td align="left"><span class="cvs-id">$Id$</span></td><td align="right"><a
+ href="http://validator.w3.org/check?uri=http%3A%2F%2Flocalhost%2Fkewensis%2Findex%2Ephp%3Fedit%3DEdituj%2Bzaznam%26id%3D646463%2D1%26find%3Dodontoglossum%2Bcris%26limit%5Ffrom%3D0%26limit%5Fmax%3D10">Valid XHTML 1.1!</a><a href="http://jigsaw.w3.org/css-validator/validator?warning=2&profile=css2&uri=http%3A%2F%2Flocalhost%2Fkewensis%2Findex%2Ephp%3Fedit%3DEdituj%2Bzaznam%26id%3D646463%2D1%26find%3Dodontoglossum%2Bcris%26limit%5Ffrom%3D0%26limit%5Fmax%3D10">Valid CSS!</a></td></tr>
+</table>
+</body></html>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs">
+<head><title>Kewensis</title>
+<style type="text/css"><!--
+.cvs-id { font-family: monospace; }
+.error { color: red; background-color: transparent; }
+.quote { font-family: monospace; }
+.nowrap { white-space: nowrap; }
+.centered { text-align: center; }
+body {
+ background-color: black;
+ color: white;
+ }
+:link { color: aqua; background-color: transparent; }
+:visited { color: teal; background-color: transparent; }
+h1,h2 { color: yellow; background-color: transparent; }
+.name { font-weight: bold; }
+.PublAuthor { font-variant: small-caps; }
+.Publication { }
+--></style>
+</head><body>
+<form action="index.php" method="GET">
+<h1 align="center"><input type="text" name="find" size="40" value="odontoglossum cris" onkeyup="this.form.elements['limit_from'].value=0;" onchange="this.form.elements['limit_from'].value=0;" onfocus="this.form.elements['limit_from'].value=0;" />
+ <input type="submit" value="Search" />
+</h1><h2 align="center">
+First Group: <input type="text" name="limit_from" size="6" value="0" />
+ Max Groups: <input type="text" name="limit_max" size="6" value="10" />
+</h2></form>
+<hr />
+<table border="0" width="100%"><tr><td align="center">
+<table border="0" width="80%"><tr><td align="left"></td><td align="right"><form action="index.php" method="GET"><input type="submit" value="Next" /><input type="hidden" name="limit_from" value="10" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr></table><hr />
+<table border="0" width="90%"><tr><td align="right"><a name="family_646464-1"><form action="index.php#family_646464-1" method="POST">Group # <input type="text" size="10" readonly="readonly" value="646464-1" /><br /><br />Join to this group: <input type="text" name="move_src" size="21" value="" /> <input type="submit" name="move" value="Join" />
+<input type="hidden" name="move_dst" value="646464-1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form>
+</td></tr></table>
+<a name="id_646464-1"><!-- family_order=0 --><table border="0" width="90%"><tr><td align="left" valign="center"><table border="0"><tr><td><span class="name">Odontoglossum crispum</span>
+<span class="PublAuthor">Lindl.</span></td></tr><tr><td><span class="Publication">in Ann. & Mag. Nat. Hist. Ser. I. xv. (1845) 256.</span></td></tr><tr><td><blockquote><!-- BEGIN import: [646464-1] -->
+<p></p><p></p><br>
+
+<h4>Original Data</h2>
+Notes: N. Granat
+<!-- END import: [646464-1] --></blockquote></td></tr></table></td><td align="right" valign="center"><table border="0"><tr><td align="center"><table border="0"><tr><td><form action="index.php" method="GET"><input type="submit" name="confirm" value="Delete entry" /><input type="hidden" name="id" value="646464-1" />
+<input type="hidden" name="confirming" value="delete" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td><td><form action="index.php" method="GET" target="_blank"><input type="submit" name="confirm" value="(in window)" /><input type="hidden" name="id" value="646464-1" />
+<input type="hidden" name="confirming" value="delete" />
+<input type="hidden" name="winclose" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr><tr><td align="center"><table border="0"><tr><td><form action="index.php" method="GET"><input type="submit" name="edit" value="Edit entry" /><input type="hidden" name="id" value="646464-1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td><td><form action="index.php" method="GET" target="_blank"><input type="submit" name="edit" value="(in window)" /><input type="hidden" name="id" value="646464-1" />
+<input type="hidden" name="winclose" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr></table></td></tr></table></a>
+
+</a>
+<hr />
+<table border="0" width="90%"><tr><td align="right"><a name="family_172210-2"><form action="index.php#family_172210-2" method="POST">Group # <input type="text" size="10" readonly="readonly" value="172210-2" /><br /><br />Join to this group: <input type="text" name="move_src" size="21" value="" /> <input type="submit" name="move" value="Join" />
+<input type="hidden" name="move_dst" value="172210-2" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form>
+</td></tr></table>
+<a name="id_172210-2"><!-- family_order=0 --><table border="0" width="90%"><tr><td align="left" valign="center"><table border="0"><tr><td><span class="name">Odontoglossum alexandrae var. flaveolum</span>
+<span class="PublAuthor">(Rchb.f.) B.S.Williams & T.Moore</span></td></tr><tr><td><span class="Publication">Orchid Album 1: tab. 43. 1882</span></td></tr><tr><td><blockquote><!-- BEGIN import: [172210-2] -->
+<p></p><p></p>
+<h4>Linked Records</h2>
+<p>nomenclatural synonym:Odontoglossum crispum forma flaveolum Rchb.f.</p>
+<!-- END import: [172210-2] --></blockquote></td></tr></table></td><td align="right" valign="center"><table border="0"><tr><td align="center"><table border="0"><tr><td><form action="index.php" method="GET"><input type="submit" name="confirm" value="Delete entry" /><input type="hidden" name="id" value="172210-2" />
+<input type="hidden" name="confirming" value="delete" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td><td><form action="index.php" method="GET" target="_blank"><input type="submit" name="confirm" value="(in window)" /><input type="hidden" name="id" value="172210-2" />
+<input type="hidden" name="confirming" value="delete" />
+<input type="hidden" name="winclose" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr><tr><td align="center"><table border="0"><tr><td><form action="index.php" method="GET"><input type="submit" name="edit" value="Edit entry" /><input type="hidden" name="id" value="172210-2" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td><td><form action="index.php" method="GET" target="_blank"><input type="submit" name="edit" value="(in window)" /><input type="hidden" name="id" value="172210-2" />
+<input type="hidden" name="winclose" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr><tr><td align="center"><table border="0"><tr><td><form action="index.php" method="GET"><input type="submit" name="confirm" value="Isolate entry" /><input type="hidden" name="id" value="172210-2" />
+<input type="hidden" name="confirming" value="isolate" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td><td><form action="index.php" method="GET" target="_blank"><input type="submit" name="confirm" value="(in window)" /><input type="hidden" name="id" value="172210-2" />
+<input type="hidden" name="confirming" value="isolate" />
+<input type="hidden" name="winclose" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr><tr><td align="center"><form action="index.php#family_172210-2" method="POST"><input type="submit" name="reorder" value="vvv down vvv" /><input type="hidden" name="id" value="172210-2" />
+<input type="hidden" name="reorder_by" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr></table></a>
+
+<blockquote><a name="id_1162282-2"><!-- family_order=1 --><table border="0" width="90%"><tr><td align="left" valign="center"><table border="0"><tr><td>•</td><td><span class="name">Odontoglossum crispum forma flaveolum</span>
+<span class="PublAuthor">Rchb.f.</span></td></tr><tr><td></td><td><blockquote><!-- BEGIN import: [1162282-2] -->
+<p></p><p></p>
+<h4>Linked Records</h2>
+<p>nomenclatural synonym(Main Record):Odontoglossum alexandrae var. flaveolum (Rchb.f.) B.S.Williams & T.Moore</p>
+<!-- END import: [1162282-2] --></blockquote></td></tr></table></td><td align="right" valign="center"><table border="0"><tr><td align="center"><form action="index.php#family_172210-2" method="POST"><input type="submit" name="reorder" value="^^^ up ^^^" /><input type="hidden" name="id" value="1162282-2" />
+<input type="hidden" name="reorder_by" value="-1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr><tr><td align="center"><table border="0"><tr><td><form action="index.php" method="GET"><input type="submit" name="confirm" value="Delete entry" /><input type="hidden" name="id" value="1162282-2" />
+<input type="hidden" name="confirming" value="delete" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td><td><form action="index.php" method="GET" target="_blank"><input type="submit" name="confirm" value="(in window)" /><input type="hidden" name="id" value="1162282-2" />
+<input type="hidden" name="confirming" value="delete" />
+<input type="hidden" name="winclose" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr><tr><td align="center"><table border="0"><tr><td><form action="index.php" method="GET"><input type="submit" name="edit" value="Edit entry" /><input type="hidden" name="id" value="1162282-2" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td><td><form action="index.php" method="GET" target="_blank"><input type="submit" name="edit" value="(in window)" /><input type="hidden" name="id" value="1162282-2" />
+<input type="hidden" name="winclose" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr><tr><td align="center"><table border="0"><tr><td><form action="index.php" method="GET"><input type="submit" name="confirm" value="Isolate entry" /><input type="hidden" name="id" value="1162282-2" />
+<input type="hidden" name="confirming" value="isolate" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td><td><form action="index.php" method="GET" target="_blank"><input type="submit" name="confirm" value="(in window)" /><input type="hidden" name="id" value="1162282-2" />
+<input type="hidden" name="confirming" value="isolate" />
+<input type="hidden" name="winclose" value="1" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_from" value="0" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr></table></td></tr></table></a>
+</blockquote>
+</ul>
+</a>
+<hr /><table border="0" width="100%"><tr><td align="center">
+<table border="0" width="80%"><tr><td align="left"></td><td align="right"><form action="index.php" method="GET"><input type="submit" value="Next" /><input type="hidden" name="limit_from" value="10" />
+<input type="hidden" name="find" value="odontoglossum cris" />
+<input type="hidden" name="limit_max" value="10" />
+</form></td></tr></table></td></tr></table>
+<hr />
+<table border="0" width="100%">
+<tr><td align="left"><span class="cvs-id">$Id$</span></td><td align="right"><a
+ href="http://validator.w3.org/check?uri=http%3A%2F%2Flocalhost%2Fkewensis%2Findex%2Ephp%3Ffind%3Dodontoglossum%2Bcris%26limit%5Ffrom%3D0%26limit%5Fmax%3D10">Valid XHTML 1.1!</a><a href="http://jigsaw.w3.org/css-validator/validator?warning=2&profile=css2&uri=http%3A%2F%2Flocalhost%2Fkewensis%2Findex%2Ephp%3Ffind%3Dodontoglossum%2Bcris%26limit%5Ffrom%3D0%26limit%5Fmax%3D10">Valid CSS!</a></td></tr>
+</table>
+</body></html>
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::kix'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::kix::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::kix::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::kix::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>You no longer need to run any foreign binaries on your system and connect
+to remote/slow real @{[ a_href 'http://www.kali.net/','Kali' ]} server.
+You also do not need to sign any papers to get binary-only your
+own Kali server. Unfortunaly you cannot interconnect a game established
+by using KIX with any other software (Kali, native IPX etc.).</p>
+<p>Just compile, run and then add "-kali" option to your
+@{[ a_href 'http://d1x.warpcore.org/','D1X' ]} to get it running. You
+do not need IPX support anywhere (kernel, D1X, ...).</p>
+HERE
+
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::kix;
+package project::kix::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"KIX - KaliNix Replacement",
- "priority"=>4,
+
+our @ListItem=(
+ "name"=>"KIX",
+ "platform"=>"unixuser",
+ "priority"=>110,
"download"=>"kix.c",
- "summary"=>"Network game server",
+ "summary"=>"Free protocol-compatible ".a_href('http://www.kali.net/','Kali').' server equivalent',
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C",
- "description"=>""
- .'<p>Server which can be used on GNU/Linux as a replacement of'
- .' <a href="ftp://linux.kali.net/outgoing/kalinix/">KaliNix</a>'
- .' and thus no need to run some foreign binaries on your system and connection'
- .' to remote/slow real <a href="http://www.kali.net/">Kali</a> server'
- .' and/or subscribing various papers to get (again binary-only) your'
- .' own Kali server. Unfortunaly you cannot interconnect a game established'
- .' by using KIX with any other software (Kali, native IPX etc.).</p>'
- .' <p>Just compile, run and then add "-kali" option to your'
- .' <a href="http://d1x.warpcore.org/">D1X</a> to get it running. You'
- .' do not need IPX support anywhere (kernel, D1X, ...).</p>'
+ "description"=><<"HERE",
+<p>Server used on GNU/Linux as a replacement for proprietary
+@{[ a_href 'ftp://linux.kali.net/outgoing/kalinix/','KaliNix' ]} network game server.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::kware'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::kware::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::kware::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::kware::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>Currently only a few functions are implemented and the code is rather
+an ugly hack than professional solution. I do not expect to ever develop
+it into some clean software, take it as it is, improve it or let it be.</p>
+HERE
+
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::kware;
+package project::kware::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"KernelWare, Linux Kernel Drivers in Userland",
- "priority"=>5,
+
+our @ListItem=(
+ "name"=>"KernelWare",
+ "platform"=>"unixdevel",
+ "priority"=>190,
"download"=>"kware.tar.gz",
- "summary"=>"Drivers debugging",
+ "summary"=>"Linux kernel drivers in userland for their debugging",
"license"=>"PD",
- "maintenance"=>"obsolete",
- "reason"=>"<a href=\"http://user-mode-linux.sourceforge.net/\">The User-mode Linux Kernel</a>",
+ "maintenance"=>"obsolete-"
+ .a_href('http://user-mode-linux.sourceforge.net/','The User-mode Linux Kernel')." is much more useful now.",
"language"=>"C",
- "description"=>""
- .'<p>Do you also find debugging of Linux kernel drivers a nightmare? Would you'
- .' like to be able to run them as normal userland process including fancy'
- .' <code>gdb</code> debugging and <code>SIGSEGV</code>-guarded operation?'
- .' Here you are!</p>'
- .' <p>KernelWare provides stub-style emulation of core kernel functions and'
- .' is able to link with already pre-compiled modules. No special compilation'
- .' flags needed, just link the <code>.o</code> module of the driver with'
- .' KernelWare and you will get standard executable.</p>'
- .' <p>Currently only a few functions are implemented and the code is rather'
- .' an ugly hack than professional solution. I do not expect to ever develop'
- .' it into some clean software, take it as it is, improve it or let it be.</p>'
+ "description"=><<"HERE",
+<p>Do you also find debugging of Linux kernel drivers a nightmare? Would you
+like to be able to run them as normal userland process including fancy
+<code>gdb</code> debugging and <code>SIGSEGV</code>-guarded operation?
+Here you are!</p>
+<p>KernelWare provides stub-style emulation of core kernel functions and
+is able to link with already pre-compiled modules. No special compilation
+flags needed, just link the <code>.o</code> module of the driver with
+KernelWare and you will get standard executable.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::libtool'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::libtool::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::libtool::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::libtool::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>When you include convenience library (<i>.a</i>) containing two conflicting name
+objects (same basename from two different directories) only one of those two
+object files will survive in "<i>.libs/libA.lax/</i>" arena:</p>
+<pre>
+ rm -fr .libs/libA.lax/libB.a
+ mkdir .libs/libA.lax/libB.a
+ (cd .libs/libA.lax/libB.a && ar x /abs/path/to/A/B/.libs/libB.a)
+</pre>
+
+<p>The patch implements automatic renaming of "<i>*.*</i>" to "<i>*-@{[ '$' ]}seqnum.*</i>"
+in such case:</p>
+<pre>
+ libtool: link: warning: object name conflicts; renaming object files
+ libtool: link: warning: to ensure that they will not overwrite
+ (cd .libs/libA.lax/libB.a && ar xN 1 /abs/path/to/A/B/.libs/libB.a 'XconflictX.o' && mv -f 'XconflictX.o' 'XconflictX-1.o')
+ (cd .libs/libA.lax/libB.a && ar xN 2 /abs/path/to/A/B/.libs/libB.a 'XconflictX.o' && mv -f 'XconflictX.o' 'XconflictX-2.o')
+</pre>
+
+<p>Although renaming to a new name may be confusing IMO there is no better option.
+The original (conflicting) name is not left there in any instance to prevent
+misleading confusion of different object file found than expected.</p>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::libtool' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::libtool::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://www.gnu.org/software/libtool/libtool.html','GNU Libtool').' fix',
+ "platform"=>"patch",
+ "priority"=>620,
+ "summary"=>'Handle duplicate object file names',
+ "download-patch"=>'http://savannah.gnu.org/cgi-bin/cvsweb/libtool/ltmain.in.diff?r1=1.320&r2=1.321',
+ "license"=>"GPL",
+ "maintenance"=>"accepted",
+ "language"=>"sh patch",
+ "description"=><<"HERE",
+<p>Patch fixis linking of convenience libraries (<i>.a</i>) containing two
+conflicting name objects.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/libtool/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::libxml2reader'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::libxml2reader::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::libxml2reader::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::libxml2reader::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>Patch got integrated to <b>xmlreader.c</b> revision <b>1.50</b>.</p>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::libxml2reader' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::libxml2reader::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://www.xmlsoft.org/','libxml2').' fix',
+ "platform"=>"patch",
+ "priority"=>365,
+ "summary"=>'Fixed incomplete XML text nodes reading',
+ "link-ChangeLog entry"=>'http://cvs.gnome.org/bonsai/cvslog.cgi?file=libxml2/xmlreader.c&root=/cvs/gnome#1.50',
+ "link-Bugzilla entry"=>'http://bugzilla.gnome.org/show_bug.cgi?id=117702',
+ "download-my original patch"=>'http://bugzilla.gnome.org/showattachment.cgi?attach_id=18386',
+ "license"=>"PD",
+ "maintenance"=>"accepted",
+ "language"=>"C patch",
+ "description"=><<"HERE",
+<p>xmlreader will sometimes return TEXT_NODE with only initial part of the
+real content. The remaining part of such text node is lost.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/libxml2reader/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::line9k::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::line9k::ListItem;
+Wuse 'My::Project';
+Wuse 'project::line9k::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::line9k::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::line9k::ListItem::ListItem,
);
-print <<'HERE';
+
+print <<"HERE";
<p>Scheme for battery charger. Review/fixes by the courtesy of <a href="http://www.pavouk.org/">Pavouk</a>.
Connect serial port (such as <code>/dev/ttyS0</code>) to <code>RS232</code> pins,
your original mobile phone charge to <code>AC</code> pins. <code>PS/2</code> keyboard
fork of <code>+5V</code>/<code>GND</code> pins are required to power this hardware switch.</p>
+
+@{[ centerimg "charger.jpeg","AC Switch Photo" ]}
+@{[ vskip "3ex" ]}
+@{[ centerimg "line9k","AC Switch Scheme" ]}
HERE
-print '<table border="0"><tr><td align="center">'.My::Web::img("line9k.gif","AC Switch Scheme").'</td></tr></table>'."\n";
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::line9k;
+package project::line9k::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Modem / Nokia 9110 GSM data gate",
- "priority"=>7,
- "download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/usr/local/sbin/line9k?rev=HEAD",
- "summary"=>"pppd(8) script, charger scheme",
+
+our @ListItem=(
+ "name"=>"line9k",
+ "platform"=>"unixuser",
+ "priority"=>420,
+ "icon"=>"charger-icon.jpeg",
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "download"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/nethome/bin/line9k?rev=HEAD",
+ "summary"=>"Modem / Nokia 9110 GSM data gateway control, charger",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"bash, hardware",
- "description"=>""
- .'<p>Waits for incoming PPP data connection, authorizes it and answers it.</p>'
- .'<p>Scheme of computer controllde hardware charger for Nokia Communicator 9110 is supplied.'
- .'It keeps the Nokia battery fit by automatically controlled battery charging cycles.</p>'
+ "description"=><<"HERE",
+<p>Daemon waits for incoming PPP data connection, authorizes it and answers it.</p>
+<p>Scheme of computer controllde hardware charger for Nokia Communicator 9110 is supplied.
+It keeps the Nokia battery fit by automatically controlled battery charging cycles.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl \
+ Index.html.pl \
line9k.fig
-noinst_DATA+= \
- index.html \
- line9k.gif
-
-index.html: line9k.gif
-
CLEANFILES+= \
- line9k.fig.bak
+ line9k.fig.bak \
+ line9k.png \
+ line9k.gif
+++ /dev/null
-#! /usr/bin/perl
-#
-# $Id$
-# List of projects Perl template.
-# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; exactly version 2 of June 1991 is required
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
-use strict;
-use warnings;
-
-use lib qw(/home/short/lib/perl5/site_perl/5.6.0/i386-linux /home/short/lib/perl5/site_perl/5.6.0 /home/short/lib/perl5/site_perl/i386-linux /home/short/lib/perl5/site_perl /home/short/lib/perl5/5.6.0/i386-linux /home/short/lib/perl5/5.6.0 /home/short/lib/perl5/i386-linux /home/short/lib/perl5);
-
-use lib "../";
-use My::Web;
-require CGI;
-
-use constant ENTRIES=>"CVS/Entries";
-use constant ENTRIES_LOG=>"CVS/Entries.Log";
-
-
-My::Web->init(
- "title"=>'Project List',
- );
-My::Web->heading();
-
-my $CGI=CGI->new();
-
-print <<'HERE';
-<h1>Project List of <a href="mailto:web-www.jankratochvil.net@jankratochvil.net">Jan Kratochvil</a></h1>
-
-<form action="list.cgi.pl" method="get"><p>
-<select name="description_opt" onchange="this.form.submit();">
-HERE
-print '<option value="0"'.(!$CGI->param("description_opt") ? ' selected="selected"' : '').'>only list</option>'."\n";
-print '<option value="1"'.( $CGI->param("description_opt") ? ' selected="selected"' : '').'>incl. descriptions</option>'."\n";
-print <<'HERE';
-</select>
-<input type="submit" value="Update" />
-</p></form>
-HERE
-
-my %dirs;
-for my $ENTRIES (ENTRIES,ENTRIES_LOG) {
- local *E;
- next if !open E,$ENTRIES;
- while (<E>) {
- chomp;
- do { $dirs{$1}=1; next; } if m#^(?:A )?D/([^/]*)/#;
- next if m#^/([^/]*)/# ;
- next if /^D$/;
- warn "File $ENTRIES contains invalid line \"$_\": $!";
- }
- close E;
- }
-
-my %item;
-for my $dir (keys(%dirs)) {
- require "$dir/ListItem.pm";
- my $item=eval('\%My::Project::'.$dir.'::ListItem');
- do { warn "Broken $dir/List.pm"; next; } if !defined %$item;
- $item{$dir}=$item;
- }
-
-# $col{"name"}{"show"}=1
-# $col{"name"}{"format"}=sub { "<".$_[0].">"; }
-# $col{"name"}{""}="Project name";
-# @col_order
-
-my @row_order=qw(-priority);
-my @col_order=qw(name summary license maintenance language);
-my %col;
-
-sub format_url ($) { return (!$_[0] ? "" : '<a href="'.$_[0].'">X</a>'); }
-
-$col{"name"}{"format"}=sub {
- $_[0]=~s#<a\s[^>]*>([^<]*)</a>#$1#g;
- return "<a href=\"".$_[1]."/\">".$_[0]."</a>";
- };
-
-$col{"license"}{"format"}=sub {
- my %known=(
- "PD"=>"<a href=\"http://www.gnu.org/philosophy/categories.html#PublicDomainSoftware\">PD</a>",
- "GPL"=>"<a href=\"http://www.gnu.org/licenses/gpl.html\">GPL</a>",
- "LGPL"=>"<a href=\"http://www.gnu.org/licenses/lgpl.html\">LGPL</a>",
- );
- return $known{$_[0]} if $known{$_[0]};
- return $_[0];
- };
-
-$col{"online-demo"}{"format"}=\&format_url;
-$col{"download"}{"format"}=\&format_url;
-$col{"name"}{""}="Project Name";
-$col{"summary"}{""}="Abstract";
-$col{"license"}{""}="Copying";
-$col{"maintenance"}{""}="State";
-$col{"language"}{""}="Language";
-
-# Fill in cols not contained in @col_order
-if (0) {
- my %col_order=map(($_=>1),@col_order);
- push @col_order,map({ ($col_order{$_} ? () : $_); } keys(%{{ map(($_=>1),map((keys(%{$item{$_}})),keys(%item)))}}));
- }
-
-print '<table border="1">'."\n";
- print '<tr>';
- for my $col (@col_order) {
- next if defined $col{$col}{"show"} && !$col{$col}{"show"};
- print '<th>'.($col{$col}{""} || "[$col]").'</th>';
- }
- print '</tr>'."\n";
- my @rows_ordered=sort {
- for my $order_by (@row_order,"name") {
- my $order_by=$order_by;
- my $minus=($order_by=~s/^(-)//)[0];
- my $r=($item{$a}{$order_by} cmp $item{$b}{$order_by});
- $r=-$r if $minus;
- return $r if $r;
- }
- return 0;
- } keys(%item);
- for my $row (@rows_ordered) {
- print '<tr>';
- for my $col (@col_order) {
- next if defined $col{$col}{"show"} && !$col{$col}{"show"};
- print '<td>';
- if (!$col{$col}{"format"}) {
- print(($item{$row}{$col} || ""));
- }
- else {
- print(&{$col{$col}{"format"}}($item{$row}{$col},$row));
- }
- print '</td>';
- }
- print '</tr>'."\n";
- if ($CGI->param("description_opt")) {
- print '<tr><td style="border: none;"></td>';
- print '<td colspan="'.(scalar(@col_order)-1).'"><blockquote>'.$item{$row}{"description"}.'</blockquote></td>';
- print '</tr>'."\n";
- print '<tr><td style="border: none;" colspan="'.scalar(@col_order).'"> </td></tr>'."\n";
- }
- }
-print '</table>'."\n";
-
-My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::lynxilla'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::lynxilla::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::lynxilla::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::lynxilla::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::lynxilla' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::lynxilla::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"lynxilla",
+ "platform"=>"web",
+ "trivia"=>1,
+ "priority"=>460,
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "download"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/nethome/.userContent.css?rev=HEAD",
+ "summary"=>a_href('http://lynx.isc.org/','Lynx').' look&feel with '
+ .a_href('http://www.mozilla.org/','Mozilla').' web compatibility',
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"CSS",
+ "description"=><<"HERE",
+<p>@{[ a_href 'http://lynx.isc.org/','Lynx' ]} brings unified colors and fonts of all web pages.
+Unfortunately it is not the one of those two browsers respected by broken websites.
+To get back the unified look and feel of all the web pages while retaining the web compatibility
+you can override CSS settings of your @{[ a_href 'http://www.mozilla.org/','Mozilla' ]} by placing
+@{[ a_href 'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/nethome/.userContent.css?rev=HEAD",
+ 'userContent.css' ]}
+as your local file: @{[ '$HOME/.mozilla/$USER/*/chrome/userContent.css' ]}</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/lynxilla/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::mdsms'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::mdsms::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::mdsms::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::mdsms::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>This software should be general-UNIX compatible. Please wait a minute when
+you run it, under various UNIXes it may take some time to finish.</p>
+<p><b>GSM network codes: </b>GSM network code needs to be given as parameter during
+sending of operator logo. Nice list of the codes you will find
+@{[ a_href 'http://kbs.cs.tu-berlin.de/~jutta/gsm/gsm-list.html','here' ]}.</p>
+HERE
+
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::mdsms;
+package project::mdsms::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Mobile Device SMS Tool",
- "priority"=>8,
- "download-sources .tar.gz"=>"mdsms-1.5.2.tar.gz",
- "download-sources .tar.Z"=>"mdsms-1.5.2.tar.Z",
- "download-i386 RPM package"=>"mdsms-1.5.2-0.i386.rpm",
- "download-sources RPM package"=>"mdsms-1.5.2-0.src.rpm",
+
+our @ListItem=(
+ "name"=>"mdsms",
+ "platform"=>"unixuser",
+ "priority"=>600,
+ "icon"=>"siemens_m20t-icon.jpeg",
+ "download-i386 RPM package"=>"dist/mdsms-1.5.3-0.i386.rpm",
+ "download-sources RPM package"=>"dist/mdsms-1.5.3-0.src.rpm",
+ "download-sources .tar.gz"=>"dist/mdsms-1.5.3.tar.gz",
+ "download-sources .tar.Z"=>"dist/mdsms-1.5.3.tar.Z",
"download-logos from KESSLER Wireless Design"=>"http://www.kessler-design.com/wireless/samples.php3",
- "link-View CVS"=>"http://cvs.jankratochvil.net/viewcvs/mdsms/",
- "summary"=>"Mobile communication",
+ "cvs"=>"mdsms",
+ "link-".a_href('http://freshmeat.net/','Freshmeat')=>
+ a_href('http://freshmeat.net/projects/mdsms/','Mobile Device SMS tool'),
+ "summary"=>"Mobile Device SMS Tool",
"license"=>"GPL",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
+ "sponsorship"=>join(", ",
+ a_href('http://www.tencom.cz/','TENcom Trade')
+ .'/'.a_href('http://www.sme.cz/default.asp?lng=en&ver=html','SME'),
+ a_href('http://www.readynote.com/','ReadyNote'),
+ a_href('http://www.atspraha.cz/','Advanced Telecom Services')),
"language"=>"C",
- "description"=>""
- .'<p>Sends NOL or NGG files as operator logo or group graphics through'
- .' <a href="http://www.nokia.com/">Nokia</a> <a href="http://www.communicator.org/">Communicator</a>'
- .' <b>9110</b> (9000/9000i is definitively <b>not</b> compatible). Usually you need'
- .' to have either infra-red port in your computer or special FBUS cable to be able'
- .' to use conventional logo-uploading tools (<a href="http://www.gnokii.org/">GNokii</a>'
- .' or one from <a href="http://www.kessler-design.com/wireless/operatorlogo.php3">KESSLER'
- .' Wireless Design</a>). This program uses only standard modem cable and integrated'
- .' FaxModem capability of 9110.</p>'
- .' <p>This software should be general-UNIX compatible. Please wait a minute when'
- .' you run it, under various UNIXes it may take some time to finish.</p>'
- .' <p><b>GSM network codes: </b>GSM network code needs to be given as parameter during'
- .' sending of operator logo. Nice list of the codes you will find'
- .' <a href="http://kbs.cs.tu-berlin.de/~jutta/gsm/gsm-list.html">here</a>.</p>'
+ "description"=><<"HERE",
+<p>Program sends NOL or NGG files as Nokia operator logo or group graphics through
+@{[ a_href 'http://www.nokia.com/','Nokia' ]} @{[ a_href 'http://www.communicator.org/','Communicator' ]}
+9110 (@{[ a_href 'http://www.nokia.com/phones/9000i','9000/9000i' ]}
+is not compatible). Usually you need
+to have either infra-red port in your computer or special FBUS cable to be able
+to use conventional logo-uploading tools (such as @{[ a_href 'http://www.gnokii.org/','gnokii' ]}).
+This program uses only standard modem cable and the integrated
+FaxModem capability of 9110.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::middleman'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::middleman::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::middleman::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::middleman::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::middleman' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::middleman::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://middle-man.sourceforge.net/','Middleman').' port',
+ "platform"=>"unixuser",
+ "priority"=>60,
+ "cvs"=>"middleman:lace",
+ "summary"=>'HTTP proxy ported to '
+ .a_href('http://www.freebsd.org/','FreeBSD'),
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "sponsorship"=>a_href('http://www.jklabs.cz/','JKLabs'),
+ "language"=>"C patch",
+ "description"=><<"HERE",
+HTTP proxy server @{[ a_href 'http://middle-man.sourceforge.net/','Middleman' ]}
+capable of returned data mangling has been ported to
+@{[ a_href 'http://www.freebsd.org/','FreeBSD' ]}.
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/middleman/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::mod_auth_tacacs::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::mod_auth_tacacs::ListItem;
+Wuse 'My::Project';
+Wuse 'project::mod_auth_tacacs::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::mod_auth_tacacs::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::mod_auth_tacacs::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::mod_auth_tacacs;
+package project::mod_auth_tacacs::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"<a href=\"http://sourceforge.net/projects/mod-auth-tacacs/\">mod_auth_tacacs</a> TACACS+ test client",
- "priority"=>2,
+
+our @ListItem=(
+ "name"=>a_href('http://sourceforge.net/projects/mod-auth-tacacs/','mod_auth_tacacs').' client',
+ "platform"=>"patch",
+ "priority"=>260,
+ "icon"=>"cisco-icon.jpeg",
"download"=>"mod_auth_tacacs-2.0.2-gts1-checkout.diff.gz",
"link-mod_auth_tacacs homepage"=>"http://sourceforge.net/projects/mod-auth-tacacs/",
- "summary"=>"Network server security",
+ "summary"=>a_href('http://www.cisco.com/warp/public/614/7.html','Cisco TACACS+')
+ .' testing/debugging client for '
+ .a_href('http://sourceforge.net/projects/mod-auth-tacacs/','mod_auth_tacacs'),
"license"=>"PD",
"maintenance"=>"accepted",
"language"=>"C patch",
- "description"=>""
- .'Patch implements: command-line client, <code>dropped Makefile.in</code>'
- .' in favor of <code>Makefile.am</code>, <code>--with-apache</code> works now'
- .' (whole <code>configure.in</code> rewritten)'
+ "description"=><<"HERE",
+Patch implements: command-line client, <code>dropped Makefile.in</code>
+in favor of <code>Makefile.am</code>, <code>--with-apache</code> works now
+(whole <code>configure.in</code> rewritten)
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::mot2as::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::mot2as::ListItem;
+Wuse 'My::Project';
+Wuse 'project::mot2as::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::mot2as::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::mot2as::ListItem::ListItem,
);
+
+print <<"HERE";
+<p>Specifically it will care about: <code>equ</code> operation, <code>dc.b</code> strings,
+<code>;</code> comments, <code>@{[ '$' ]}</code> for hex-radix, <code>%</code> for bin-radix,
+local labels, <code>:</code> for label termination.</p>
+HERE
+
+
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::mot2as;
+package project::mot2as::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Motorola to AT&T/GNU Assembler Syntax Converter",
- "priority"=>5,
+
+our @ListItem=(
+ "name"=>"mot2as",
+ "platform"=>"unixdevel",
+ "priority"=>50,
"download"=>"mot2as.c",
- "summary"=>"Asm syntax converter",
+ "summary"=>'Convert Motorola to AT&T/GNU assembler syntax',
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C",
- "sponsorship"=>"<a href=\"http://www.princip.cz/\">Princip, a.s.</a>",
- "description"=>""
- .'<p>Do you need to compile under UNIX assembly sources for Motorola 68k family'
- .' of processors? You have probably already found out that original Motorola'
- .' syntax is not suitable for GNU assembler which uses a bit different (AT&T'
- .' style) syntax. Using this very simple program you can convert between these two.</p>'
- .' <p>Specifically it will care about: <code>equ</code> operation, <code>dc.b</code> strings,'
- .' <code>;</code> comments, <code>$</code> for hex-radix, <code>%</code> for bin-radix,'
- .' local labels, <code>:</code> for label termination.</p>'
+ "sponsorship"=>a_href('http://www.princip.cz/','Princip, a.s.'),
+ "description"=><<"HERE",
+<p>Do you need to compile under UNIX assembly sources for Motorola 68k family
+of processors? You have probably already found out that original Motorola
+syntax is not suitable for GNU assembler which uses a bit different (AT&T
+style) syntax. Using this very simple program you can convert between these two.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::muttsort'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::muttsort::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::muttsort::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::muttsort::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>Patch got integrated to <b>thread.c</b> revision <b>2.16</b>.</p>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::muttsort' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::muttsort::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://www.mutt.org/','Mutt').' speedup',
+ "platform"=>"patch",
+ "priority"=>430,
+ "icon"=>"mutt_button",
+ "summary"=>'Mailbox reading phase acceleration',
+ "download-patch"=>'mutt-sort.diff',
+ "license"=>"GPL",
+ "maintenance"=>"accepted",
+ "language"=>"C patch",
+ "description"=><<"HERE",
+<p>Mutt is pretty slow when opening a mailbox. Phase "Reading..." is hard to
+speedup but "Sorting mailbox..." was rewritten from <i>(n^2)</i> complexity
+to <i>(n*log(n))</i>.
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/muttsort/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+Index: thread.c
+===================================================================
+RCS file: /home/roessler/cvs/mutt/thread.c,v
+retrieving revision 2.15
+diff -I! -ICVS -u -r2.15 thread.c
+--- thread.c 2001/04/25 22:08:41 2.15
++++ thread.c 2001/07/26 02:18:11
+@@ -535,23 +535,48 @@
+
+ HEADER *mutt_sort_subthreads (HEADER *hdr, sort_t *func)
+ {
+- HEADER *top = NULL;
+- HEADER *t;
++ static HEADER **array = NULL;
++ static unsigned array_size = 0, array_alloc = 0;
++ unsigned array_alloc_base;
++ unsigned items, item;
+
+- while (hdr)
++ if (!func || !hdr)
++ return hdr;
++
++ array_alloc_base = array_alloc;
++ for (item = array_alloc_base; hdr; hdr = hdr->next)
+ {
+- t = hdr;
+- hdr = hdr->next;
+- insert_message (&top, t, func);
+- if (t->child)
+- t->child = mutt_sort_subthreads (t->child, func);
++ if (item >= array_size)
++ {
++ array_size = 2 * MAX(array_size, 0x100);
++ safe_realloc ((void **) &array, array_size * sizeof (*array));
++ }
++ array[item++] = hdr;
++ if (hdr->child)
++ {
++ array_alloc = item;
++ hdr->child = mutt_sort_subthreads (hdr->child, func);
++ }
+ }
+- return top;
++ array_alloc = array_alloc_base;
++
++ items = item - array_alloc_base;
++ qsort ((void *) (array + array_alloc_base), items, sizeof (*array), func);
++
++ array[array_alloc_base ]->prev = NULL;
++ array[array_alloc_base + items-1]->next = NULL;
++
++ for (item = array_alloc_base; item < array_alloc_base + items-1; item++)
++ {
++ array[item ]->next = array[item+1];
++ array[item+1]->prev = array[item ];
++ }
++
++ return array[array_alloc_base];
+ }
+
+ void mutt_sort_threads (CONTEXT *ctx, int init)
+ {
+- sort_t *usefunc = NULL;
+ HEADER *tmp, *CUR;
+ int i, oldsort;
+
+@@ -562,10 +587,6 @@
+ oldsort = Sort;
+ Sort = SortAux;
+
+- /* if the SORT_LAST bit is set, we save sorting for later */
+- if (!(Sort & SORT_LAST))
+- usefunc = mutt_get_sort_func (Sort);
+-
+ for (i = 0; i < ctx->msgcount; i++)
+ {
+ CUR = ctx->hdrs[i];
+@@ -580,7 +601,7 @@
+ CUR->subject_changed = 1;
+ unlink_message (&CUR->parent->child, CUR);
+ CUR->parent = NULL;
+- insert_message (&ctx->tree, CUR, usefunc);
++ insert_message (&ctx->tree, CUR, NULL);
+ }
+ else if (!CUR->threaded)
+ {
+@@ -603,15 +624,19 @@
+ * parent) during the initial threading.
+ */
+ if (CUR->env->message_id)
+- move_descendants (tmp ? &tmp->child : &ctx->tree, CUR, usefunc);
++ move_descendants (tmp ? &tmp->child : &ctx->tree, CUR, NULL);
+ }
+- insert_message (tmp ? &tmp->child : &ctx->tree, CUR, usefunc);
++ insert_message (tmp ? &tmp->child : &ctx->tree, CUR, NULL);
+ CUR->threaded = 1;
+ }
+ }
+
+ if (!option (OPTSTRICTTHREADS))
+- pseudo_threads (ctx, usefunc);
++ pseudo_threads (ctx, NULL);
++
++ /* if the SORT_LAST bit is not set, sort the whole tree now */
++ if (!(Sort & SORT_LAST))
++ ctx->tree = mutt_sort_subthreads (ctx->tree, mutt_get_sort_func (Sort));
+
+ /* now that the whole tree is put together, we can sort by last-* */
+ if (Sort & SORT_LAST)
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::netstat::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::netstat::ListItem;
+Wuse 'My::Project';
+Wuse 'project::netstat::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::netstat::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::netstat::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::netstat;
+package project::netstat::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Program name display for <a href=\"http://www.inka.de/sites/lina/linux/NetTools/\">net-tools-1.50</a>/netstat",
- "priority"=>3,
+
+our @ListItem=(
+ "name"=>"netstat -p",
+ "platform"=>"patch",
+ "priority"=>400,
"download"=>"net-tools-1.50-progname.diff.gz",
- "summary"=>"Network tool enhancement",
+ "summary"=>"Program name display for ".a_href('http://www.inka.de/sites/lina/linux/NetTools/','net-tools-1.50').'/netstat',
"license"=>"PD",
"maintenance"=>"accepted",
"language"=>"C patch",
- "description"=>""
- .'<p>After answering several questions on the mailing lists and several from'
- .' my friends personally, I decided that there is missing some tool for GNU/Linux'
- .' which would display PID (or simply the process) of the owner of some socket,'
- .' either listening or communicating.</p>'
+ "description"=><<"HERE",
+<p>After answering several questions on the mailing lists and several from
+my friends personally, I decided that there is missing some tool for GNU/Linux
+which would display PID (or simply the process) of the owner of some socket,
+either listening or communicating.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::oslik::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::oslik::ListItem;
+Wuse 'My::Project';
+Wuse 'project::oslik::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::oslik::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::oslik::ListItem::ListItem,
);
print <<"HERE";
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::oslik;
+package project::oslik::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Logical Puzzle in Prolog",
- "priority"=>5,
+
+our @ListItem=(
+ "name"=>"oslik",
+ "platform"=>"unixdevel",
+ "trivia"=>1,
+ "priority"=>70,
"download"=>"oslik/oslik.zip",
- "summary"=>"Prolog example",
+ "summary"=>"Prolog example solving logical puzzle Oslik",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"Prolog",
- "description"=>""
- .'<p>This is no game, just solution of one specific mathematical problem'
- .' consisting of simple state search. Software is written equivalentnly'
- .' both in <strong>C</strong> and <strong>Prolog</strong> for comparation.</p>'
+ "description"=><<"HERE",
+<p>Solution calculator of a logical game / mathematical problem
+consisting of simple state search. Software is written equivalentnly
+both in <strong>C</strong> and <strong>Prolog</strong> for comparation.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::patchd2::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::patchd2::ListItem;
+Wuse 'My::Project';
+Wuse 'project::patchd2::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::patchd2::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::patchd2::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::patchd2;
+package project::patchd2::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Patch <a href=\"http://www.descent2.com/\">Descent 2</a> to Avoid CD-ROM",
- "priority"=>2,
+
+our @ListItem=(
+ "name"=>a_href('http://www.descent2.com/','Descent 2').' no-CD',
+ "platform"=>"dos",
+ "priority"=>160,
+ "icon"=>"d2-icon.jpeg",
"download"=>"patchd2.zip",
- "summary"=>"Patch for no-CD",
+ "summary"=>a_href('http://www.descent2.com/','Descent 2').' patch to avoid CD-ROM requirement',
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"i386 asm patch",
- "description"=>""
- .'<p>Use this <a href="http://www.calderathin.com/products/drdos/">DOS</a>'
- .' program to patch/unpatch Descent 2 to not require CD-ROM to'
- .' run. I need this as I have no CD-ROM installed in my computer. The exact'
- .' bytes sequences needed was investigated by some-else hacker.</p>'
+ "description"=><<"HERE",
+<p>Use this @{[ a_href 'http://www.calderathin.com/products/drdos/','DOS' ]}
+program to patch/unpatch Descent 2 to not require CD-ROM to run.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::pgsqlsubstr'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::pgsqlsubstr::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::pgsqlsubstr::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::pgsqlsubstr::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>Although the patch is noted by Thomas G. Lockhart he is referring in me in
+that text, believe me. :-)</p>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::pgsqlsubstr' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::pgsqlsubstr::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://www.postgresql.org/','PostgreSQL').'-6.3 fix',
+ "platform"=>"patch",
+ "priority"=>290,
+ "icon"=>"postgresql",
+ "summary"=>'Fixed substr() and substring() SQL functions',
+ "download-patch"=>'http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/backend/utils/adt/varlena.c.diff?r1=1.31&r2=1.32&f=u',
+ "link-ChangeLog entry"=>'http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/backend/utils/adt/varlena.c#rev1.32',
+ "license"=>"PD",
+ "maintenance"=>"accepted",
+ "language"=>"C patch",
+ "description"=><<"HERE",
+<p>Fix off-by-one in the embedded substr() and substring() functions of
+PostgreSQL engine.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/pgsqlsubstr/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::phphash'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::phphash::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::phphash::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::phphash::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::phphash' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::phphash::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>a_href('http://www.php.net/','PHP').'-3.0b6 fix',
+ "platform"=>"patch",
+ "priority"=>300,
+ "icon"=>"php",
+ "summary"=>'Avoid excessive use of memory for hashes',
+ "download-patch"=>'http://cvs.php.net/diff.php/php3/Attic/hash.c?r1=1.76&r2=1.77&ty=u',
+ "license"=>"PD",
+ "maintenance"=>"accepted",
+ "language"=>"C patch",
+ "description"=><<"HERE",
+<p>Fixed a tiny bug in the hash initialization which caused excessive use of
+memory. Fixed hash items deletion emulation by copying the hash except the item
+being deleted.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/phphash/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::pipebuf::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::pipebuf::ListItem;
+Wuse 'My::Project';
+Wuse 'project::pipebuf::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::pipebuf::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::pipebuf::ListItem::ListItem,
);
+
+print <<"HERE";
+<p>Progarm is implemented as two processes (no threads - no pthread libraries
+needed, only IPC communication used). Features custom buffer sizes, prefill
+(start writing of the first byte only after the WHOLE buffer has beel filled
+up) and warning messages when buffer is getting emptied.</p>
+HERE
+
+
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::pipebuf;
+package project::pipebuf::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"PipeBuf - Data Buffering Tool",
- "priority"=>8,
+
+our @ListItem=(
+ "name"=>"pipebuf",
+ "platform"=>"unixuser",
+ "priority"=>440,
"download"=>"pipebuf.c",
- "summary"=>"Pipe buffer",
+ "summary"=>"UNIX pipe realtime buffering",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C",
- "description"=>""
- .'<p>You can do a buffering of realtime data such as audio stream by inserting this program'
- .' with traditional "UNIX filter" behaviour. It reads as fast as possible into'
- .' its cache and also in the same time writes as fast as possible to the output. In fact'
- .' it is implemented as two processes (no threads - no pthread libraries needed, only IPC'
- .' communication used). Features custom buffer sizes, prefill (start writing of the first byte'
- .' only after the WHOLE buffer has beel filled up) and warning messages when buffer is getting'
- .' emptied.</p>'
+ "description"=><<"HERE",
+<p>You can buffer realtime data such as audio stream by inserting this program
+with traditional "UNIX filter" behaviour. It reads as fast as possible into
+its cache and also in the same time writes as fast as possible to the output.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::postget'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::postget::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::postget::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::postget::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+
+<ul>
+ <li>
+ <p>Store the
+ @{[ a_href $W->{"project_viewcvs"}."*checkout*/nethome/WWW/cgi-bin/postget.php?rev=HEAD",'downloaded file' ]}
+ as <b>/home/lace/WWW/cgi-bin/postget.php</b>.</p>
+ </li>
+ <li>
+ <p>Edit path to your <b>priv</b> directory in the stored
+ <b>@{[ a_href $W->{"project_viewcvs"}."*checkout*/nethome/WWW/cgi-bin/postget.php?rev=HEAD",'postget.php' ]}</b>.
+ </li>
+ <li>
+ <p>Bookmark the following @{[ a_href 'http://freshmeat.net/','Freshmeat' ]} URL:
+ @{[ CGI::escapeHTML(q{http://localhost/~lace/cgi-bin/postget.php?_postget=http%3A%2F%2Ffreshmeat.net%2Flogin%2F&url=%2F&username=YOUR_USERNAME&password=_priv_postget.freshmeat.net.pwd&persistent=1}) ]}
+ </p>
+ <p>(Replace <b>YOUR_USERNAME</b> with your @{[ a_href 'http://freshmeat.net/','Freshmeat' ]}
+ account name.</p>
+ </li>
+ <li>
+ <p>Store your @{[ a_href 'http://freshmeat.net/','Freshmeat' ]} account password
+ to: <b>~/priv/postget.freshmeat.net.pwd</b></p>
+ <p>Protect it by '<i>chgrp nobody postget.freshmeat.net.pwd</i>' and
+ '<i>chmod 640 postget.freshmeat.net.pwd</i>' (it is not secure as long as
+ someone else can supply pages served by the same
+ @{[ a_href 'http://httpd.apache.org/','Apache webserver' ]}.</p>
+ </li>
+</ul>
+
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::postget' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::postget::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"postget",
+ "platform"=>"web",
+ "trivia"=>1,
+ "priority"=>380,
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "download"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/nethome/WWW/cgi-bin/postget.php?rev=HEAD",
+ "summary"=>"Bookmark ".a_href('http://www.w3.org/TR/html4/interact/forms.html#h-17.13.1','POST')
+ .' forms, hide passwords',
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"PHP",
+ "description"=><<"HERE",
+<p>You cannot bookmark pre-filled forms to your browser bookmarks. Although
+browsers support storing of form data you still have to load the form page and
+click its submit button. This script will allow you to:</p>
+<ul>
+ <li>Store all @{[ a_href 'http://www.w3.org/TR/html4/interact/forms.html#h-17.13.1','POST' ]}ed
+ form data as @{[ a_href 'http://www.w3.org/TR/html4/interact/forms.html#h-17.13.1','GET' ]} data
+ (after '<b>?</b>' URL delimiter).</li>
+ <li>Replace all sensitive passwords by indirect references to your <b>priv</b> directory
+ to allow you to make your bookmark file itself public.</li>
+</ul>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/postget/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::ppp9k::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::ppp9k::ListItem;
+Wuse 'My::Project';
+Wuse 'project::ppp9k::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::ppp9k::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::ppp9k::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::ppp9k;
+package project::ppp9k::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Nokia Communicator Leased Line",
- "priority"=>6,
- "download"=>"http://cvs.jankratochvil.net/viewcvs/*checkout*/nethome/home/lace/bin/ppp9k?rev=HEAD",
- "summary"=>"Communication script",
+
+our @ListItem=(
+ "name"=>"ppp9k",
+ "platform"=>"unixuser",
+ "priority"=>410,
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "download"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/nethome/home/lace/bin/ppp9k?rev=HEAD",
+ "summary"=>"Connect device (Nokia Communicator) by serial PPP to your LAN",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"bash",
- "description"=>""
- .'<p>Script will connect Nokia Communicator <a href="http://www.nokia.com/phones/9000i">9000i</a>'
- .' or <a href="http://www.nokia.com/phones/9110i">9110i</a> through'
- .' your local GNU/Linux PC Internet connection. You will also need'
- .' Nokia Communicator utility <a href="http://www.mgroeber.de/nokia.htm">Advanced PPP Settings</a>.'
+ "description"=><<"HERE",
+<p>Script will connect Nokia Communicator @{[ a_href 'http://www.nokia.com/phones/9000i','9000i' ]}
+or @{[ a_href 'http://www.nokia.com/phones/9110i','9110i' ]} through
+your local GNU/Linux PC Internet connection. You will also need
+Nokia Communicator utility @{[ a_href 'http://www.mgroeber.de/nokia.htm','Advanced PPP Settings' ]}.
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::redirector_ad::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::redirector_ad::ListItem;
+Wuse 'My::Project';
+Wuse 'project::redirector_ad::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::redirector_ad::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::redirector_ad::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::redirector_ad;
+package project::redirector_ad::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Banner Killer as 'squid redirector'",
- "priority"=>7,
- "link-CVS download"=>"http://cvs.jankratochvil.net/viewcvs/redirector-ad/redirector-ad.tar.gz?tarball=1",
- "summary"=>"Banner killer",
+
+our @ListItem=(
+ "name"=>"redirector-ad",
+ "platform"=>"unixuser",
+ "priority"=>340,
+ "icon"=>"cnet-icon",
+ "cvs"=>"redirector-ad",
+ "summary"=>'Banner killer as '.a_href('http://www.squid-cache.org/','Squid').' redirector filter',
+ # FIXME: 'http://cvs.jankratochvil.net/viewcvs/' -> $W->{"project_viewcvs"}
+ "link-README"=>'http://cvs.jankratochvil.net/viewcvs/'."*checkout*/redirector-ad/README?rev=HEAD",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"Perl",
- "description"=>""
- .'<p>Scripts that will simply discard graphical images referenced'
- .' from web pages. Unlike other such packages it:</p>'
- .' <ul>'
- .' <li>Does not need separate administration of another daemon</li>'
- .' <li>Does not do any page contents filtering (popups will still pass through!)</li>'
- .' </ul>'
+ "description"=><<"HERE",
+<p>Scripts discarding specified graphical images (read 'ads') referenced
+from web pages. Unlike zillions of other such packages there
+is no need for separate administration of another daemon.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::smbfs'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::smbfs::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::smbfs::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::smbfs::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>Simple patch to increase virtual block size of SMB filesytem in Linux
+kernel. It improved tranfer rate of <code>cp</code> command almost
+by a factor of <strong>2</strong> (approx. 700KB -> 1300KB or something
+like about it) in the local conditions. Now <code>cp</code> should be as fast
+as <code>cat</code> redirected across networked filesystems.</p>
+<p>Unfortunately the blocksize causes different (4 times smaller) sizes
+reported by <code>du</code> command as it measures it in <i>blocks</i>
+and not in <i>kilobytes</i> as some people think.</p>
+HERE
+
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::smbfs;
+package project::smbfs::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"SMB Kernel Filesystem Acceleration",
- "priority"=>6,
+
+our @ListItem=(
+ "name"=>"smbfs patch",
+ "platform"=>"unixuser",
+ "trivia"=>1,
+ "priority"=>80,
"download"=>"smbfs-2.1.132-blocksize.diff",
- "summary"=>"SMB acceleration patch",
+ "summary"=>'Linux kernel smbfs acceleration patch',
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C patch",
- "description"=>""
- .'<p>Simple patch to increase virtual block size of SMB filesytem in Linux'
- .' kernel. For me it improved tranfer rate of <code>cp</code> command almost'
- .' by a factor of <strong>2</strong> (approx. 700KB -> 1300KB or something'
- .' like about it). Now <code>cp</code> should be as fast as <code>cat</code>'
- .' redirected across networked filesystems.</p>'
- .' <p>Unfortunately the blocksize causes different (4 times smaller) sizes'
- .' reported by <code>du</code> command as it measures it in <i>blocks</i>'
- .' and not in <i>kilobytes</i> as some people think.</p>'
-
+ "description"=><<"HERE",
+<p>Accelerate twice the copying transfer rate for client GNU/Linux from SMB
+server share (Microsoft Windows).
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
+++ /dev/null
-#! /usr/bin/perl
-#
-# $Id$
-# Main page of 'My::Project::smbfs'
-# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; exactly version 2 of June 1991 is required
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
-use strict;
-use warnings;
-
-use My::Web;
-use project::smbfs::ListItem;
-
-
-My::Web->init_project(
- "ListItem"=>\%My::Project::smbfs::ListItem,
- );
-
-My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::sshpatch::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::sshpatch::ListItem;
+Wuse 'My::Project';
+Wuse 'project::sshpatch::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::sshpatch::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::sshpatch::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::sshpatch;
+package project::sshpatch::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"SSH-1 patch for <i>KeepAliveData</i> and <i>OnDemandForward</i>",
- "priority"=>7,
+
+our @ListItem=(
+ "name"=>"SSH-1 patch",
+ "platform"=>"unixuser",
+ "priority"=>180,
"download"=>"ssh-1.2.30-kadata+odforw.tar.gz",
"download-SSH-1, version 1.2.30, .src.rpm"=>"ftp://ftp.fi.muni.cz/pub/ssh/local-fi.muni.cz/linux/ssh-1.2.30-1i.src.rpm",
"download-SSH-1, version 1.2.30, .tar.gz"=>"ftp://ftp.fi.muni.cz/pub/ssh/ssh-1.2.30.tar.gz",
- "summary"=>"SSH enhancement",
+ "summary"=>"SSH-1 <i>KeepAliveData</i> and <i>OnDemandForward</i> features",
"license"=>"PD",
- "maintenance"=>"update",
- "reason"=>"<a href=\"http://www.openssh.com/\">OpenSSH</a> is now preferred but this patch is not yet migrated.",
+ "maintenance"=>"update-".a_href('http://www.openssh.com/','OpenSSH').' is preferred although this patch is not migrated.',
"language"=>"C patch",
- "description"=>""
- .'This patch will protect your mostly idle SSH connection from broken masquerading firewalls'
- .' and/or it will also provide _on-demand_ tunnelling.'
+ "description"=><<"HERE",
+<ul>
+ <li><i>KeepAliveData</i>: Protect your mostly idle SSH connection from broken
+ masquerading firewalls which forget and reset the idle connections.</li>
+ <li><i>OnDemandForward</i>: Setup the connection only after the first client
+ connected to the local tunnel (-L) connection side.</li>
+</ul>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::ssht'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::ssht::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::ssht::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::ssht::ListItem::ListItem,
+ );
+
+
+my $cvsfile=sub ($) {
+my($file)=@_;
+
+ return a_href $W->{"project_viewcvs"}.'/*checkout*/ssht/hostintranet/etc-inittab?rev=HEAD',
+ CGI::escapeHTML($file);
+};
+
+print <<"HERE";
+
+<ul>
+ <li>
+ <p>Replace all strings <b>hostintranet</b> by the name of your firewalled
+ intranet machine (without any dots - it must be valid string token).</p>
+ </li>
+ <li>
+ <p>Replace all strings <b>public.internet.com</b> by the hostname of your
+ server in public Internet. Replace <b>1.2.3.4-IP-of-public.internet.com</b>
+ with IP address of this host</p>
+ </li>
+ <li>Generate new keypair by '<b>ssh-keygen -t dsa</b>'.</p>
+ <p>Place its public key part to
+ @{[ &{$cvsfile}('public.internet.com/home-hostintranet-ssht/.ssh/authorized_keys') ]}.</p>
+ <p>Place its private key part to
+ @{[ &{$cvsfile}('hostintranet/public.internet.com--hostintranet-ssht--identity') ]}.
+ Protect this file by '<i>chmod 600 hostintranet/public.internet.com--hostintranet-ssht--identity</i>'.</p>
+ <li>
+ <p>Append line from @{[ &{$cvsfile}('public.internet.com/etc-passwd') ]}
+ to the file <b>/etc/passwd</b> on your server in public Internet.</p>
+ </li>
+ <li>
+ <p>Append line from @{[ &{$cvsfile}('hostintranet/etc-inittab') ]} to
+ the file <b>/etc/inittab</b> on your firewalled intranet machine.</p>
+ <p>Execute '<i>init q</i>' command there.</p>
+ </li>
+</ul>
+HERE
+
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::ssht' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::ssht::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"ssht",
+ "platform"=>"unixuser",
+ "priority"=>90,
+ "cvs"=>"ssht",
+ "summary"=>'Unattended intranet host accessibility by '.a_href('http://www.openssh.org/','SSH').' tunnel',
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "sponsorship"=>a_href('http://www.jklabs.cz/','JKLabs'),
+ "language"=>"bash",
+ "description"=><<"HERE",
+<p>Do you need to admin remote host placed in the intranet behind firewall out of your contrl?
+If the firewall performat NAT (masquerade) where you can connect from
+the intranet to the outer world by @{[ a_href 'http://www.openssh.org/','SSH' ]}
+you can use these security safe scripts.</p>
+<p>If you are able to set up port forwarding on the firewall you do not need any such scripts.
+In the case of HTTP-only proxy you cannot use these scripts - look elsewhere.</p>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/ssht/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::step::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::step::ListItem;
+Wuse 'My::Project';
+Wuse 'project::step::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::step::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::step::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::step;
+package project::step::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"STEP - Student's Trainee Exchange Programme",
- "priority"=>4,
+
+our @ListItem=(
+ "name"=>"STEP",
+ "platform"=>"web",
+ "priority"=>130,
"download"=>"step.tar.gz",
"summary"=>"Custom web database application",
"license"=>"PD",
"maintenance"=>"dead",
"language"=>"PHP 3.0",
- "description"=>""
- .'<p>Preview of a possible future web database solution for some lawyers association.'
- .' Currently it remains as a source of some web development <a href="http://www.php.net/">PHP 3.0</a>'
- .' codebase to be reused in other projects.</p>'
+ "description"=><<"HERE",
+<p>Preview of a possible future web database solution for a lawyers association.
+Currently it remains as a source of some web development @{[ a_href 'http://www.php.net/','PHP 3.0' ]}
+codebase to be reused in other projects.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::surprise::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::surprise::ListItem;
+Wuse 'My::Project';
+Wuse 'project::surprise::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::surprise::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::surprise::ListItem::ListItem,
);
-print '<table border="0"><tr><td align="center">'.My::Web::img("surprise-gnome-0.gif","Gnome client").'</td></tr></table>'."\n";
+
+print centerimg "surprise-gnome-0","Gnome client";
+
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::surprise;
+package project::surprise::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
+
+our @ListItem=(
"name"=>"Partition Surprise",
- "priority"=>9,
+ "platform"=>"unixuser",
+ "priority"=>650,
+ "icon"=>"surprise-gnome-0-icon",
"download-Page on SourceForge.net"=>"http://sourceforge.net/project/showfiles.php?group_id=10546",
"download-ISO Image from SourceForge.net"=>"http://surprise.sourceforge.net/download/surprise-rel7.iso.zip",
"link-Homepage on SourceForge.net"=>"http://surprise.sourceforge.net/",
"link-Project Page on SourceForge.net"=>"http://sourceforge.net/projects/surprise/",
- "summary"=>"Partition manager",
+ "summary"=>"GPLed Partition Magic clone",
"license"=>"GPL",
+ "sponsorship"=>a_href('http://www.suse.com/','SuSE'),
"maintenance"=>"update",
- "ownership"=>"Coauthor; development team of 5 people",
+ "ownership"=><<"HERE",
+Member of the development team:
+<ul>
+ <li>@{[ a_href 'http://atrey.karlin.mff.cuni.cz/~jack/','Jan Kara' ]}</li>
+ <li>@{[ a_href 'http://atrey.karlin.mff.cuni.cz/~kral/','Daniel Kral' ]}</li>
+ <li>@{[ a_href 'http://www.jankratochvil.net/','Jan Kratochvil' ]}</li>
+ <li>@{[ a_href 'http://www.ucw.cz/~robert/','Robert Spalek' ]}</li>
+ <li>@{[ a_href 'http://kiwi.ms.mff.cuni.cz/~tom/','Tomas Tichy' ]}</li>
+</ul>
+HERE
"language"=>"C",
- "description"=>""
- .'<p>Partition Surprise is a GPL partition managing software for Linux. Partition'
- .'resizes, moves and conversions is implemented. Limited support of operations on'
- .'mounted ext2-filesystem included as well.'
+ "description"=><<"HERE",
+<p>Partition Surprise is a GPL partition managing software for GNU/Linux. Partition
+resizes, moves and conversions is implemented. Limited support of operations on
+mounted ext2-filesystem included as well.
+HERE
);
1;
include $(top_srcdir)/Makefile-head.am
EXTRA_DIST+= \
- ListItem.pm \
- index.html.pl
+ ListItem.pm \
+ Index.html.pl \
+ surprise-gnome-0.png
-noinst_DATA+= \
- index.html
+CLEANFILES+= \
+ surprise-gnome-0.gif
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::tac_plus::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::tac_plus::ListItem;
+Wuse 'My::Project';
+Wuse 'project::tac_plus::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::tac_plus::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::tac_plus::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::tac_plus;
+package project::tac_plus::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"TACACS+ Server NAS Host Based Authorization",
- "priority"=>8,
+
+our @ListItem=(
+ "name"=>"tac_plus auth",
+ "platform"=>"unixuser",
+ "priority"=>270,
+ "icon"=>"cisco-icon.jpeg",
"download-GTS rel.4 diff for TACACS+ v4.0.3"=>"tac_plus-F4.0.3.alpha.8.gts4.diff.gz",
"download-TACACS+ v4.0.3, Devrim Seral rel.8"=>"http://www.gazi.edu.tr/tacacs/index.php?page=download",
- "link-CVS repository for GTS version"=>"http://cvs.jankratochvil.net/viewcvs/tac_plus/",
- "summary"=>"Network server security",
+ "cvs"=>"tac_plus",
+ "link-".a_href('http://freshmeat.net/','Freshmeat')=>
+ a_href('http://freshmeat.net/branches/18747/','Tacacs+ - Authorization by NAS host patch branch'),
+ "summary"=>a_href('http://www.cisco.com/warp/public/614/7.html','Cisco TACACS+')
+ .' NAS host based authorization',
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"pending",
"language"=>"C patch",
- "sponsorship"=>"<a href=\"http://www.gtsgroup.cz/\">GTS</a>",
- "description"=>""
- .'<p>Patch provides complete freedom of specifying ANY'
- .' configuration changes depending on the specific NAS the user is being logged'
- .' on. This involves different enable password, NAS keys but now also: various'
- .' specific commands, permitted services etc.</p>'
+ "sponsorship"=>a_href('http://www.gtsgroup.cz/'.'GTS'),
+ "description"=><<"HERE",
+<p>Patch provides complete freedom of specifying any
+configuration changes depending on the specific NAS the user is being logged
+on. This involves different enable password, NAS keys but now also: various
+specific commands, permitted services etc.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::tcp_rto'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::tcp_rto::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::tcp_rto::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::tcp_rto::ListItem::ListItem,
+ );
+
+
+print <<"HERE";
+<p>This patch can solve your problems if you have network connection dropping too much
+packets. In standard case the Linux kernel will correctly increase our round-trip-time
+of connection slowing the transfer rate up to the unusable state.</p>
+<p>After applying this patch you can set your maximal round-trip-time in file
+"<b>/proc/sys/net/ipv4/tcp_rto_max</b>", it is expressed in <tt>Hz</tt>
+units (<tt>100-per-second</tt> on <i>x86</i> platform). You may need also to enlarge
+your maximal retry count in "<b>/proc/sys/net/ipv4/tcp_retries2</b>",
+otherwise <u>your</u> machine will reject the connection as it will have to retry
+the packets more than in sane states.</p>
+<p><font color="red">Please use this feature very carefully! You are violating
+<tt>RFC</tt> standards and you can get your network administrators to be very angry!</font></p>
+HERE
+
+
+My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::tcp_rto;
+package project::tcp_rto::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Linux Kernel Patch for Maximal Round-trip-time",
- "priority"=>7,
+
+our @ListItem=(
+ "name"=>"tcp_rto",
+ "platform"=>"unixuser",
+ "trivia"=>1,
+ "priority"=>330,
"download-Linux kernel 2.2.17 patch"=>"linux-2.2.17-tcp_rto-1.diff",
"download-Linux kernel 2.4.16 patch"=>"linux-2.4.16-tcp_rto-1.diff",
- "summary"=>"Network workaround",
+ "summary"=>"Linux kernel maximal TCP round-trip-time patch",
"license"=>"GPL",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C patch",
- "description"=>""
- .'<p>This patch can solve your problems if you have network connection dropping too much'
- .' packets. In standard case the Linux kernel will correctly increase our round-trip-time'
- .' of connection slowing the transfer rate up to the unusable state.</p>'
- .' <p>After applying this patch you can set your maximal round-trip-time in file'
- .' "<b>/proc/sys/net/ipv4/tcp_rto_max</b>", it is expressed in <tt>Hz</tt>'
- .' units (<tt>100-per-second</tt> on <i>x86</i> platform). You may need also to enlarge'
- .' your maximal retry count in "<b>/proc/sys/net/ipv4/tcp_retries2</b>",'
- .' otherwise <u>your</u> machine will reject the connection as it will have to retry'
- .' the packets more than in sane states.</p>'
- .' <p><font color="red">Please use this feature very carefully! You are violating'
- .' <tt>RFC</tt> standards and you can get your network administrators to be very angry!</font></p>'
+ "description"=><<"HERE",
+<p>Solve your problems with network connection dropping too much of your
+packets. It forces Linux kernel to insist repeating the packages to prevent
+slowdown of the TCP connection up to its unusable state.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
+++ /dev/null
-#! /usr/bin/perl
-#
-# $Id$
-# Main page of 'My::Project::tcp_rto'
-# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; exactly version 2 of June 1991 is required
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
-use strict;
-use warnings;
-
-use My::Web;
-use project::tcp_rto::ListItem;
-
-
-My::Web->init_project(
- "ListItem"=>\%My::Project::tcp_rto::ListItem,
- );
-
-My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::tcpdump::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::tcpdump::ListItem;
+Wuse 'My::Project';
+Wuse 'project::tcpdump::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::tcpdump::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::tcpdump::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::tcpdump;
+package project::tcpdump::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"tcpdump ASCII Dump Patch",
- "priority"=>6,
+
+our @ListItem=(
+ "name"=>"tcpdump ASCII",
+ "platform"=>"unixuser",
+ "trivia"=>1,
+ "priority"=>170,
"download"=>"tcpdump-3.4-ASCIIdump.diff",
"download-tcpdump-3.4"=>"ftp://ftp.ee.lbl.gov/tcpdump-3.4.tar.Z",
- "summary"=>"tcpdump readability patch",
+ "summary"=>"tcpdump(1) patch for better output readable as ASCII",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C patch",
- "description"=>""
- .'<p>Makes the text messages of tcpdump(1) readable when option <code>-x</code> is used.</p>'
+ "description"=><<"HERE",
+<p>Makes the text messages of tcpdump(1) readable when option <code>-x</code> is used.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::timeplan::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::timeplan::ListItem;
+Wuse 'My::Project';
+Wuse 'project::timeplan::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::timeplan::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::timeplan::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::timeplan;
+package project::timeplan::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Time Log Summarizer",
- "priority"=>6,
+
+our @ListItem=(
+ "name"=>"timeplan",
+ "platform"=>"unixuser",
+ "trivia"=>1,
+ "priority"=>100,
+ "icon"=>"digiclock.jpeg",
"download"=>"timeplan-1.0.1.tar.gz",
- "summary"=>"Time management",
+ "cvs"=>"timeplan",
+ "summary"=>"Calculate statistics from your personal time tracking notes",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C",
- "description"=>""
- .'<p>Software to do summaries of time log - what have you spent much time on.'
- .' The greatest effect to me was just the writing of such time log: Consecutively'
- .' you do not spend such time on useless issues as you would be forced to write'
- .' such event to your log.</p>'
+ "description"=><<"HERE",
+<p>Software to do summaries of time log - what have you spent much time on.
+The greatest effect to me was just the writing of such time log: Consecutively
+you do not spend such time on useless issues as you would be forced to write
+such event to your log.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::vblib::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::vblib::ListItem;
+Wuse 'My::Project';
+Wuse 'project::vblib::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::vblib::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::vblib::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::vblib;
+package project::vblib::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Variable Buffers Library",
- "priority"=>4,
+
+our @ListItem=(
+ "name"=>"vblib",
+ "platform"=>"unixdevel",
+ "priority"=>30,
"download"=>"vblib-1.0.0.tar.gz",
- "summary"=>"Streams library",
+ "summary"=>"High performance memory streams library",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C",
- "sponsorship"=>"<a href=\"http://www.princip.cz/\">Princip, a.s.</a>",
- "description"=>""
- .'<p>Enables application to easily do input/output functions (like'
- .' read/write, printf etc.) with memory streams while using performance effective'
- .' functions. Simple buffer copying/moving would be possible but it would case a'
- .' major performance hit if not using algorithms implemented in this library.</p>'
+ "sponsorship"=>"<a href=\"http://www.geoinvest.cz/\">Geoinvest</a>",
+ "description"=><<"HERE",
+<p>Enables application to easily do input/output functions (like
+read/write, printf etc.) with memory streams while using performance effective
+functions. Simple buffer copying/moving would be possible but it would case a
+major performance hit if not using algorithms implemented in this library.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Main page of 'My::Project::wayback'
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::wayback::Index;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+Wuse 'My::Project';
+Wuse 'project::wayback::ListItem';
+
+
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::wayback::ListItem::ListItem,
+ );
+
+My::Web->footer();
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Definition of 'My::Project::wayback' for list.cgi.pl
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package project::wayback::ListItem;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+use My::Web;
+
+
+our @ListItem=(
+ "name"=>"wayback",
+ "platform"=>"unixuser",
+ "trivia"=>1,
+ "priority"=>320,
+ "cvs"=>"wayback",
+ "summary"=>"Shift system time backwards for a specific application",
+ "license"=>"PD",
+ "maintenance"=>"ready",
+ "language"=>"C",
+ "description"=><<"HERE",
+<p>This programs is userful for time-limited demo versions, of course.</p>
+<p>Just set environment variable "<b>WAYBACK</b>" to the number of seconds to shift the system time back.
+Set "<b>LD_PRELOAD</b>" to the provided <b>libwayback.so</b> and run your demo program.</P>
+HERE
+ );
+
+1;
--- /dev/null
+# $Id$
+# automake source for the Makefile of project/wayback/ subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
+
+EXTRA_DIST+= \
+ ListItem.pm \
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::winvnc::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::winvnc::ListItem;
+Wuse 'My::Project';
+Wuse 'project::winvnc::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::winvnc::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::winvnc::ListItem::ListItem,
);
print <<'HERE';
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::winvnc;
+package project::winvnc::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Patch for Secret WinVNC Server Run",
- "priority"=>6,
+
+our @ListItem=(
+ "name"=>"WinVNC hide",
+ "platform"=>"w32",
+ "priority"=>560,
+ "icon"=>"nowinvnc",
"download-already patched version 3.3.3r9"=>"vnc-3.3.3r9_x86_win32-exe-SECRET.zip",
"download-original version 3.3.3r9"=>"http://www.uk.research.att.com/vnc/dist/vnc-3.3.3r9_x86_win32.zip",
"download-already patched version 3.3.3r7"=>"vnc-3.3.3r7_x86_win32-exe-SECRET.zip",
"download-original version 3.3.3r7"=>"http://www.uk.research.att.com/vnc/dist/vnc-3.3.3r7_x86_win32.zip",
"link-VNC Homepage"=>"http://www.uk.research.att.com/vnc/",
- "summary"=>"Patch to hide WinVNC",
+ "summary"=>"Hide running WinVNC server",
"license"=>"PD",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"i386 asm patch",
- "description"=>""
- .'<p>If you install <i>WinVNC</i> in'
- .' <a href="http://www.microsoft.com/">MS</a> <a href="http://www.microsoft.com/windows/">Windows</a>'
- .' environment, you will notice that it creates its own small icon in <i>System Tray</i>.'
- .' Sometimes you want to get rid of this visible icon and you cannot remove it by any configuration'
- .' settings.</p>'
+ "description"=><<"HERE",
+<p>If you install <i>WinVNC</i> in
+@{[ a_href 'http://www.microsoft.com/','MS' ]} @{[ a_href 'http://www.microsoft.com/windows/','Windows' ]}
+environment, you will notice that it creates its own small icon in <i>System Tray</i>.
+Sometimes you want to get rid of this visible icon and you cannot remove it by any configuration
+settings.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::wllib::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::wllib::ListItem;
+Wuse 'My::Project';
+Wuse 'project::wllib::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::wllib::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::wllib::ListItem::ListItem,
);
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::wllib;
+package project::wllib::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Line drawing Crossplatform Library",
- "priority"=>4,
+
+our @ListItem=(
+ "name"=>"wllib",
+ "platform"=>"unixdevel",
+ "priority"=>40,
"download"=>"wllib-1.0.0.tar.gz",
- "summary"=>"Graphics library",
+ "summary"=>"Graphics library for crossplatform line drawing",
"license"=>"PD",
- "maintenance"=>"obsolete",
- "reason"=>"Supported backends are no longer being used.",
+ "maintenance"=>"obsolete-Any of the supported backends are no longer being used.",
"language"=>"C",
- "description"=>""
- .'<p>This library should make you generically use line drawing on the following platforms:'
- .' <a href="http://www.x.org/">UNIX/X Windows System X11</a>,'
- .' <a href="http://www.svgalib.org/">UNIX/SVGAlib</a> and'
- .' <a href="http://www.amiga.com/">AmigaOS</a>.</p>'
+ "description"=><<"HERE",
+<p>This library should make you generically use line drawing on the following platforms:
+@{[ a_href 'http://www.x.org/','UNIX/X Windows System X11 (libX11)' ]},
+@{[ a_href 'http://www.svgalib.org/','UNIX/SVGAlib' ]} and
+@{[ a_href 'http://www.amiga.com/','AmigaOS' ]}.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+package project::xbill::Index;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
use My::Web;
-use project::xbill::ListItem;
+Wuse 'My::Project';
+Wuse 'project::xbill::ListItem';
-My::Web->init_project(
- "ListItem"=>\%My::Project::xbill::ListItem,
+My::Project->init_project(
+ "__PACKAGE__"=>__PACKAGE__,
+ "ListItem"=>\@project::xbill::ListItem::ListItem,
);
+
+print <<"HERE";
+<p>This project has been moved to @{[ a_href 'http://sourceforge.net/','SourceForge' ]}.
+Please refer to its @{[ a_href 'http://xbill.sourceforge.net/','SourceForge project page' ]}.</p>
+
+@{[ centerimg "redmond_.jpeg","xBill" ]}
+HERE
+
+
My::Web->footer();
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-package My::Project::xbill;
+package project::xbill::ListItem;
require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
-use vars qw($VERSION $CVS_ID);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-$CVS_ID=q$Id$;
+our $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+our $CVS_ID=q$Id$;
use strict;
use warnings;
+use My::Web;
-our %ListItem=(
- "name"=>"Classic xBill game",
- "priority"=>7,
+
+our @ListItem=(
+ "name"=>"Gnome xBill",
+ "platform"=>"unixuser",
+ "priority"=>570,
+ "icon"=>"redmond-icon",
"link-Download from SourceForge.net"=>"http://sourceforge.net/project/showfiles.php?group_id=10700",
"link-Homepage on SourceForge.net"=>"http://xbill.sourceforge.net/",
- "summary"=>"Graphical game",
+ "summary"=>"xBill game rewritten with network support and Gnome/GTK+",
"license"=>"GPL",
- "maintenance"=>"finished",
+ "maintenance"=>"ready",
"language"=>"C",
- "description"=>""
- .'<p>Almost-rewritten <a href="ftp://ftp.x.org/contrib/games/xbill-2.0.tgz">classical xBill game</a>,'
- .' this project has been moved to <a href="http://sourceforge.net/">SourceForge</a>.'
- .' Please refer to the <a href="http://xbill.sourceforge.net/">page linked above</a>'
- .' to have further access to it.</p>'
+ "description"=><<"HERE",
+<p>Rewritten @{[ a_href 'ftp://ftp.x.org/contrib/games/xbill-2.0.tgz','classical xBill game' ]}.
+<p>Features list: @{[ a_href 'http://www.gnome.org/','Gnome/GTK+' ]} UI,
+network gameplay, C++ no longer required, portability.</p>
+HERE
);
1;
EXTRA_DIST+= \
ListItem.pm \
- index.html.pl
-
-noinst_DATA+= \
- index.html
+ Index.html.pl
--- /dev/null
+DirectoryIndex Resume-JanKratochvil.html.pl
--- /dev/null
+# $Id$
+# automake source for the Makefile of Resume subdir
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+include $(top_srcdir)/Makefile-head.am
--- /dev/null
+#! /usr/bin/perl
+#
+# $Id$
+# Resume page Perl template.
+# Copyright (C) 2003 Jan Kratochvil <project-www.jankratochvil.net@jankratochvil.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; exactly version 2 of June 1991 is required
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+package resume::ResumeJanKratochvil;
+require 5.6.0; # at least 'use warnings;' but we need some 5.6.0+ modules anyway
+use vars qw($VERSION $CVS_ID);
+$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
+$CVS_ID=q$Id$;
+use strict;
+use warnings;
+
+BEGIN{ open F,"Makefile"; our $top_dir=pop @{[split /\s/,(grep /^top_srcdir/,<F>)[0]]}; eval "use lib '$top_dir'"; close F; }
+use My::Web;
+require CGI;
+require Crypt::Rot13;
+Wrequire 'My::Project';
+
+
+my $W=My::Web->init(
+ "__PACKAGE__"=>__PACKAGE__,
+ "title"=>"Resume",
+ "section"=>"Resume",
+ "heading"=>0,
+ "footer"=>0,
+ "head_css"=>"
+td { vertical-align: top; }
+table { border-collapse: collapse; border-style: solid; border-width: 1px; margin: 8px; }
+A[href] { text-decoration: inherit; /* revoke underline */ }
+A[href].project { text-decoration: underline; }
+.platform { font-style: italic; white-space: nowrap; }
+table.referees td.com { text-align: center; }
+.techs { white-space: nowrap; }
+",
+ "args_check"=>{
+ "referees"=>'', # Do not bother with '^(?:(?i)referees)?$'
+ },
+ );
+My::Web->heading();
+
+
+my %item=( My::Project::item_hash_read() );
+my @itemnames=sort {
+ ($item{$b}{"priority"} <=> $item{$a}{"priority"})
+ or (lc($item{$a}->{"name"}) cmp lc($item{$b}->{"name"}));
+ } keys(%item);
+
+my $projectref=sub
+{
+my($name)=@_;
+
+ return a_href "/project/$name/",$item{$name}{"name"},"attr"=>'class="project"';
+};
+
+my $project=sub
+{
+my($name,%args)=@_;
+
+ return &{$projectref}($name).($args{"bare"} ? '' : ': '.$item{$name}{"summary"});
+};
+
+my $free_projects=sub (@)
+{
+my(@platforms)=@_;
+
+ my $r="";
+ $r.=join ", ",map({ my $platform=$_;
+ map({ ($item{$_}{"sponsorship"} || $item{$_}{"trivia"}
+ || $item{$_}{"platform"} ne $platform ? () : (&{$projectref}($_))); } @itemnames);
+ } @platforms);
+ return $r;
+};
+
+
+my $reference=sub ($$)
+{
+my($mail,$fullname)=@_;
+
+ my $r="";
+ $r.='<td>';
+ $r.=$fullname;
+ if (lc($W->{"args"}{"referees"}) eq "referees") {
+ my $rot13=Crypt::Rot13->new();
+ $rot13->charge($mail);
+ $mail=($rot13->rot13())[0];
+ $r.=' <'.a_href("mailto:$mail",$mail).'>';
+ }
+ $r.='</td>';
+ return $r;
+};
+
+sub techs ($)
+{
+my($arg)=@_;
+
+ return '<span class="techs">('.$arg.')</span>';
+}
+
+
+my $uClinux=a_href 'http://www.uclinux.com/','uClinux';
+my $mailme=(map({ a_href("mailto:$_",$_); } 'job@jankratochvil.net'))[0];
+my $now=(localtime())[5]+1900;
+
+print <<"HERE";
+<table width="100%" style="border-style: none;"><tr><td align="center"><table>
+<tr><td rowspan="9" style="padding: 10px; vertical-align: middle;">
+ @{[ img "/resume/Resume-JanKratochvil","face" ]}</td>
+ <td class="tab-head">Name </td><td>Jan Kratochvil</td></tr>
+<tr><td class="tab-head">English </td><td>technical: fluent, general: communicable</td></tr>
+<tr><td class="tab-head">Born </td><td>1979</td></tr>
+<tr><td class="tab-head">Status </td><td>single</td></tr>
+<tr><td class="tab-head">Licenses</td><td>motorcycle, car</td></tr>
+<tr><td class="tab-head">eMail </td><td>$mailme</td></tr>
+<tr><td class="tab-head">WWW </td><td>@{[ a_href('http://www.jankratochvil.net/') ]}</td></tr>
+<tr><td class="tab-head">Resume </td><td>@{[ a_href('http://www.jankratochvil.net/resume/') ]}</td></tr>
+<tr><td class="tab-head">OpenPGP </td><td style="font-family: monospace;">@{[ a_href '/pgp-JanKratochvil.txt',''
+ .'pub 1024D/44FC7632 2002-10-07 Jan Kratochvil <pgp-44FC7632@jankratochvil.net><br />'
+ .'sub 2048g/D9F5F44B 2002-10-07 [expires 2004-10-06]' ]}</span></td></tr>
+</table></td></tr></table>
+
+@{[ vskip "2ex" ]}
+
+<table>
+<tr><td class="tab-head">Platforms </td><td>GNU/Linux/i386/UNIX/FreeBSD, W32 kernel, Amiga/680x0, MS-DOS,
+ ZX Spectrum, handheld PC-E500S</td></tr>
+<tr><td class="tab-head">Major Areas </td><td>mobile technologies, filesystems, embedded devices</td></tr>
+<tr><td class="tab-head">Languages </td><td>C (Gnome/GCC), Perl, bash/awk/sed...,
+ Java, C++, Pascal, Basic, REXX, S-Lang, Foxplus, Prolog</td></tr>
+<tr><td class="tab-head">Tools/Metalanguages</td>
+ <td>autoconf, automake, libtool, m4, CVS, gettext, bison, flex, ld script,
+ gdb script, Maple V</td></tr>
+<tr><td class="tab-head">Assemblers </td><td>i386, Motorola 680x0, Zilog Z80, Intel 8051, MIPS R2/3000,
+ (Hitachi SH-8)</td></tr>
+<tr><td class="tab-head">WWW-Related </td><td>(X)HTML, CSS, PHP, SQL (PostgreSQL, MySQL), JavaScript, CGI</td></tr>
+<tr><td class="tab-head">Documentation</td><td>plainTeX, LaTeX, DocBook, DocBook Lite, XML/NS/Schema, nroff, pod</td></tr>
+<tr><td class="tab-head">Libraries </td><td>Gnome/GTK+/GLib, POSIX/BSD/SysV/threads/sockets, X11, OpenGL, NCurses,
+ S-Lang, GnomeVFS, libxml, SVGALib, NIS, Qt,...</td></tr>
+<tr><td class="tab-head">RPC </td><td>CORBA/ORBit, SOAP, Sun RPC</td></tr>
+<tr><td class="tab-head">Protocols </td><td>GSM SMS/PDU/Nokia Smart Messaging/EMS/MMS/SMIL/WAP/WSP/AMR/ETSI stds/3GPP stds,
+ IPv4, HTTP, SMTP/RFC822/MIME, FTP, SSH, DHCP, POP3, NFSv2, PPP/LCP/IPCP,...</td></tr>
+<tr><td class="tab-head">Filesystems </td><td>ext2, FAT, AmigaFFS, ISO-9660</td></tr>
+<caption>Each technology involved in at least one of my past projects.</caption>
+</table>
+
+@{[ vskip "2ex" ]}
+
+<table>
+<tr><td>1984-1991</td><td class="platform">Platform:</td><td>Sinclair ZX Spectrum: Basic, Zilog Z80 machine code</td></tr>
+<tr><td>1992-1997</td><td class="platform">Platform:</td><td>Amiga: Motorola 680x0 assembler, C, REXX</td></tr>
+<tr><td> </td><td class="platform">Projects:</td><td>@{[ &{$free_projects}("amiga") ]}</td></tr>
+<tr><td>1993-1997</td><td class="platform">Platform:</td><td>PC/MS-DOS: i386 assembler, C, Pascal, OpenGL/Mesa, Foxplus</td></tr>
+<tr><td> </td><td class="platform">Unlisted Projects:</td><td>@{[ &{$free_projects}("dos") ]}</td></tr>
+<tr><td>1993 </td><td class="com">@{[ a_href('http://www.japhila.cz/index_en.htm','Japhila') ]}</td>
+ <td>StampMan: Database application @{[ techs 'MS-DOS: Pascal, plainTeX' ]}</td></tr>
+<tr><td>1993-$now</td><td class="platform">Platform:</td><td>PC/GNU/Linux:
+ C, Perl, bash/awk/sed..., Java, C++, ...</td></tr>
+<tr><td> </td><td class="platform">Unlisted Projects:</td><td>@{[ &{$free_projects}(qw(unixuser unixdevel web)) ]}</td></tr>
+<tr><td>1993-1996</td><td class="com">Profes J&K</td>
+ <td>PC assembly and customer service</td></tr>
+<tr><td>1998 </td><td class="com">@{[ a_href('http://www.elsa-online.org/',"European Law Students' Association") ]}</td>
+ <td>@{[ &$project('step') ]} @{[ techs 'PHP, PostgreSQL' ]}<br />
+ subtasks @{[ &$project('phphash',"bare"=>1) ]}, @{[ &$project('pgsqlsubstr',"bare"=>1) ]}</td></tr>
+<tr><td>1998-1999</td><td class="com">@{[ a_href('http://www.geoinvest.cz/','Geoinvest') ]}</td>
+ <td>@{[ a_href 'http://members.tripod.com/Stelios_Cellar/GSM/m1module.htm','Siemens M1' ]}
+ GSM modem daemon, client/server, remote GSM terminals @{[ techs 'C, GSM, GPS, S-Lang' ]}<br />
+ GPLed subtask @{[ &$project('vblib') ]} @{[ techs 'C' ]}</td></tr>
+<tr><td>1999 </td><td class="com">@{[ a_href('http://www.tencom.cz/','TENcom Trade') ]}</td>
+ <td>@{[ a_href "/project/mdsms/","MobilDock SMS Tool","attr"=>'class="project"' ]} @{[ techs 'GSM/PDU' ]}</td></tr>
+<tr><td>1999 </td><td class="com">@{[ a_href('http://www.geoinvest.cz/','Geoinvest') ]}</td>
+ <td>@{[ &$project('332') ]} @{[ techs 'M680x0 asm, C' ]}<br />
+ subtask @{[ &$project('mot2as') ]}</td></tr>
+<tr><td>1999 </td><td class="com">@{[ a_href('http://www.unicom-prague.cz/','Unicom') ]}</td>
+ <td>Technical translations from English</td></tr>
+<tr><td>1999-$now</td><td class="com">@{[ a_href('http://www.jklabs.cz/','JKLabs') ]}</td>
+ <td>sysadmin GNU/Linux and FreeBSD, techsupport: GuestNET,
+ @{[ a_href 'http://www.2m.dk/web/html_version/eclipse/eclipse.html','Eclipse' ]},
+ @{[ a_href 'http://www.globaloop.com/','GlobaLoop' ]},
+ @{[ a_href 'http://www.antlimited.com/products/fresco.htm','Fresco' ]}</td></tr>
+<tr><td>1999 </td><td class="com">@{[ a_href('http://www.jklabs.cz/','JKLabs') ]}</td>
+ <td>IRQ redirector for legacy devices @{[ techs 'i386 asm' ]}</td></tr>
+<tr><td>1999-2000</td><td class="com">@{[ a_href('http://www.suse.com/','SuSE') ]}</td>
+ <td>@{[ &$project('surprise') ]} @{[ techs 'C, Gnome, m4' ]}<br />
+ subtask @{[ &$project('int13sniff') ]}<br />
+ subtask @{[ &$project('gladewsrc') ]}</td></tr>
+<tr><td>2001 </td><td class="com">@{[ a_href('http://www.gtsgroup.cz/','GTS') ]}</td>
+ <td>@{[ &$project('tac_plus') ]} @{[ techs 'C, Cisco TACACS+' ]}<br />
+ subtask @{[ &$project('mod_auth_tacacs') ]} @{[ techs 'C, Cisco TACACS+' ]}</td></tr>
+<tr><td>2001 </td><td class="com">@{[ a_href('http://www.atspraha.cz/','Advanced Telecom Services') ]}</td>
+ <td>@{[ &$project('mdsms') ]} - update for
+ @{[ a_href 'http://www.transportdata.de/html/produkte/siemens_m20t.php?lang=en',
+ 'Siemens M20' ]}
+ @{[ techs 'C, GSM PDU' ]}</td></tr>
+<tr><td>2001 </td><td class="com">@{[ a_href('http://www.atspraha.cz/','Advanced Telecom Services') ]}</td>
+ <td>@{[ a_href 'http://www.gnokii.org/','gnokii' ]}
+ @{[ a_href 'http://www.jankratochvil.net/priv/gnokii/gnokii-lace-2001-11-17-01.tar.gz',
+ 'driver for SMS gateway' ]}
+ of GSM operator @{[ a_href('http://www.eurotel.cz/','EuroTel') ]}
+ (C, PostgreSQL)</td></tr>
+<tr><td>2001 </td><td class="com">@{[ a_href('http://www.atspraha.cz/','Advanced Telecom Services') ]}</td>
+ <td>@{[ &$project('gsmperl') ]} @{[ techs 'Perl, GSM EMS' ]}</td></tr>
+<tr><td>2001 </td><td class="com">@{[ a_href('http://www.netcentrum.cz/','NetCentrum') ]}</td>
+ <td>@{[ a_href 'http://www.gnokii.org/','gnokii' ]}
+ @{[ a_href 'http://www.jankratochvil.net/priv/gnokii/gnokii-0.4.0pre1_lace2001_11_14_01_netcentrum.diff',
+ 'driver for custom SMS gateway protocol' ]} @{[ techs 'C' ]}</td></tr>
+<tr><td>2001 </td><td class="com">@{[ a_href('http://www.readynote.com/','ReadyNote') ]}</td>
+ <td>@{[ &$project('mdsms') ]} port to embedded $uClinux
+ @{[ techs 'GSM, Nokia, uClinux' ]}</td></tr>
+<tr><td>2002 </td><td class="com">@{[ a_href('http://www.readynote.com/','ReadyNote') ]}</td>
+ <td>@{[ a_href 'http://www.mwiacek.com/gsm/gammu/gammu.html','mygnokii' ]}
+ @{[ a_href 'http://www.jankratochvil.net/priv/gnokii/mygnokii-0.3.3_pre8-gold_2002_03_10--uClinux2002_03_17_23_03/',
+ 'port to embedded' ]} $uClinux,
+ @{[ a_href 'http://www.nokiausa.com/phones/5190/1,1162,,00.html','Nokia 5190' ]}
+ @{[ a_href 'http://www.jankratochvil.net/priv/gnokii/mygnokii-0.3.3_pre8-gold_2002_02_24-decodefile/',
+ 'sw-modem debugging' ]}
+ @{[ techs 'GSM, Nokia, uClinux' ]}</td></tr>
+<tr><td>2002 </td><td class="com">@{[ a_href('http://www.jklabs.cz/','JKLabs') ]}</td>
+ <td>@{[ &$project('ssht') ]}</td></tr>
+<tr><td>2002 </td><td class="com">@{[ a_href('http://www.jklabs.cz/','JKLabs') ]}</td>
+ <td>@{[ &$project('middleman') ]}
+ for hotel system @{[ techs 'C, BSD, HTTP' ]}</td></tr>
+<tr><td>2002 </td><td class="com">@{[ a_href('http://www.atspraha.cz/','Advanced Telecom Services') ]}</td>
+ <td>MMS framework client via @{[ a_href('http://www.eurotel.cz/site/en/home/','EuroTel') ]} GSM operator
+ (GSM MMS, Perl, XML, SOAP)<br />
+ subtasks @{[ a_href "/etmms/",'MMS center debugging',"attr"=>'class="project"' ]},
+ @{[ &$project('etherealmmse',"bare"=>1) ]}, @{[ &$project('etherealwsp',"bare"=>1) ]}</td></tr>
+<caption>Contractor Jobs</caption>
+</table>
+
+@{[ vskip "1ex" ]}
+
+<table class="referees">
+<tr><td class="com">@{[ a_href('http://www.japhila.cz/index_en.htm','Japhila') ]}</td>
+ @{[ &{$reference}('wnavx(ng)wncuvyn.pbz','Bretislav Janik') ]}</tr>
+<tr><td class="com">@{[ a_href('http://www.geoinvest.cz/','Geoinvest') ]}</td>
+ @{[ &{$reference}('ohgna(ng)trbvairfg.pm','Lubor Otta') ]}</tr>
+<tr><td class="com">@{[ a_href('http://www.tencom.cz/','TENcom Trade') ]}</td>
+ @{[ &{$reference}('grfne(ng)grapbz.pm','Petr Tesar') ]}</tr>
+<tr><td class="com">@{[ a_href('http://www.unicom-prague.cz/','Unicom') ]}</td>
+ @{[ &{$reference}('erprcpr(ng)havpbz-centhr.pm','Valerie Bernardova') ]}</tr>
+<tr><td class="com">@{[ a_href('http://www.jklabs.cz/','JKLabs') ]}</td>
+ @{[ &{$reference}('wna.xbyne(ng)wxynof.pm','Jan Kolar') ]}</tr>
+<tr><td class="com">@{[ a_href('http://www.gtsgroup.cz/','GTS') ]}</td>
+ @{[ &{$reference}('Zvpunry.Znprx(ng)tgftebhc.pm','Michael Macek') ]}</tr>
+<tr><td class="com">@{[ a_href('http://www.atspraha.cz/','Advanced Telecom Services') ]}</td>
+ @{[ &{$reference}('zvpuny.ubenx(ng)ngfcenun.pm','Michal Horak') ]}</tr>
+<tr><td class="com">@{[ a_href('http://www.readynote.com/','ReadyNote') ]}</td>
+ @{[ &{$reference}('wcehrgg(ng)ernqlabgr.pbz','Jim Pruett') ]}</tr>
+HERE
+
+if (lc($W->{"args"}{"referees"}) ne "referees") {
+ print <<"HERE";
+ <tr><td style="padding: 10px;" colspan="2">
+ <hr />
+ <form method="post" action="@{[ $W->{"resume_url"} ]}">
+ <p>Enter the word '<b>referees</b>' (without quotes) to disclose e-mail addresses:</p>
+ <input type="text" size="15" name="referees" value="@{[ CGI::escapeHTML($W->{"args"}{"referees"}) ]}" />
+ <input type="submit" value="Submit" />
+ <p>(spambot protection)</p>
+ </form>
+ </td></tr>
+HERE
+ }
+
+print <<"HERE";
+<caption>Contractor Jobs Referees (chronologically)</caption>
+</table>
+
+@{[ vskip "2ex" ]}
+
+<table>
+<tr><td>1995</td><td>7th in the Central European Olympiad in Informatics</td></tr>
+<tr><td>1996</td><td>4th in the International Competition in Programming</td></tr>
+<tr><td>1997</td><td>1st in the International Competition in Programming</td></tr>
+<tr><td>1997</td><td>2nd in an MO-P national contest - mathematics Olympiad, the programming category</td></tr>
+<tr><td>1997</td><td>Bronze medal in the International Olympiad in Informatics, South Africa - Cape Town</td></tr>
+</table>
+
+@{[ vskip "3ex" ]}
+
+<p style="font-size: larger;">Looking for a fulltime job. Relocation around the world expected.</p>
+<p style="font-size: larger;">Contact: $mailme</p>
+HERE
+
+
+My::Web->footer();
User-agent: *
-Disallow:
+Disallow: /project/ChangeLog.txt.pl