Compare commits
99 Commits
tags/pre-s
...
tags/Cache
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
758075df86 | ||
|
|
76159a2caf | ||
|
|
1988cb05b5 | ||
|
|
dd8c6b3bed | ||
|
|
bc64749366 | ||
|
|
2e9287bd58 | ||
|
|
0f2274a140 | ||
|
|
957fa10cac | ||
|
|
e603146886 | ||
|
|
cb698a0df1 | ||
|
|
1b918d9ef0 | ||
|
|
6407144c9f | ||
|
|
2ed563a178 | ||
|
|
4becc0b508 | ||
|
|
7d5427ea31 | ||
|
|
99904bcc48 | ||
|
|
bcb56c9593 | ||
|
|
f18bc8e6cd | ||
|
|
7d14c5669a | ||
|
|
c0dd3df02e | ||
|
|
e5cc84978f | ||
|
|
5694537330 | ||
|
|
297c5ceba3 | ||
|
|
e0311312f7 | ||
|
|
cf3dc77b02 | ||
|
|
dd2506a737 | ||
|
|
b1bee1f21c | ||
|
|
48ecc5625b | ||
|
|
1b791685e6 | ||
|
|
dc94d1d6e2 | ||
|
|
f5b437ade3 | ||
|
|
8c0b4b3e4a | ||
|
|
fb640ab144 | ||
|
|
106e263b33 | ||
|
|
85045a8552 | ||
|
|
a2279be132 | ||
|
|
0ce702d402 | ||
|
|
f14d03cd67 | ||
|
|
b91343fdf6 | ||
|
|
2c517489b5 | ||
|
|
ae57da58eb | ||
|
|
8d4586dd65 | ||
|
|
9b473ad9be | ||
|
|
2ad227a994 | ||
|
|
94d8da33c1 | ||
|
|
81c05809fd | ||
|
|
e30547b2b2 | ||
|
|
257f9cfaaa | ||
|
|
96e2654e43 | ||
|
|
3b023433be | ||
|
|
1b89716afe | ||
|
|
ad02058877 | ||
|
|
fa8a3196e7 | ||
|
|
5c2c543e58 | ||
|
|
c588721cc0 | ||
|
|
0b049b17ba | ||
|
|
854ef4631d | ||
|
|
051c558653 | ||
|
|
37a04adb09 | ||
|
|
c823c04b45 | ||
|
|
03cbd000eb | ||
|
|
a91e91a1c7 | ||
|
|
be7a5a48b6 | ||
|
|
b2bc7468e8 | ||
|
|
9692dfd994 | ||
|
|
f3edd4cfb5 | ||
|
|
33403345c1 | ||
|
|
20c850de23 | ||
|
|
e8b619cd02 | ||
|
|
eed396bb92 | ||
|
|
41d44c070b | ||
|
|
698ba42268 | ||
|
|
1a0fd23991 | ||
|
|
67dded330b | ||
|
|
936ff4777a | ||
|
|
96c55e42f7 | ||
|
|
82fa0cf06a | ||
|
|
98c8285334 | ||
|
|
bad4b683f4 | ||
|
|
cb5269a28a | ||
|
|
74712f3635 | ||
|
|
9f8ea739db | ||
|
|
97a10dd7c6 | ||
|
|
85a132fac0 | ||
|
|
e594eee877 | ||
|
|
9148eee3d6 | ||
|
|
b5989a8382 | ||
|
|
2b861f60d9 | ||
|
|
87db050b37 | ||
|
|
ffe483cf95 | ||
|
|
52aa17a1c3 | ||
|
|
5fdb3aa69e | ||
|
|
8cae473bc0 | ||
|
|
0719303755 | ||
|
|
90d3e40858 | ||
|
|
c792b2d35c | ||
|
|
7a4377d840 | ||
|
|
a5fa416010 | ||
|
|
49d00db5e2 |
@@ -1,46 +0,0 @@
|
||||
Mstone building instructions
|
||||
|
||||
For Unix, just "gmake" one of these
|
||||
release The usual optimized build
|
||||
debug Debug build includes some asserts
|
||||
|
||||
rpackage Build the release and package it
|
||||
dpackage Build the debug version and package it
|
||||
|
||||
all_OPT Build a multi-platform package
|
||||
all_DBG Build a multi-platform debug package
|
||||
|
||||
For NT, run autobuild.bat. This will build and package both the debug
|
||||
and optimized versions. Perl must already be built and installed in
|
||||
\. The NT build may be behind the Unix stuff. Pull the build/package/*
|
||||
subdirectories into the main build/package before doing a 'make all_???'.
|
||||
|
||||
You can build multiple OSes in the same tree. Debug and optimized
|
||||
builds are kept separately. The all_??? targets will combine whatever
|
||||
OSes are present into a multi-architecture package (including NT).
|
||||
Note that you have ot build and package each OS before doing the all_
|
||||
step.
|
||||
|
||||
|
||||
Helper components
|
||||
|
||||
Linux usually comes with workable versions of gnuplot and perl. Most
|
||||
other OSes don't. Mstone can build and package perl, gnuplot, and gd
|
||||
with the right settings. These will be automatically built and
|
||||
packaged if they are present.
|
||||
|
||||
Unpack gd1.3 or later in the mstone directory. You can probably find
|
||||
gd from here: http://www.boutell.com/gd/. The directory should look
|
||||
like gd?.*. Right now we need the (obsolete) version 1.3 to generate
|
||||
GIF files (without patented run-length coding). The scripts need to
|
||||
be updated to be able to handle PNG or GIF files.
|
||||
|
||||
Unpack gnuplot 3.7 or later in the mstone directory. You can probably
|
||||
find gnuplot from http://www.cs.dartmouth.edu/gnuplot_info.html. The
|
||||
directory should look like gnuplot-?.* (the exact version should not
|
||||
matter). Gnuplot requres gd to generate GIFs (which is what we need).
|
||||
|
||||
Unpack perl 5.005 or later in the mstone directory. You can probably
|
||||
find perl from http://www.perl.com/pub/language/info/software.html.
|
||||
The directory should look like perl5.* (the exact version should
|
||||
not matter).
|
||||
@@ -1,54 +0,0 @@
|
||||
2004-06-14 Dan Christian <robodan@idiom.com>
|
||||
|
||||
* Makefile (VERSION): Bump version to 4.3
|
||||
|
||||
* Make build work on recent versions of Linux and Solaris
|
||||
|
||||
* Make ssh the default way to get a remote shell
|
||||
|
||||
* Support SVG graph output (not supported by all browsers)
|
||||
|
||||
* Use rfc822 style from addresses
|
||||
|
||||
* Fix documentation link on index page to be local
|
||||
|
||||
2000-04-28 Dan Christian <dac@x.cx>
|
||||
|
||||
* http and wmap now use common routines from http-util
|
||||
|
||||
* http is now separated from the pish command structure.
|
||||
|
||||
2000-04-27 Dan Christian <dac@x.cx>
|
||||
|
||||
* bin/genplot.pl: Support gnuplot generating images other than gif
|
||||
|
||||
* src/smtp.c (sendSMTPStart): Send domain name with HELO
|
||||
|
||||
2000-04-05 Dan Christian <robodan@netscape.com>
|
||||
* Fix bug in WMAP where the login field was reporting banner data.
|
||||
|
||||
* Add a reconnect concept to WMAP. This separates out the
|
||||
reconnect activity from the initial connections. There is still a
|
||||
bug/feature that the reconnect increments an error which can
|
||||
eventually hit the maxErrors limit. You have to record the error
|
||||
or else you could not get the "connections" graph right.
|
||||
|
||||
2000-03-31 Dan Christian <robodan@netscape.com>
|
||||
|
||||
* Merged setup and mstone into one script to reduce command
|
||||
namespace polution. "mstone setup" is the the same as "setup".
|
||||
|
||||
* Made setup try to be more tolerant of OSes that were not
|
||||
include in the distribution. SunOS 5.7 will fall back to 5.6.
|
||||
|
||||
* Now package conf/general.wld.in and only copy to general.wld if
|
||||
there isn't one already in place. This means that you can unpack
|
||||
new bits over old bits without blowing away your configuration.
|
||||
|
||||
* Added <includeOnce file> command to workloads. This allows
|
||||
tests to be used either as a stand alone or as part of another
|
||||
test (e.g. smtp).
|
||||
|
||||
* Converted ChangeLog to more common formating
|
||||
|
||||
* Spilt off old ChangeLog entries to ChangeLog.1 and ChangeLog.2
|
||||
@@ -1,129 +0,0 @@
|
||||
MailStone 4.1: Changes to since version 4.0
|
||||
|
||||
* threads are used on all platforms reduces memory requirements by
|
||||
10x for large numbers of clients must run as root for maximum
|
||||
connections per process
|
||||
|
||||
* massive internal code and script cleanup / rewrite performance
|
||||
improvements for socket handling (blocking) and caching files and
|
||||
name lookups
|
||||
|
||||
* filename and path conventions restructuring '/mailstone'
|
||||
hardwired path no longer required mailstone/results/index.html
|
||||
(index of test runs) mailstone/results/<datestamp>/stderr (look
|
||||
here for errors) mailstone/results/<datestamp>/results.html
|
||||
mailstone/results/<datestamp>/results.txt
|
||||
mailstone/results/<datestamp>/work.wld (workload config used)
|
||||
mailstone/results/<datestamp>/testbed.tbd (testbed used)
|
||||
mailstone/results/<datestamp>/summary.csv (per client summary)
|
||||
mailstone/results/<datestamp>/*.gif (graphs)
|
||||
mailstone/tmp/<datestamp>/*.out (raw results from each client)
|
||||
mailstone/conf/*.wld (workload file) mailstone/conf/*.html
|
||||
(machine descriptions for reports) mailstone/data/*.msg (sample
|
||||
test messages)
|
||||
|
||||
* periodic statistics reporting allows for trend analysis of many
|
||||
variables per protocol. sampling rate is automatically determined
|
||||
by mailmaster Can now generate on-the-fly reports for above by
|
||||
running "process"
|
||||
|
||||
* The accountFormat directive is now obsolete. Use loginFormat
|
||||
and addressFormat instead.
|
||||
|
||||
* The numAccounts and beginAccounts directives are now obsolete.
|
||||
Use numLogins, firstLogin, numAddresses, and firstAddress instead.
|
||||
|
||||
* The sequentialLogins directive disables random account number
|
||||
selection. This insures a predictable account sequence.
|
||||
|
||||
* The checkMailInterval directive for IMAP is now obsolete. Use
|
||||
loopDelay instead.
|
||||
|
||||
* The directives idleTime, loopDelay, and numLoops now apply to
|
||||
all protocols. See the manual for how loopDelay and numLoops are
|
||||
used by each protocol.
|
||||
|
||||
* a command directive such as <SMTP> without HOSTS=xxx will now
|
||||
apply to all clients in the testbed
|
||||
|
||||
* <include> directive for workload and testbed files (e.g. for
|
||||
user profile)
|
||||
|
||||
* workloads are now passed to 'mailclient' through stdin no test
|
||||
specific files need to be copied to client machines more
|
||||
synchonized test startup
|
||||
|
||||
* 'setup' script will copy mailclient and test messages
|
||||
(data/*.msg) to each testbed machine in /var/tmp
|
||||
|
||||
* 'cleanup' form of setup will remove mailclient and test messages
|
||||
from each testbed machine in /var/tmp
|
||||
|
||||
* 'checktime' form of setup will (nearly) simultaneously retrieve
|
||||
time from each client. This lets you easily check for clock
|
||||
problems.
|
||||
|
||||
* 'timesync' form of setup will (nearly) simultaneously set time
|
||||
on each client. This only works on OSs that support setting
|
||||
seconds through the "date" command. rdate or ntpdate should be
|
||||
used if available. You must be the root user and be able to rsh
|
||||
as root for timesync to work.
|
||||
|
||||
* Improved reports in text and html (formatting and content)
|
||||
|
||||
* The text version of the report is now only displayed
|
||||
automatically if "-v" is given.
|
||||
|
||||
* Graphs with more than one protocol will also display a "Total"
|
||||
graph
|
||||
|
||||
* The graphs can now be customized for each test (see sample.wld
|
||||
for the default)
|
||||
|
||||
* You can now add graphs (in addition to the default or configured
|
||||
ones) by using "process timestamp -a conf/moregraph.wld".
|
||||
|
||||
* An informative index of test runs is now generated in
|
||||
results/index.html
|
||||
|
||||
* The index is updated while the run is in progress to make
|
||||
checking for errors easier.
|
||||
|
||||
* The error log now displays times relative to test start.
|
||||
|
||||
* Memory use while processing results has been greatly reduced.
|
||||
|
||||
* A summary of the data from each process is now saved in a
|
||||
Comma-separated-value (CSV) file. results/timestamp/clients.csv
|
||||
|
||||
* A summary of the data over time is now saved in a
|
||||
Comma-separated-value (CSV) file.
|
||||
results/timestamp/protocol-time.csv
|
||||
|
||||
* new gnuplot binary included, can output directly to gif format
|
||||
|
||||
* read and write performance numbers now reported separately
|
||||
|
||||
* new runtime banners and copyrights (ooh boy)
|
||||
|
||||
* idleTime option for IMAP fixed, plus now applies to all commands
|
||||
|
||||
* blockTime now sets a delay between command blocks
|
||||
|
||||
* Process model is as follows
|
||||
User runs the top-level 'mstone' script
|
||||
This calls 'conf/testname.pl' with command line arguments
|
||||
This calls 'mailmaster.pl' with config and command line arguments
|
||||
mailmaster uses 'rsh' or equivalent to launch mailclients
|
||||
mailclient runs on each testbed and forks numprocs
|
||||
each proc spawns numthreads (one per client)
|
||||
|
||||
<run tests> (note: results are being sent continuously)
|
||||
|
||||
threads send results back through sockets to top mailclient
|
||||
mailclient forwards results back over stdout via rsh pipe
|
||||
(for future work - do some data reduction/combining here)
|
||||
mailmaster directs output to each client-<hostname> file
|
||||
mailmaster launches report generator
|
||||
|
||||
* sample LDIF fragment for a postmaster entry included
|
||||
@@ -1,77 +0,0 @@
|
||||
MailStone 4.15: Changes to Mailstone since version 4.1
|
||||
|
||||
* Setup now checks license acceptance and configures a basic
|
||||
setup. By default, it will also create a user LDIF file with a
|
||||
'allusers' account.
|
||||
|
||||
* All parameters and and testbed information may now be specified
|
||||
in the workload files (*.wld). New sections: CONFIG, CLIENT,
|
||||
MONITOR, PRETEST, and POSTTEST. Command line parameters still
|
||||
override the files. A complete copy of the configuration is saved
|
||||
in results/<TIMESTAMP>/all.wld.
|
||||
|
||||
* The '*.pl', '*.tbd', and 'config*' files in ./conf/ are
|
||||
depreciated. These should still work, but the new sections are
|
||||
simpler and more flexible.
|
||||
|
||||
* Any CONFIG parameter can now be specified on the command line
|
||||
using the form: 'PARAMETER=value'. Note that PARAMETER is case
|
||||
insensitive. No whitespace is allowed before or after the '='.
|
||||
|
||||
* The new switch '-l' or CONFIG parameter 'ClientCount' can now
|
||||
specify the total number of clients. The 'MaxClients' and
|
||||
'MaxThreads' parameters in each CLIENT section control load
|
||||
balancing. If the 'processes' and 'threads' parameters are set,
|
||||
then the load for that CLIENT section will not be adjusted, but
|
||||
will be taken into account when calculating other CLIENT sections.
|
||||
If just 'processes' is set, then only the thread count will be
|
||||
adjusted. All hosts in a CLIENT section will run the same number
|
||||
of processes and threads.
|
||||
|
||||
* bin/makeusers.pl now creates users, broadcast account, etc.
|
||||
Numbered passwords are now suppored. The new user/password format
|
||||
now replaces '%ld' with the user number to match the rest of
|
||||
mailstone. The ldif/ directory is obsolete. Run "perl/bin/perl
|
||||
bin/makeusers.pl -h" for usage.
|
||||
|
||||
* NT client machines may now be used from a Unix test master. See
|
||||
conf/sample.wld for configuration details.
|
||||
|
||||
* Commands can now be run for a specified block count, error
|
||||
count, or time (whichever comes first). Set 'maxBlocks' and/or
|
||||
'maxErrors'.
|
||||
|
||||
* Telemetry logging to /var/tmp/mstone-log.pn.tn is now performed
|
||||
when "telemetry 1" is specified.
|
||||
|
||||
* The name used in the "CLIENT" section is now used to match
|
||||
"HOSTS=..." qualifier. Compatibility with "hostname" is no longer
|
||||
needed.
|
||||
|
||||
* Config values can now use quoted characters such as \n, \r, \t
|
||||
|
||||
* Config values can be continued using \ (backslash)
|
||||
|
||||
* System configuration information (SYSCONFIG) can now be
|
||||
specified entirely within a workload file by quoting the newlines.
|
||||
|
||||
* Config values get enclosing double-quotes stripped
|
||||
|
||||
* Preliminary support for HTTP and WMAP (WebMail) testing.
|
||||
|
||||
* New table formats are easier to interpret and allow more protocols.
|
||||
|
||||
* The new text format report is easier to machine processes.
|
||||
|
||||
* The following command line switches are now obsolete: -f, -g,
|
||||
-e, -p, and -l. The same functionality can be obtained by
|
||||
FREQUENCY=<interval>, GNUPLOT=<path>, RSH=<path>, RCP=<path>, and
|
||||
TEMPDIR=<directory> respectively.
|
||||
|
||||
* File backups are now created. When ./process is run multiple
|
||||
times, the old files are moved to the ./tmp/<TIMESTAMP>/
|
||||
directory.
|
||||
|
||||
* perl has been updated to include full perl5.005_03 install
|
||||
package. Perl support for each architecture is now under the
|
||||
perl/ directory.
|
||||
@@ -1,222 +0,0 @@
|
||||
|
||||
Mstone 4.15 Quick Installation
|
||||
|
||||
This version of Mstone runs on many current UNIX platforms and NT.
|
||||
Only a web browser and text editor are needed to view the results and
|
||||
configure tests.
|
||||
|
||||
|
||||
QUICK INSTALL
|
||||
-------------
|
||||
|
||||
IMPORTANT: If you have an existing mstone, save a copy of the
|
||||
mstone/conf directory to preserve any configuration files you may want
|
||||
to keep.
|
||||
|
||||
Unpack distribution:
|
||||
|
||||
tar xzf /tmp/mstone_OPT.tar.gz
|
||||
or
|
||||
gunzip -c /tmp/mstone_OPT.tar.gz | tar xf -
|
||||
or
|
||||
unzip /tmp/mstone_OPT.zip
|
||||
|
||||
cd mstone
|
||||
|
||||
Both the tar.gz file and the zip file are identical. Use whichever is
|
||||
more convenient for you.
|
||||
|
||||
This will create a sub-directory named "mstone" with files and
|
||||
directories under that.
|
||||
|
||||
cd mstone
|
||||
|
||||
NOTE: all scripts must be run from the mstone directory.
|
||||
|
||||
|
||||
Do initial configuration:
|
||||
|
||||
Run "mstone config". It will ask you about your system configuration.
|
||||
Fill in the appropriate values and create the optional user accounts
|
||||
and broadcast account. When it asks about client machines, enter them
|
||||
seperated by commas, with no spaces (e.g. host1,host2,host3). If you
|
||||
need to re-configure, run "mstone config".
|
||||
|
||||
The machine starting the test may also be a client. For accurate
|
||||
results, clients should not be run on the test mailserver machine (or
|
||||
its directory server). If all the client machines are not running
|
||||
the same operating system version, see "Configuring Client Machines"
|
||||
below to configure for different OSes.
|
||||
|
||||
When the test master is on NT, only the local machine may be a client
|
||||
and only one process is allowed. You will not be asked about client
|
||||
machines.
|
||||
|
||||
Setup only configures the most important parameters. If you have more
|
||||
advanced needs, edit conf/general.wld appropriately.
|
||||
|
||||
Run "mstone setup". It will now push the necessary files to each
|
||||
client machine. If there are problems (i.e. with rsh permissions),
|
||||
fix them and re-run "mstone setup" until everything works.
|
||||
|
||||
|
||||
Install test accounts:
|
||||
|
||||
Setup will create a file called conf/MAILHOST.ldif (where MAILHOST is the
|
||||
name of your mail server). If you are not using Netscape Messaging
|
||||
and Directory Servers, then you may have to edit the ldif file or use
|
||||
alternate means to create the user accounts.
|
||||
|
||||
To import these users into Netscape Messaging Server, use "add
|
||||
entries" from the directory console or use the ldapmodify command line
|
||||
utility.
|
||||
|
||||
Note: imports will go faster if access logging is disabled. For large
|
||||
user counts (more than 10,000 users), it may be much faster to export
|
||||
the current database, merge the files together manually, and then
|
||||
import the new database.
|
||||
|
||||
Here is how the ldapmodify supplied with Netscape Messaging Server
|
||||
would be used.
|
||||
|
||||
setenv LD_LIBRARY_PATH /usr/netscape/messaging/lib
|
||||
cd /usr/netscape/messaging
|
||||
shared/bin/ldapmodify -h mailhost -a -D 'cn=directory manager' -w d_m_password < conf/MAILHOST.ldif
|
||||
|
||||
|
||||
Check time consistency:
|
||||
|
||||
IMPORTANT: The system time on each client machine must be synchronized
|
||||
within one second of each other for accurate results graphs.
|
||||
|
||||
Run "checktime" to see the time on each client. There should not be
|
||||
more than two seconds difference among the displayed time.
|
||||
|
||||
The best way to synchronize clients is use NTP (Network Time Protocol)
|
||||
or similar protocols (like rdate or timeslave) that have sub second
|
||||
accuracy.
|
||||
|
||||
A simple utility called "timesync" is provide to push the local
|
||||
system time to all clients. You must be root and have root rsh
|
||||
permissions to use timesync. Timesync only works on OSs that support
|
||||
setting seconds using "date MMDDhhmmCCYY.ss". Timesync is only
|
||||
accurate to a second (at best) and should only be used if better
|
||||
protocols aren't available.
|
||||
|
||||
When running the test master on NT, "checktime" and "timesync" are
|
||||
never needed (because there is only one client machine). Timesync
|
||||
will be ignored for NT clients, another method must be used
|
||||
(e.g. timeserv or Dimension4).
|
||||
|
||||
|
||||
Run tests:
|
||||
|
||||
Try it out. Use small process and thread counts until everything is
|
||||
working.
|
||||
|
||||
mstone pop -t 30s
|
||||
|
||||
The script will tell you how many processes and threads it is running
|
||||
on each system and where errors are logged. At the end of the test,
|
||||
it will print out a URL for the test results and an indication of the
|
||||
size of the errorlog file (stderr).
|
||||
|
||||
The results of the mstone run will display statistics for each
|
||||
protocol that was tested. The results are presented in both a HTML
|
||||
web page and a text file. The text file is simple and uniform, while
|
||||
the web page is more user readable. The web page has links to the
|
||||
test configuration files, error log, and the text version.
|
||||
|
||||
For long tests run (e.g. 8 hours), the results can be updated while
|
||||
the test is running by using the "process" utility. Don't run
|
||||
"process" near the very end of the test.
|
||||
|
||||
If a test has to be aborted, then use "process" to generate a report
|
||||
using the available data.
|
||||
|
||||
|
||||
Customize tests:
|
||||
|
||||
Copy and edit the scripts (e.g. "conf/pop.wld") to define new tests.
|
||||
The CONFIG section specifies all the attributes used in the test.
|
||||
Other sections specify the protocols to be tested and the parameters
|
||||
for them.
|
||||
|
||||
All switches can be overridden on the command line to facilitate
|
||||
easier testing. The exact configuration (include command line
|
||||
overrides) is stored with the results from each test.
|
||||
|
||||
|
||||
Maintenance:
|
||||
|
||||
You can run "mstone setup" at any time (except during a test :-) to
|
||||
update the files on the client machines.
|
||||
|
||||
Use "mstone cleanup" to remove the files created by "mstone setup".
|
||||
|
||||
After the test is finished, the directories under "tmp/" can be
|
||||
compressed or deleted to save space. All the information about a test
|
||||
run is stored in the "results/" directories.
|
||||
|
||||
|
||||
Configuring client machines:
|
||||
|
||||
Edit conf/general.wld to include CLIENT sections for each machines to
|
||||
use.
|
||||
|
||||
You can also specify the OS type for each client machine. Set the
|
||||
"Arch" parameter in each CLIENT section as appropriate (e.g. SunOS5.6,
|
||||
Linux2.2_x86, AIX4.2, HP-UXB.11.00, IRIX6.5, OSF1V4.0, WINNT4.0). The
|
||||
directories under "bin" specify the available OS types.
|
||||
|
||||
For NT4.0 clients with a UNIX test master, you will need to configure
|
||||
"command" and "tempDir" for proper operation. See the "HOSTS=winnt01"
|
||||
example in conf/sample.wld.
|
||||
|
||||
The total number of processes and threads that can be supported on a
|
||||
client is dependent on the number of commands in the test, the OS, and
|
||||
available memory. Check the stderr log for messages about not being
|
||||
able to create processes or threads. Check on the client machines
|
||||
during the test and make sure they aren't running out of CPU. The
|
||||
UNIX programs "top" and "vmstat" are good for this. If the client CPU
|
||||
is more than 75% busy, use more machines.
|
||||
|
||||
Also watch out for network saturation. You may have to use machines
|
||||
with separate networks to the server to reach full server load.
|
||||
|
||||
|
||||
Know problems:
|
||||
|
||||
There can be extraneous errors or connections after the specified end
|
||||
of the test. These are most likely do to stopping the test and should
|
||||
be ignored.
|
||||
|
||||
At the end of the test, all current connections will logout without
|
||||
any delays. This can cause very high peak loads.
|
||||
|
||||
If one process exits early (due to misconfiguration or resource
|
||||
exhaustion) and the monitoring command did not specify a count (%c),
|
||||
then the monitoring tasks will be terminated early as well.
|
||||
|
||||
Monitoring commands that specify a count (%c), may take longer than
|
||||
predicted and delay the processing of test results. This is because
|
||||
vmstat actually delays the requested time plus the time needed to
|
||||
generate the statistics summary.
|
||||
|
||||
If you are doing tests with large thread counts, you may have to run
|
||||
as root to allow mailclient to raise its resource limits.
|
||||
|
||||
The telemetry logging for SMTP, POP3, and IMAP4 is incomplete. Most
|
||||
commands are captured, but banners and message contents may be missing.
|
||||
|
||||
The MaxBlocks parameter gets divided by the total number of processes
|
||||
before starting each client. This doesn't account for clients that
|
||||
don't have commands to run.
|
||||
|
||||
The HTTP protocol used by WMAP allows connections to be dropped and
|
||||
re-connected as needed. WMAP logs this as an error and an additional
|
||||
connect. The error log must be consulted to distinguish another types
|
||||
of connection errors (timeout or connection refused) from an automatic
|
||||
re-connect.
|
||||
|
||||
The HTTP protocol test is experimental and subject to change.
|
||||
@@ -1,19 +0,0 @@
|
||||
The contents of this software package are subject to the Netscape
|
||||
Public License Version 1.1 (the "License"); you may not use this
|
||||
software except in compliance with the License. You may obtain a copy
|
||||
of the License at http://www.mozilla.org/NPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS"
|
||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
the License for the specific language governing rights and limitations
|
||||
under the License.
|
||||
|
||||
Alternatively, the this software package may be used under the terms
|
||||
of the GNU Public License (the "GPL"), in which case the provisions of
|
||||
the GPL are applicable instead of those above. If you wish to allow
|
||||
use of your version of this file only under the terms of the GPL and
|
||||
not to allow others to use your version of this file under the NPL,
|
||||
indicate your decision by deleting the provisions above and replace
|
||||
them with the notice and other provisions required by the GPL. If you
|
||||
do not delete the provisions above, a recipient may use your version
|
||||
of this file under either the NPL or the GPL.
|
||||
@@ -1,535 +0,0 @@
|
||||
MOZILLA PUBLIC LICENSE
|
||||
Version 1.1
|
||||
|
||||
---------------
|
||||
|
||||
1. Definitions.
|
||||
|
||||
1.0.1. "Commercial Use" means distribution or otherwise making the
|
||||
Covered Code available to a third party.
|
||||
|
||||
1.1. "Contributor" means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
|
||||
1.2. "Contributor Version" means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the Modifications
|
||||
made by that particular Contributor.
|
||||
|
||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.4. "Electronic Distribution Mechanism" means a mechanism generally
|
||||
accepted in the software development community for the electronic
|
||||
transfer of data.
|
||||
|
||||
1.5. "Executable" means Covered Code in any form other than Source
|
||||
Code.
|
||||
|
||||
1.6. "Initial Developer" means the individual or entity identified
|
||||
as the Initial Developer in the Source Code notice required by Exhibit
|
||||
A.
|
||||
|
||||
1.7. "Larger Work" means a work which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this License.
|
||||
|
||||
1.8. "License" means this document.
|
||||
|
||||
1.8.1. "Licensable" means having the right to grant, to the maximum
|
||||
extent possible, whether at the time of the initial grant or
|
||||
subsequently acquired, any and all of the rights conveyed herein.
|
||||
|
||||
1.9. "Modifications" means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files, a
|
||||
Modification is:
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
|
||||
B. Any new file that contains any part of the Original Code or
|
||||
previous Modifications.
|
||||
|
||||
1.10. "Original Code" means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A as
|
||||
Original Code, and which, at the time of its release under this
|
||||
License is not already Covered Code governed by this License.
|
||||
|
||||
1.10.1. "Patent Claims" means any patent claim(s), now owned or
|
||||
hereafter acquired, including without limitation, method, process,
|
||||
and apparatus claims, in any patent Licensable by grantor.
|
||||
|
||||
1.11. "Source Code" means the preferred form of the Covered Code for
|
||||
making modifications to it, including all modules it contains, plus
|
||||
any associated interface definition files, scripts used to control
|
||||
compilation and installation of an Executable, or source code
|
||||
differential comparisons against either the Original Code or another
|
||||
well known, available Covered Code of the Contributor's choice. The
|
||||
Source Code can be in a compressed or archival form, provided the
|
||||
appropriate decompression or de-archiving software is widely available
|
||||
for no charge.
|
||||
|
||||
1.12. "You" (or "Your") means an individual or a legal entity
|
||||
exercising rights under, and complying with all of the terms of, this
|
||||
License or a future version of this License issued under Section 6.1.
|
||||
For legal entities, "You" includes any entity which controls, is
|
||||
controlled by, or is under common control with You. For purposes of
|
||||
this definition, "control" means (a) the power, direct or indirect,
|
||||
to cause the direction or management of such entity, whether by
|
||||
contract or otherwise, or (b) ownership of more than fifty percent
|
||||
(50%) of the outstanding shares or beneficial ownership of such
|
||||
entity.
|
||||
|
||||
2. Source Code License.
|
||||
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Initial Developer to use, reproduce,
|
||||
modify, display, perform, sublicense and distribute the Original
|
||||
Code (or portions thereof) with or without Modifications, and/or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patents Claims infringed by the making, using or
|
||||
selling of Original Code, to make, have made, use, practice,
|
||||
sell, and offer for sale, and/or otherwise dispose of the
|
||||
Original Code (or portions thereof).
|
||||
|
||||
(c) the licenses granted in this Section 2.1(a) and (b) are
|
||||
effective on the date Initial Developer first distributes
|
||||
Original Code under the terms of this License.
|
||||
|
||||
(d) Notwithstanding Section 2.1(b) above, no patent license is
|
||||
granted: 1) for code that You delete from the Original Code; 2)
|
||||
separate from the Original Code; or 3) for infringements caused
|
||||
by: i) the modification of the Original Code or ii) the
|
||||
combination of the Original Code with other software or devices.
|
||||
|
||||
2.2. Contributor Grant.
|
||||
Subject to third party intellectual property claims, each Contributor
|
||||
hereby grants You a world-wide, royalty-free, non-exclusive license
|
||||
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Contributor, to use, reproduce, modify,
|
||||
display, perform, sublicense and distribute the Modifications
|
||||
created by such Contributor (or portions thereof) either on an
|
||||
unmodified basis, with other Modifications, as Covered Code
|
||||
and/or as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims infringed by the making, using, or
|
||||
selling of Modifications made by that Contributor either alone
|
||||
and/or in combination with its Contributor Version (or portions
|
||||
of such combination), to make, use, sell, offer for sale, have
|
||||
made, and/or otherwise dispose of: 1) Modifications made by that
|
||||
Contributor (or portions thereof); and 2) the combination of
|
||||
Modifications made by that Contributor with its Contributor
|
||||
Version (or portions of such combination).
|
||||
|
||||
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
|
||||
effective on the date Contributor first makes Commercial Use of
|
||||
the Covered Code.
|
||||
|
||||
(d) Notwithstanding Section 2.2(b) above, no patent license is
|
||||
granted: 1) for any code that Contributor has deleted from the
|
||||
Contributor Version; 2) separate from the Contributor Version;
|
||||
3) for infringements caused by: i) third party modifications of
|
||||
Contributor Version or ii) the combination of Modifications made
|
||||
by that Contributor with other software (except as part of the
|
||||
Contributor Version) or other devices; or 4) under Patent Claims
|
||||
infringed by Covered Code in the absence of Modifications made by
|
||||
that Contributor.
|
||||
|
||||
3. Distribution Obligations.
|
||||
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be
|
||||
distributed only under the terms of this License or a future version
|
||||
of this License released under Section 6.1, and You must include a
|
||||
copy of this License with every copy of the Source Code You
|
||||
distribute. You may not offer or impose any terms on any Source Code
|
||||
version that alters or restricts the applicable version of this
|
||||
License or the recipients' rights hereunder. However, You may include
|
||||
an additional document offering the additional rights described in
|
||||
Section 3.5.
|
||||
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must be
|
||||
made available in Source Code form under the terms of this License
|
||||
either on the same media as an Executable version or via an accepted
|
||||
Electronic Distribution Mechanism to anyone to whom you made an
|
||||
Executable version available; and if made available via Electronic
|
||||
Distribution Mechanism, must remain available for at least twelve (12)
|
||||
months after the date it initially became available, or at least six
|
||||
(6) months after a subsequent version of that particular Modification
|
||||
has been made available to such recipients. You are responsible for
|
||||
ensuring that the Source Code version remains available even if the
|
||||
Electronic Distribution Mechanism is maintained by a third party.
|
||||
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which You contribute to contain a
|
||||
file documenting the changes You made to create that Covered Code and
|
||||
the date of any change. You must include a prominent statement that
|
||||
the Modification is derived, directly or indirectly, from Original
|
||||
Code provided by the Initial Developer and including the name of the
|
||||
Initial Developer in (a) the Source Code, and (b) in any notice in an
|
||||
Executable version or related documentation in which You describe the
|
||||
origin or ownership of the Covered Code.
|
||||
|
||||
3.4. Intellectual Property Matters
|
||||
(a) Third Party Claims.
|
||||
If Contributor has knowledge that a license under a third party's
|
||||
intellectual property rights is required to exercise the rights
|
||||
granted by such Contributor under Sections 2.1 or 2.2,
|
||||
Contributor must include a text file with the Source Code
|
||||
distribution titled "LEGAL" which describes the claim and the
|
||||
party making the claim in sufficient detail that a recipient will
|
||||
know whom to contact. If Contributor obtains such knowledge after
|
||||
the Modification is made available as described in Section 3.2,
|
||||
Contributor shall promptly modify the LEGAL file in all copies
|
||||
Contributor makes available thereafter and shall take other steps
|
||||
(such as notifying appropriate mailing lists or newsgroups)
|
||||
reasonably calculated to inform those who received the Covered
|
||||
Code that new knowledge has been obtained.
|
||||
|
||||
(b) Contributor APIs.
|
||||
If Contributor's Modifications include an application programming
|
||||
interface and Contributor has knowledge of patent licenses which
|
||||
are reasonably necessary to implement that API, Contributor must
|
||||
also include this information in the LEGAL file.
|
||||
|
||||
(c) Representations.
|
||||
Contributor represents that, except as disclosed pursuant to
|
||||
Section 3.4(a) above, Contributor believes that Contributor's
|
||||
Modifications are Contributor's original creation(s) and/or
|
||||
Contributor has sufficient rights to grant the rights conveyed by
|
||||
this License.
|
||||
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the Source
|
||||
Code. If it is not possible to put such notice in a particular Source
|
||||
Code file due to its structure, then You must include such notice in a
|
||||
location (such as a relevant directory) where a user would be likely
|
||||
to look for such a notice. If You created one or more Modification(s)
|
||||
You may add your name as a Contributor to the notice described in
|
||||
Exhibit A. You must also duplicate this License in any documentation
|
||||
for the Source Code where You describe recipients' rights or ownership
|
||||
rights relating to Covered Code. You may choose to offer, and to
|
||||
charge a fee for, warranty, support, indemnity or liability
|
||||
obligations to one or more recipients of Covered Code. However, You
|
||||
may do so only on Your own behalf, and not on behalf of the Initial
|
||||
Developer or any Contributor. You must make it absolutely clear than
|
||||
any such warranty, support, indemnity or liability obligation is
|
||||
offered by You alone, and You hereby agree to indemnify the Initial
|
||||
Developer and every Contributor for any liability incurred by the
|
||||
Initial Developer or such Contributor as a result of warranty,
|
||||
support, indemnity or liability terms You offer.
|
||||
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
||||
and if You include a notice stating that the Source Code version of
|
||||
the Covered Code is available under the terms of this License,
|
||||
including a description of how and where You have fulfilled the
|
||||
obligations of Section 3.2. The notice must be conspicuously included
|
||||
in any notice in an Executable version, related documentation or
|
||||
collateral in which You describe recipients' rights relating to the
|
||||
Covered Code. You may distribute the Executable version of Covered
|
||||
Code or ownership rights under a license of Your choice, which may
|
||||
contain terms different from this License, provided that You are in
|
||||
compliance with the terms of this License and that the license for the
|
||||
Executable version does not attempt to limit or alter the recipient's
|
||||
rights in the Source Code version from the rights set forth in this
|
||||
License. If You distribute the Executable version under a different
|
||||
license You must make it absolutely clear that any terms which differ
|
||||
from this License are offered by You alone, not by the Initial
|
||||
Developer or any Contributor. You hereby agree to indemnify the
|
||||
Initial Developer and every Contributor for any liability incurred by
|
||||
the Initial Developer or such Contributor as a result of any such
|
||||
terms You offer.
|
||||
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other code
|
||||
not governed by the terms of this License and distribute the Larger
|
||||
Work as a single product. In such a case, You must make sure the
|
||||
requirements of this License are fulfilled for the Covered Code.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description
|
||||
must be included in the LEGAL file described in Section 3.4 and must
|
||||
be included with all distributions of the Source Code. Except to the
|
||||
extent prohibited by statute or regulation, such description must be
|
||||
sufficiently detailed for a recipient of ordinary skill to be able to
|
||||
understand it.
|
||||
|
||||
5. Application of this License.
|
||||
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A and to related Covered Code.
|
||||
|
||||
6. Versions of the License.
|
||||
|
||||
6.1. New Versions.
|
||||
Netscape Communications Corporation ("Netscape") may publish revised
|
||||
and/or new versions of the License from time to time. Each version
|
||||
will be given a distinguishing version number.
|
||||
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of the
|
||||
License, You may always continue to use it under the terms of that
|
||||
version. You may also choose to use such Covered Code under the terms
|
||||
of any subsequent version of the License published by Netscape. No one
|
||||
other than Netscape has the right to modify the terms applicable to
|
||||
Covered Code created under this License.
|
||||
|
||||
6.3. Derivative Works.
|
||||
If You create or use a modified version of this License (which you may
|
||||
only do in order to apply it to code which is not already Covered Code
|
||||
governed by this License), You must (a) rename Your license so that
|
||||
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
|
||||
"MPL", "NPL" or any confusingly similar phrase do not appear in your
|
||||
license (except to note that your license differs from this License)
|
||||
and (b) otherwise make it clear that Your version of the license
|
||||
contains terms which differ from the Mozilla Public License and
|
||||
Netscape Public License. (Filling in the name of the Initial
|
||||
Developer, Original Code or Contributor in the notice described in
|
||||
Exhibit A shall not of themselves be deemed to be modifications of
|
||||
this License.)
|
||||
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||
|
||||
8. TERMINATION.
|
||||
|
||||
8.1. This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code which are properly granted shall
|
||||
survive any termination of this License. Provisions which, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
|
||||
8.2. If You initiate litigation by asserting a patent infringement
|
||||
claim (excluding declatory judgment actions) against Initial Developer
|
||||
or a Contributor (the Initial Developer or Contributor against whom
|
||||
You file such action is referred to as "Participant") alleging that:
|
||||
|
||||
(a) such Participant's Contributor Version directly or indirectly
|
||||
infringes any patent, then any and all rights granted by such
|
||||
Participant to You under Sections 2.1 and/or 2.2 of this License
|
||||
shall, upon 60 days notice from Participant terminate prospectively,
|
||||
unless if within 60 days after receipt of notice You either: (i)
|
||||
agree in writing to pay Participant a mutually agreeable reasonable
|
||||
royalty for Your past and future use of Modifications made by such
|
||||
Participant, or (ii) withdraw Your litigation claim with respect to
|
||||
the Contributor Version against such Participant. If within 60 days
|
||||
of notice, a reasonable royalty and payment arrangement are not
|
||||
mutually agreed upon in writing by the parties or the litigation claim
|
||||
is not withdrawn, the rights granted by Participant to You under
|
||||
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
|
||||
the 60 day notice period specified above.
|
||||
|
||||
(b) any software, hardware, or device, other than such Participant's
|
||||
Contributor Version, directly or indirectly infringes any patent, then
|
||||
any rights granted to You by such Participant under Sections 2.1(b)
|
||||
and 2.2(b) are revoked effective as of the date You first made, used,
|
||||
sold, distributed, or had made, Modifications made by that
|
||||
Participant.
|
||||
|
||||
8.3. If You assert a patent infringement claim against Participant
|
||||
alleging that such Participant's Contributor Version directly or
|
||||
indirectly infringes any patent where such claim is resolved (such as
|
||||
by license or settlement) prior to the initiation of patent
|
||||
infringement litigation, then the reasonable value of the licenses
|
||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
||||
into account in determining the amount or value of any payment or
|
||||
license.
|
||||
|
||||
8.4. In the event of termination under Sections 8.1 or 8.2 above,
|
||||
all end user license agreements (excluding distributors and resellers)
|
||||
which have been validly granted by You or any distributor hereunder
|
||||
prior to termination shall survive termination.
|
||||
|
||||
9. LIMITATION OF LIABILITY.
|
||||
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
|
||||
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
|
||||
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
|
||||
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
|
||||
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
|
||||
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
||||
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
|
||||
The Covered Code is a "commercial item," as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
|
||||
software" and "commercial computer software documentation," as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
|
||||
11. MISCELLANEOUS.
|
||||
|
||||
This License represents the complete agreement concerning subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. This License shall be governed by
|
||||
California law provisions (except to the extent applicable law, if
|
||||
any, provides otherwise), excluding its conflict-of-law provisions.
|
||||
With respect to disputes in which at least one party is a citizen of,
|
||||
or an entity chartered or registered to do business in the United
|
||||
States of America, any litigation relating to this License shall be
|
||||
subject to the jurisdiction of the Federal Courts of the Northern
|
||||
District of California, with venue lying in Santa Clara County,
|
||||
California, with the losing party responsible for costs, including
|
||||
without limitation, court costs and reasonable attorneys' fees and
|
||||
expenses. The application of the United Nations Convention on
|
||||
Contracts for the International Sale of Goods is expressly excluded.
|
||||
Any law or regulation which provides that the language of a contract
|
||||
shall be construed against the drafter shall not apply to this
|
||||
License.
|
||||
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
|
||||
As between Initial Developer and the Contributors, each party is
|
||||
responsible for claims and damages arising, directly or indirectly,
|
||||
out of its utilization of rights under this License and You agree to
|
||||
work with Initial Developer and Contributors to distribute such
|
||||
responsibility on an equitable basis. Nothing herein is intended or
|
||||
shall be deemed to constitute any admission of liability.
|
||||
|
||||
13. MULTIPLE-LICENSED CODE.
|
||||
|
||||
Initial Developer may designate portions of the Covered Code as
|
||||
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
|
||||
Developer permits you to utilize portions of the Covered Code under
|
||||
Your choice of the NPL or the alternative licenses, if any, specified
|
||||
by the Initial Developer in the file described in Exhibit A.
|
||||
|
||||
EXHIBIT A-Netscape Public License.
|
||||
|
||||
"The contents of this file are subject to the Netscape Public
|
||||
License Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License. You may obtain a copy of
|
||||
the License at http://www.mozilla.org/NPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS
|
||||
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
implied. See the License for the specific language governing
|
||||
rights and limitations under the License.
|
||||
|
||||
The Original Code is the Netscape Mailstone code, released
|
||||
March 17, 2000.
|
||||
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
Marcel DePaolis <marcel@netscape.com>
|
||||
Jim Salter <jsalter@netscape.com>
|
||||
Mike Blakely, David Shak, Brain Williams
|
||||
|
||||
Alternatively, the contents of this file may be used under the
|
||||
terms of the GNU General Public license Version 2 or later
|
||||
(the "GPL"), in which case the provisions of GPL are
|
||||
applicable instead of those above. If you wish to allow use
|
||||
of your version of this file only under the terms of the GPL
|
||||
and not to allow others to use your version of this file
|
||||
under the NPL, indicate your decision by deleting the
|
||||
provisions above and replace them with the notice and other
|
||||
provisions required by the GPL. If you do not delete the
|
||||
provisions above, a recipient may use your version of this
|
||||
file under either the NPL or the GPL License."
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
AMENDMENTS
|
||||
|
||||
The Netscape Public License Version 1.1 ("NPL") consists of the
|
||||
Mozilla Public License Version 1.1 with the following Amendments,
|
||||
including Exhibit A-Netscape Public License. Files identified with
|
||||
"Exhibit A-Netscape Public License" are governed by the Netscape
|
||||
Public License Version 1.1.
|
||||
|
||||
Additional Terms applicable to the Netscape Public License.
|
||||
I. Effect.
|
||||
These additional terms described in this Netscape Public
|
||||
License -- Amendments shall apply to the Mozilla Communicator
|
||||
client code and to all Covered Code under this License.
|
||||
|
||||
II. "Netscape's Branded Code" means Covered Code that Netscape
|
||||
distributes and/or permits others to distribute under one or more
|
||||
trademark(s) which are controlled by Netscape but which are not
|
||||
licensed for use under this License.
|
||||
|
||||
III. Netscape and logo.
|
||||
This License does not grant any rights to use the trademarks
|
||||
"Netscape", the "Netscape N and horizon" logo or the "Netscape
|
||||
lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
|
||||
"Smart Browsing" even if such marks are included in the Original
|
||||
Code or Modifications.
|
||||
|
||||
IV. Inability to Comply Due to Contractual Obligation.
|
||||
Prior to licensing the Original Code under this License, Netscape
|
||||
has licensed third party code for use in Netscape's Branded Code.
|
||||
To the extent that Netscape is limited contractually from making
|
||||
such third party code available under this License, Netscape may
|
||||
choose to reintegrate such code into Covered Code without being
|
||||
required to distribute such code in Source Code form, even if
|
||||
such code would otherwise be considered "Modifications" under
|
||||
this License.
|
||||
|
||||
V. Use of Modifications and Covered Code by Initial Developer.
|
||||
V.1. In General.
|
||||
The obligations of Section 3 apply to Netscape, except to
|
||||
the extent specified in this Amendment, Section V.2 and V.3.
|
||||
|
||||
V.2. Other Products.
|
||||
Netscape may include Covered Code in products other than the
|
||||
Netscape's Branded Code which are released by Netscape
|
||||
during the two (2) years following the release date of the
|
||||
Original Code, without such additional products becoming
|
||||
subject to the terms of this License, and may license such
|
||||
additional products on different terms from those contained
|
||||
in this License.
|
||||
|
||||
V.3. Alternative Licensing.
|
||||
Netscape may license the Source Code of Netscape's Branded
|
||||
Code, including Modifications incorporated therein, without
|
||||
such Netscape Branded Code becoming subject to the terms of
|
||||
this License, and may license such Netscape Branded Code on
|
||||
different terms from those contained in this License.
|
||||
|
||||
VI. Litigation.
|
||||
Notwithstanding the limitations of Section 11 above, the
|
||||
provisions regarding litigation in Section 11(a), (b) and (c) of
|
||||
the License shall apply to all disputes relating to this License.
|
||||
|
||||
@@ -1,246 +0,0 @@
|
||||
# Makefile for mstone
|
||||
# use gmake
|
||||
# Builds each of the components and then packages everything
|
||||
|
||||
topsrcdir = .
|
||||
|
||||
CP := cp -p
|
||||
|
||||
ifndef INCLUDED_CONFIG_MK
|
||||
include $(topsrcdir)/config/config.mk
|
||||
endif
|
||||
|
||||
|
||||
# dynamically find the optional directories names
|
||||
LIBGD_DIR = $(wildcard gd?.*)
|
||||
GNUPLOT_DIR = $(wildcard gnuplot-?.*)
|
||||
PERL_DIR = $(wildcard perl5.*)
|
||||
|
||||
# file that we package
|
||||
GDFILES = gd.txt gd.html libgd.* gd.h demoin.gif gddemo giftogd webgif
|
||||
GNUPLOTFILES = gnuplot Copyright gnuplot_x11 gnuplot.1 gnuplot.gih
|
||||
|
||||
VERSION = 4.3
|
||||
TARBALL = mstone-$(VERSION)-$(NSARCH)$(OBJDIR_TAG).tar.gz
|
||||
ZIPFILE = mstone-$(VERSION)-$(NSARCH)$(OBJDIR_TAG).zip
|
||||
TARBALL_ALL = mstone-$(VERSION)-all$(OBJDIR_TAG).tar.gz
|
||||
ZIPFILE_ALL = mstone-$(VERSION)-all$(OBJDIR_TAG).zip
|
||||
|
||||
NTFILES = mstone.bat process.bat setup.bat
|
||||
|
||||
all:: usage
|
||||
|
||||
usage::
|
||||
@$(ECHO) "gmake [ release | rpackage | debug | dpackage ]"
|
||||
@$(ECHO) " [ DIST=/m/dist/mailstone/1999xxxx dist ]"
|
||||
@$(ECHO) " [ all_DBG | all_OPT ]"
|
||||
@$(ECHO) "perl is" $(PERL_DIR) ". gd is" $(LIBGD_DIR) ". gnuplot is" $(GNUPLOT_DIR) "."
|
||||
|
||||
targets:: $(OBJDIR) mailclient
|
||||
|
||||
ifneq (,$(LIBGD_DIR))
|
||||
targets:: libgd
|
||||
endif
|
||||
|
||||
ifneq (,$(GNUPLOT_DIR))
|
||||
targets:: gnuplot
|
||||
endif
|
||||
|
||||
ifneq (,$(PERL_DIR))
|
||||
targets:: perl
|
||||
endif
|
||||
|
||||
$(OBJDIR):
|
||||
-mkdir -p $(OBJDIR)
|
||||
|
||||
mailclient::
|
||||
@$(ECHO) "\n===== [`date`] making OS_CONFIG=$(NSARCH) BUILD_VARIANT=$(BUILD_VARIANT)\n"
|
||||
cd src; $(MAKE) BUILD_VARIANT=$(BUILD_VARIANT) OBJDIR=../$(OBJDIR) PKGDIR=../$(PKGDIR) all
|
||||
|
||||
# Use our top level makefiles to drive the component builds
|
||||
libgd $(OBJDIR)/gd/libgd.a::
|
||||
$(MAKE) -f gd.mk LIBGD_DIR=$(LIBGD_DIR) libgd
|
||||
|
||||
gnuplot $(OBJDIR)/gnuplot/gnuplot::
|
||||
$(MAKE) -f gnuplot.mk LIBGD_DIR=$(LIBGD_DIR) GNUPLOT_DIR=$(GNUPLOT_DIR) gnuplot
|
||||
|
||||
perl $(OBJDIR)/perl/perl::
|
||||
$(MAKE) -f perl.mk PERL_DIR=$(PERL_DIR) perl
|
||||
|
||||
# Create packaging binary directories
|
||||
# Note: dont make gd or gnuplot here. For multi-OS, they are links
|
||||
mkpkgdirs:: $(PKGDIR)/bin $(PKGDIR)/conf $(PKGDIR)/data $(PKGDIR)/doc
|
||||
|
||||
$(PKGDIR)/bin:
|
||||
mkdir -p $(PKGDIR)/bin
|
||||
|
||||
$(PKGDIR)/conf:
|
||||
mkdir -p $(PKGDIR)/conf
|
||||
|
||||
$(PKGDIR)/data:
|
||||
mkdir -p $(PKGDIR)/data
|
||||
|
||||
$(PKGDIR)/doc:
|
||||
mkdir -p $(PKGDIR)/doc
|
||||
|
||||
$(PKGDIR)/gd:
|
||||
mkdir -p $(PKGDIR)/gd
|
||||
|
||||
$(PKGDIR)/gnuplot:
|
||||
mkdir -p $(PKGDIR)/gnuplot
|
||||
|
||||
$(PKGDIR)/perl:
|
||||
mkdir -p $(PKGDIR)/perl
|
||||
|
||||
|
||||
# operating system independent share-files (at least for Unix)
|
||||
pkg-share-files:: mkpkgdirs
|
||||
@$(ECHO) "\n===== [`date`] making package share-files...\n"
|
||||
$(CP) mstone process $(PKGDIR)
|
||||
(cd $(PKGDIR); [ ! -f setup ] || rm -f setup; ln -s mstone setup)
|
||||
(cd $(PKGDIR); [ ! -f cleanup ] || rm -f cleanup; ln -s mstone cleanup)
|
||||
(cd $(PKGDIR); [ ! -f checktime ] || rm -f checktime; ln -s mstone checktime)
|
||||
(cd $(PKGDIR); [ ! -f timesync ] || rm -f timesync; ln -s mstone timesync)
|
||||
$(CP) nsarch bin/*.pl $(PKGDIR)/bin
|
||||
$(CP) conf/*.wld conf/*.wld.in conf/*.html $(PKGDIR)/conf
|
||||
$(CP) data/*.msg $(PKGDIR)/data
|
||||
$(CP) doc/*.html doc/*.gif $(PKGDIR)/doc
|
||||
$(CP) INSTALL $(PKGDIR)
|
||||
$(CP) README $(PKGDIR)
|
||||
$(CP) ChangeLog $(PKGDIR)
|
||||
$(CP) LICENSE $(PKGDIR)
|
||||
|
||||
# split out OS specific file so that combined packaging possible (set PKGDIR)
|
||||
pkg-arch-files-gd:: $(PKGDIR)/gd $(OBJDIR)/gd/libgd.a
|
||||
$(CP) $(addprefix $(OBJDIR)/gd/, $(GDFILES)) $(PKGDIR)/gd
|
||||
-$(STRIP) $(PKGDIR)/gd/webgif $(PKGDIR)/gd/giftogd $(PKGDIR)/gd/gddemo
|
||||
|
||||
pkg-arch-files-gnuplot:: $(PKGDIR)/gnuplot $(OBJDIR)/gnuplot/gnuplot
|
||||
$(CP) $(addprefix $(OBJDIR)/gnuplot/, $(GNUPLOTFILES)) $(PKGDIR)/gnuplot
|
||||
-$(STRIP) $(PKGDIR)/gnuplot/gnuplot $(PKGDIR)/gnuplot/gnuplot_x11
|
||||
|
||||
ifneq (,$(LIBGD_DIR))
|
||||
pkg-arch-files:: pkg-arch-files-gd
|
||||
endif
|
||||
|
||||
ifneq (,$(GNUPLOT_DIR))
|
||||
pkg-arch-files:: pkg-arch-files-gnuplot
|
||||
endif
|
||||
|
||||
pkg-arch-files:: $(PKGDIR)/bin $(OBJDIR)/mailclient
|
||||
@$(ECHO) "\n===== [`date`] making package arch-files...\n"
|
||||
$(CP) $(OBJDIR)/mailclient $(PKGDIR)/bin
|
||||
-$(STRIP) $(PKGDIR)/bin/mailclient
|
||||
|
||||
pkg-perl-files:: $(PKGDIR)/bin $(OBJDIR)/perl/perl
|
||||
@$(ECHO) "\n===== [`date`] making package perl-files...\n"
|
||||
$(MAKE) -f perl.mk PERL_DIR=$(PERL_DIR) \
|
||||
BUILD_VARIANT=$(BUILD_VARIANT) \
|
||||
OBJDIR=$(OBJDIR) PKGDIR=$(PKGDIR) package-perl
|
||||
find $(PKGDIR)/perl/lib -name .packlist -exec rm {} \; -print
|
||||
-$(STRIP) $(PKGDIR)/perl/bin/perl
|
||||
-$(STRIP) $(PKGDIR)/perl/bin/a2p
|
||||
|
||||
# for combined packaging, this should not be part of pkg-arch-files
|
||||
# perl is handled seperately do to its size
|
||||
ifneq (,$(PERL_DIR))
|
||||
pkg:: pkg-perl-files
|
||||
endif
|
||||
|
||||
pkg:: targets pkg-share-files pkg-arch-files
|
||||
|
||||
tarball: build/$(TARBALL)
|
||||
|
||||
build/$(TARBALL):
|
||||
@$(ECHO) "\n===== [`date`] making os tar file...\n"
|
||||
-rm -f build/$(TARBALL)
|
||||
cd $(dir $(PKGDIR)) && tar cf - . | gzip > ../../$(TARBALL)
|
||||
|
||||
zipfile: build/$(ZIPFILE)
|
||||
|
||||
build/$(ZIPFILE):
|
||||
@$(ECHO) "\n===== [`date`] making os zip file...\n"
|
||||
-rm -f build/$(ZIPFILE)
|
||||
cd $(dir $(PKGDIR)) && zip -r -q ../../$(ZIPFILE) .
|
||||
|
||||
|
||||
########################################################################
|
||||
# Generate a combined build for every Unix OS that is already packaged
|
||||
# NT has to be done seperately because it has different file names
|
||||
# We have to nuke some old parts, because permissions wont allow overwrites
|
||||
# Finally, dont ship perl development headers and libraries
|
||||
all_DBG all_OPT::
|
||||
@$(ECHO) "===== [`date`] unified packaging for $@..."
|
||||
$(MAKE) NSARCH=$@ OBJDIR_TAG='' \
|
||||
PKGDIR=$(topsrcdir)/build/package/$@.OBJ/mstone pkg-share-files
|
||||
./ospkg.sh $@.OBJ \
|
||||
$(notdir $(shell ls -d build/package/[A-Z]*$(subst all,,$@.OBJ)))
|
||||
[ -d $(topsrcdir)/build/package/$@.OBJ/mstone/bin/WINNT4.0 ] \
|
||||
&& cp -p $(NTFILES) $(topsrcdir)/build/package/$@.OBJ/mstone; :
|
||||
-rm -f ./build/mstone-$(VERSION)-$@.tar.gz
|
||||
cd ./build/package/$@.OBJ \
|
||||
&& tar cf - . | gzip > ../../mstone-$(VERSION)-$@.tar.gz
|
||||
-rm -f ./build/mstone-$(VERSION)-$@.zip
|
||||
cd ./build/package/$@.OBJ \
|
||||
&& zip -r -q ../../mstone-$(VERSION)-$@.zip .
|
||||
|
||||
|
||||
########################################################################
|
||||
# Copy all the packaged trees to the distribution site
|
||||
# Copy in the unified tarball and zip file
|
||||
# Link mstone to mailstone for Netscape back compatibility
|
||||
# Re-map short Linux name to standard Netscape convention
|
||||
dist::
|
||||
@[ "$(DIST)" != "" ] || ($(MAKE) usage && /bin/false)
|
||||
@[ ! -d "$(DIST)" ] || ($(ECHO) "Error: $(DIST) already exists" && \
|
||||
$(MAKE) usage && /bin/false)
|
||||
mkdir -p $(DIST)
|
||||
cp -p build/mstone-$(VERSION)-all_*.*[a-z] $(DIST)/
|
||||
(cd build/package; tar cf - *.OBJ) | (cd $(DIST); tar xf - )
|
||||
for l in $(DIST)/*_???.OBJ ; do \
|
||||
(cd $$l; ln -s mstone mailstone); done
|
||||
cd $(DIST); for l in Linux*_???.OBJ ; do \
|
||||
nn=`echo $$l | sed -e 's/_OPT/_glibc_PTH_OPT/' | sed -e 's/_DBG/_glibc_PTH_DBG/'`; \
|
||||
ln -s $$l $$nn; done
|
||||
|
||||
# since the default is release mode, this can just work off a dependency
|
||||
release:: targets
|
||||
#release::
|
||||
# @$(ECHO) "\n===== [`date`] making release build..."
|
||||
# $(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT targets
|
||||
@$(ECHO) "\n===== [`date`] making release build done."
|
||||
|
||||
rpackage:: release pkg #tarball zipfile
|
||||
#rpackage:: release
|
||||
# @$(ECHO) "\n===== [`date`] making release package..."
|
||||
# $(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT pkg tarball zipfile
|
||||
@$(ECHO) "\n===== [`date`] making release package done."
|
||||
|
||||
# since the default is release mode, start a make with the right mode
|
||||
debug::
|
||||
@$(ECHO) "\n===== [`date`] making debug build..."
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG targets
|
||||
@$(ECHO) "\n===== [`date`] making debug build done."
|
||||
|
||||
# We dont usually bother to tar up a debug build
|
||||
dpackage:: debug
|
||||
@$(ECHO) "\n===== [`date`] making debug package..."
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG pkg
|
||||
@$(ECHO) "\n===== [`date`] making debug package done."
|
||||
|
||||
# These are old and may be broken
|
||||
cleanvariant::
|
||||
(cd src; $(MAKE) OBJDIR=../$(OBJDIR) clean)
|
||||
rm -rf $(PKGDIR)
|
||||
|
||||
clean::
|
||||
$(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT cleanvariant
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG cleanvariant
|
||||
|
||||
distcleanvariant::
|
||||
(cd src; $(MAKE) OBJDIR=../$(OBJDIR) distclean)
|
||||
rm -rf $(OBJDIR) $(PKGDIR)
|
||||
|
||||
distclean:: clean
|
||||
$(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT distcleanvariant
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG distcleanvariant
|
||||
@@ -1,76 +0,0 @@
|
||||
|
||||
MSTONE 4.2
|
||||
|
||||
Mstone is a mail server performance testing tool designed to simulate
|
||||
the different types and volume of mail traffic a mail server would
|
||||
experience during a peak activity period. Mstone was formerly known
|
||||
as Mailstone.
|
||||
|
||||
A quick installation guide is available in INSTALL.
|
||||
|
||||
The full Mailstone 4.15 user manual is available at
|
||||
http://developer.iplanet.com/docs/manuals/messaging.html
|
||||
|
||||
|
||||
Testing strategy
|
||||
----------------
|
||||
|
||||
Mstone is capable of opening SMTP, POP3, IMAP4, and other protocol
|
||||
connections to mail servers. The number and type of connections made
|
||||
to the mail server is based on a weighted command list which provides
|
||||
the ability to test mail server implementation requirements.
|
||||
|
||||
A series of perl script allow you to setup client machines, run tests,
|
||||
and then cleanup client machine files. Each client machine has a copy
|
||||
of the mailclient program and SMTP message files. When the test is
|
||||
run, the mailclient is started with the proper command line and work load.
|
||||
|
||||
After experimenting with mstone loads, you will notice that there
|
||||
are a few factors that can distort server the byte and message
|
||||
throughput. You will find that the server byte throughput is related
|
||||
to the average SMTP message (file) size. Also, server throughput, in
|
||||
bytes and messages, is affected by larger than normal POP3/IMAP4
|
||||
mailboxes. So it is important to approach the mstone command
|
||||
configuration with data collected from existing mail server
|
||||
implementations, for example, a customer might say "during our peak
|
||||
activity in the morning, we handle up to two thousand employees
|
||||
sending an average of 5 messages of 20K average size and receiving 25
|
||||
messages of same size". With input like this, you can begin tuning
|
||||
mstone to generate relevant data.
|
||||
|
||||
There are two important things to consider when reviewing the results of
|
||||
mstone performance analysis: Was the test run on target for
|
||||
simulating the type and volume of mail traffic; and did the server, both
|
||||
software and machine, handle the load within an acceptable margin?
|
||||
|
||||
With this information, it can be determined: whether enough SMTP
|
||||
connections were made to the server during the run, and how many
|
||||
messages were downloaded over how many POP3/IMAP4 connections. If the
|
||||
number of SMTP connections is not in the acceptable range, then
|
||||
consider adding more client processes/machines or checking the server
|
||||
performance during the run. The message/connection ratio for
|
||||
POP3/IMAP4 should be checked for soundness, and adjustments should be
|
||||
made to the mailboxes before running the next test.
|
||||
|
||||
Monitoring the server performance during test runs is crucial in
|
||||
understanding the results. If the number of client connections is not
|
||||
being achieved and the server cpu usage and process run queue is not
|
||||
settling down after the initial spike, then modifications to the server
|
||||
architecture could be in order.
|
||||
|
||||
The analysis of mstone results is an iterative process of client
|
||||
(mstone client) and server tuning. The bottom line is to determine
|
||||
whether the messaging solution can handle the type of load expected in
|
||||
an acceptable manner.
|
||||
|
||||
|
||||
Server Log Tuning
|
||||
-----------------
|
||||
The Messaging and Directory server ship with access logging enabled by
|
||||
default. This gives the most information about what is going on in
|
||||
the system, but can reduce performance. You should test the way the
|
||||
system will be run.
|
||||
|
||||
Noticeable performance increases are often obtained by disabling access
|
||||
logging on the directory server and by reducing the logging level of
|
||||
the messaging servers from "Notice" to "Warning".
|
||||
@@ -1,189 +0,0 @@
|
||||
Mstone TODO List
|
||||
|
||||
Updated:
|
||||
3-20-2000 Dan Christian
|
||||
|
||||
======================================================================
|
||||
Minor improvements
|
||||
|
||||
Data reduction at each testbed client
|
||||
|
||||
Test message generator (plain and MIME styles)
|
||||
|
||||
More graphs for multiple runs
|
||||
|
||||
Option to drop a fraction of connections
|
||||
|
||||
IMAP delete without reading
|
||||
Just get the message list and delete everything. This could
|
||||
be the fastest way to drain out the store.
|
||||
|
||||
|
||||
Display MIN/MAX or standard deviation on graphs
|
||||
Gnuplot can do data points with error bars. You could either
|
||||
use MIN/MAX or the standard deviation for the error bars. There are
|
||||
issues with calculating the standard deviation numbers throughout the
|
||||
graph that need to be addressed.
|
||||
|
||||
|
||||
Statistics reset
|
||||
At least the MIN and MAX statistics could be easily reset
|
||||
during the test (after ramp up). This keeps the transients during
|
||||
startup and shutdown from dominating these numbers. The standard
|
||||
deviation statistics are much trickier to reset during the run. It
|
||||
may be better to isolate sections in post processing.
|
||||
|
||||
|
||||
Perl web server
|
||||
Sometimes it would be nice to include our own web server to
|
||||
provide the results (instead of using file: URLs). This would also be
|
||||
a gateway to form based test configuration editing and allow results
|
||||
to be interactively updated during tests. Perl with a socket library
|
||||
could handle this without too much trouble.
|
||||
|
||||
|
||||
Dynamic test loading
|
||||
Finalize an API for dynamically loading tests. This would
|
||||
allow tests to be added or updated separately from the core
|
||||
functionality. This may be needed for some types of security testing.
|
||||
|
||||
|
||||
Link graphs to the results tables
|
||||
There are already tags by each graph. You should be able to
|
||||
link the appropriate results table entry to each graph. This sort of
|
||||
tricky since graphs often combine multiple entries.
|
||||
|
||||
|
||||
Show statistics for every block
|
||||
Statistics are actually kept for every block in every thread.
|
||||
There should be a way to view information at this detail.
|
||||
|
||||
|
||||
Man pages
|
||||
The online docs are nice, but good 'ol man pages would be
|
||||
great in a different way.
|
||||
|
||||
|
||||
Reduce namespace polution
|
||||
Scripts names like setup and cleanup are too general. They
|
||||
|
||||
should be part of the main 'mstone' script (e.g. mstone setup).
|
||||
|
||||
Examples of script series
|
||||
Include example scripts to run entire series of tests in a
|
||||
sane way.
|
||||
|
||||
|
||||
Fix FORMAT clash
|
||||
At the start of a test, each client process outputs the
|
||||
information needed to report all its protocols. When there are
|
||||
multiple processes on one client, these FORMAT lines can intermix and
|
||||
cause parsing errors.
|
||||
|
||||
|
||||
Set connection drop rate
|
||||
Drop some percentage of the connections without a proper
|
||||
shutdown. This tests how well a server can detect and recover from
|
||||
hard disconnects.
|
||||
|
||||
|
||||
Improve randomness
|
||||
The way that we generate random numbers in a range may be not
|
||||
generate the proper randomness. We are using lrand48()%range we
|
||||
should use (lrand48/RAND_RANGE)*range. There are some end conditions
|
||||
that need to be thought about. All of this is in the sequence code;
|
||||
one change should fix (or break :) everything.
|
||||
|
||||
Also, we may be generating numbers that are never used. This
|
||||
may be costly, and can create holes in the proper sequence.
|
||||
|
||||
|
||||
Improve printing
|
||||
The color graphs are great on screen, but tend to print
|
||||
poorly. Either we need a better way to generate a printable version
|
||||
(maybe through a CGI button), or the seperate protocols need to be
|
||||
printed individually. Also, Communicator does a lousy job of keeping
|
||||
title with tables or graphs. Hopefully, Mozilla will do better.
|
||||
|
||||
|
||||
======================================================================
|
||||
Whole new protocol tests:
|
||||
|
||||
ICQ
|
||||
Test high volume instant messaging. Very useful for the
|
||||
bridges and gateways that people are considering using.
|
||||
|
||||
|
||||
WAP
|
||||
WAP is the emerging standard for mobile phones.
|
||||
|
||||
|
||||
WCAP
|
||||
Web based calendar services
|
||||
|
||||
|
||||
LDAP
|
||||
Use the LDAP SDK to do basic LDAP testing. The SDK probably
|
||||
isn't fast enough to call this a real performance test, but you can at
|
||||
least test performance degredation due to load from a real application
|
||||
(like a mail server).
|
||||
|
||||
|
||||
DNS
|
||||
Mail servers use DNS a lot. You should at least be able to
|
||||
see if performance is degrading due to load.
|
||||
|
||||
|
||||
Disk/filesystem
|
||||
Test read, write, sync, link, un-link, and append performance under
|
||||
multiple threads.
|
||||
|
||||
|
||||
Cert servers
|
||||
Test certificate authenticity checking performance
|
||||
|
||||
|
||||
======================================================================
|
||||
Possible dummy servers:
|
||||
|
||||
SMTP
|
||||
Receive mail via SMTP and ignore it. Usefull for SMTP relay
|
||||
testing.
|
||||
|
||||
|
||||
DNS
|
||||
Simulate slow DNS server lookups. Usefull for SMTP relay testing.
|
||||
|
||||
|
||||
======================================================================
|
||||
Major changes
|
||||
|
||||
Throttling
|
||||
Monitor and control transaction rates so that specific load
|
||||
levels can be easily specified. The rates should be able to vary to
|
||||
simulate peek hour usage and disconnect-restore.
|
||||
|
||||
|
||||
NSPR threading
|
||||
Use NSPR for threading and sockets. This may allow other OSes
|
||||
to be used as clients. This might be easy, since mstone does not need
|
||||
any locking, just simple thread creation and harvesting. NSPR
|
||||
argument parsing and hashes may also be useful.
|
||||
|
||||
|
||||
SSL
|
||||
Support SSL on the protocols that allow it. May require NSPR.
|
||||
|
||||
|
||||
Line speed emulation
|
||||
Simulate the variable delays and limited throughput of dial up
|
||||
connections.
|
||||
|
||||
|
||||
Scripting
|
||||
Allow more detailed control of protocol tests. It looks
|
||||
difficult to make this scalable and fast.
|
||||
|
||||
|
||||
Combined tests
|
||||
Deliver mail over SMTP and then see when it arrives using IMAP.
|
||||
@@ -1,462 +0,0 @@
|
||||
#!/bin/ksh
|
||||
########################################################################
|
||||
# buildall - automated multi-platform build tool
|
||||
#
|
||||
# 10/09/97 - marcel - created
|
||||
# 10/13/97 - marcel - support shared build tree
|
||||
# 2/11/98 - marcel - updated for 4.0 Beta builds (need -update)
|
||||
# 2/26/98 - marcel - added -r, -t and host specifiers
|
||||
# 7/01/99 - robodan - added VAR=value ability
|
||||
# 8/01/99 - robodan - explicitly know about building on localhost
|
||||
# 10/15/99 - robodan - remove older OSes from build list
|
||||
# 2000/4/7 - robodan - Created mstone version
|
||||
########################################################################
|
||||
#
|
||||
# This script is intended to do a set of UNIX builds for a
|
||||
# given CVS module. It is designed to use 'rsh' between a
|
||||
# set of trusting hosts and use shared NFS storage with common
|
||||
# mount points (e.g. /u/username/...)
|
||||
#
|
||||
# To check if you have rights to rsh to a particular host, try:
|
||||
# rsh hostname "echo $PATH"
|
||||
# You may have to edit your .rhosts or /etc/hosts.equiv
|
||||
#
|
||||
# A target directory will be created based on the current date.
|
||||
#
|
||||
# A set of global build logs plus a log per platform are kept
|
||||
# in a log directory under the target
|
||||
#
|
||||
# It will checkout a copy of the source, duplicate it for
|
||||
# each platform and perform a set of remote builds in parallel.
|
||||
# The script will exit when all the work has been completed.
|
||||
#
|
||||
# Example usage:
|
||||
# cd ~/src; buildall msg
|
||||
# Result:
|
||||
# ~/src/19980210_40.1/
|
||||
# ~/src/19980210_40.1/logs/...
|
||||
# ~/src/19980210_40.1/src/...
|
||||
# ...
|
||||
#
|
||||
|
||||
# Buildhosts
|
||||
DEFAULT_BUILDHOSTS="kimo nugget vsync shave purgatory trex0"
|
||||
|
||||
usage() {
|
||||
echo ""
|
||||
echo "usage: buildall [ make assigns... ] < -t | target > [ -r ] [ buildhosts... ]"
|
||||
echo " [ -t | --test]: just test rsh and report OS versions."
|
||||
echo " [-r | --respin]: rebuild in place using existing source."
|
||||
echo " [-p | --postbuild]: Execute post build command too."
|
||||
echo " [make assigns]: e.g. VARIANT=release"
|
||||
echo " <target>: one of: mstone42"
|
||||
echo " [buildhosts...]: default [$DEFAULT_BUILDHOSTS]"
|
||||
echo ""
|
||||
exit 1
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# Set these defaults and options for your desired build
|
||||
########################################################################
|
||||
|
||||
# Target base destination directory
|
||||
DESTBASE=`pwd`
|
||||
|
||||
# Can we do multiple ARCH builds in same source tree
|
||||
SHARESRC=yes
|
||||
|
||||
DESCRIPTION=""
|
||||
BUILDHOSTS=""
|
||||
RESPIN="no"
|
||||
POSTBUILD="no"
|
||||
JUST_TEST="no"
|
||||
DESTTYPE=""
|
||||
CO_CMD="cvs -d $CVSROOT -q checkout"
|
||||
CHECKOUT=""
|
||||
CHECKOUT2=""
|
||||
#MOZCVSROOT=':pserver:anonymous@cvs.mozilla.org:/cvsroot'
|
||||
MOZCVSROOT=':pserver:robodan%netscape.com@cvs.mozilla.org:/cvsroot'
|
||||
|
||||
MAKE="gmake"
|
||||
MK_ARG=""
|
||||
|
||||
ARGS="$@"
|
||||
|
||||
for ARG in "$@"; do
|
||||
|
||||
# If this is a make assignment (FOO=whatever), add it to make command
|
||||
# Arguments with quotes in them dont go all the way through.
|
||||
# Make args trick: 'FOO=nop -j 2'
|
||||
# The pre-post arg stuff uses hostnames as a switch, ugly calling syntax.
|
||||
if [[ -n "`echo z$ARG | egrep '^z[A-Z0-9_]+=[^ ]'`" ]] ; then
|
||||
if [[ -n "$DESCRIPTION" ]] ; then
|
||||
echo "Arg after target is ignored! ($ARG)"
|
||||
continue
|
||||
fi
|
||||
if [[ -z "$BUILDHOSTS" ]] ; then # pre args
|
||||
MAKE="$MAKE $ARG"
|
||||
else # post args
|
||||
MK_ARG="$MK_ARG $ARG"
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
|
||||
# should we just rebuild todays latest source...
|
||||
if [[ "$ARG" = "-r" || "$ARG" = "--respin" || "$ARG" = "respin" ]]; then
|
||||
RESPIN="yes"
|
||||
continue
|
||||
fi
|
||||
|
||||
# should we just run post build command...
|
||||
if [[ "$ARG" = "-p" || "$ARG" = "--postbuild" || "$ARG" = "postbuild" ]]; then
|
||||
POSTBUILD="yes"
|
||||
continue
|
||||
fi
|
||||
|
||||
# should we just test remote connectivity and execute permissions...
|
||||
if [[ "$ARG" = "-t" || "$ARG" = "--test" ]]; then
|
||||
JUST_TEST="yes"
|
||||
RESPIN="yes"
|
||||
continue
|
||||
fi
|
||||
|
||||
# We will pull source using: "$CHECKOUT"
|
||||
# And build on each machine: "cd $BUILDDIR && $BUILDCMD"
|
||||
|
||||
|
||||
# expand targets (but dont confuse hosts for targets (msg7))
|
||||
|
||||
# These will build just mstone
|
||||
# expand targets (but dont confuse hosts for targets (msg7))
|
||||
if [[ "$BUILDCMD" = "" && "$ARG" = mailstone* ]]; then
|
||||
case ${ARG#mstone} in
|
||||
"")
|
||||
"42")
|
||||
DESTTYPE=_MSTONE42
|
||||
MS_BRANCH=""
|
||||
#BUILDCMD="$MAKE $MK_ARG debug release"
|
||||
#POSTCMD="$MAKE $MK_ARG all_DBG.OBJ all_OPT.OBJ"
|
||||
BUILDCMD="$MAKE $MK_ARG rpackage"
|
||||
POSTCMD="$MAKE $MK_ARG all_OPT"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown mstone version in $ARG"
|
||||
echo "Try mstone42"
|
||||
exit 1;;
|
||||
esac
|
||||
|
||||
DESCRIPTION="Mstone $MS_BRANCH"
|
||||
BUILDDIR=./mozilla/mstone
|
||||
CVSROOT=$MOZCVSROOT
|
||||
CHECKOUT="$CO_CMD $MS_BRANCH mozilla/mstone"
|
||||
# BUG No way to unpack perl, gd, and gnuplot before building
|
||||
continue
|
||||
fi
|
||||
|
||||
#########################
|
||||
# Other...
|
||||
#########################
|
||||
|
||||
# These will print some tools info
|
||||
if [[ "$ARG" = "tools" ]]; then
|
||||
CHECKOUT="$CO_CMD modules"
|
||||
BUILDDIR=.
|
||||
BUILDCMD="which gcc && ls -l /tools/ns/bin/gcc && which gcc-2.7.2.1 && ls -l /tools/ns/bin/gcc-2.7.2.1"
|
||||
continue
|
||||
fi
|
||||
|
||||
#########################
|
||||
# Everything else is assumed to be a hostname
|
||||
#########################
|
||||
|
||||
BUILDHOSTS="$ARG $BUILDHOSTS"
|
||||
|
||||
done # for ARG in $*; do
|
||||
|
||||
if [[ "$BUILDHOSTS" = "" ]]; then
|
||||
BUILDHOSTS=$DEFAULT_BUILDHOSTS
|
||||
fi
|
||||
|
||||
if [[ "$BUILDCMD" = "" && "$JUST_TEST" = "no" ]]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
########################################################################
|
||||
# You shouldn't have to modify stuff below here too much
|
||||
########################################################################
|
||||
|
||||
# Who and Where are we
|
||||
PROG=buildall
|
||||
RSH=rsh
|
||||
SYS=`uname -s`
|
||||
echo SYS=$SYS
|
||||
if [[ "$SYS" = "HP-UX" ]]; then
|
||||
RSH=remsh
|
||||
fi
|
||||
|
||||
########################################################################
|
||||
# Simple log output function
|
||||
########################################################################
|
||||
|
||||
log() {
|
||||
# echo "[`date +\"%Y/%m/%d %H:%M:%S\"`] $PROG: $*"
|
||||
echo "`date +\"%H:%M:%S\"` $PROG: $*"
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# Error
|
||||
########################################################################
|
||||
|
||||
quit() {
|
||||
log "$* (exiting)..."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Where should the work be done
|
||||
REV=1
|
||||
WORKDIR=$DESTBASE/`date +"%Y%m%d"`$DESTTYPE.$REV
|
||||
LASTWORKDIR=$WORKDIR
|
||||
LASTREV=$REV
|
||||
|
||||
while [[ -d $WORKDIR ]]; do
|
||||
LASTREV=$REV
|
||||
let "REV= REV + 1"
|
||||
LASTWORKDIR=$WORKDIR
|
||||
WORKDIR=$DESTBASE/`date +"%Y%m%d"`$DESTTYPE.$REV
|
||||
done
|
||||
|
||||
if [[ "$RESPIN" = "yes" ]]; then
|
||||
WORKDIR=$LASTWORKDIR
|
||||
REV=$LASTREV
|
||||
fi
|
||||
BUILDREV=$REV
|
||||
|
||||
if [[ ! -d $WORKDIR && "$RESPIN" = "yes" ]]; then
|
||||
quit "missing expected respin workdir ($WORKDIR)"
|
||||
fi
|
||||
|
||||
mkdir -p $WORKDIR
|
||||
|
||||
# Where to send logs
|
||||
LOGDIR=$WORKDIR/logs
|
||||
[[ -d $LOGDIR ]] || mkdir $LOGDIR
|
||||
|
||||
# What tool to use for compressed tar
|
||||
if [[ -x /tools/ns/bin/tar ]] ; then # ROBDAN 9-15-98 for Linux
|
||||
TAR=/tools/ns/bin/tar
|
||||
else
|
||||
TAR=tar
|
||||
fi
|
||||
|
||||
SRCDIR=$WORKDIR/src
|
||||
SRCTAR=$WORKDIR/src.tar.gz
|
||||
|
||||
########################################################################
|
||||
# The function which extracts the source and prepares for copies
|
||||
########################################################################
|
||||
|
||||
prepare_source() {
|
||||
log "Preparing source code..."
|
||||
mkdir $SRCDIR
|
||||
(cd $SRCDIR;
|
||||
log "Extracting source in $SRCDIR...";
|
||||
log "$CHECKOUT > $LOGDIR/cvs-co.txt";
|
||||
$CHECKOUT > $LOGDIR/cvs-co.txt;
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $CHECKOUT"; fi
|
||||
if [[ "$CHECKOUT2" != "" ]]; then
|
||||
log "$CHECKOUT2 >> $LOGDIR/cvs-co.txt";
|
||||
$CHECKOUT2 >> $LOGDIR/cvs-co.txt;
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $CHECKOUT2"; fi
|
||||
fi
|
||||
log "Listing source...";
|
||||
ls -Rl > $LOGDIR/src-ls-Rl.txt
|
||||
log "Archiving source..."
|
||||
$TAR czf $SRCTAR .
|
||||
)
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then
|
||||
quit "### Failed($RET): cannot prepare source";
|
||||
else
|
||||
log "Source extraction complete";
|
||||
fi
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# The function which does a build
|
||||
########################################################################
|
||||
|
||||
do_rbuild() {
|
||||
OSDEST=$1
|
||||
|
||||
if [ "$SHARESRC" = "yes" ]; then
|
||||
RSRCDIR=$SRCDIR
|
||||
else
|
||||
RSRCDIR=$WORKDIR/$OSDEST
|
||||
fi
|
||||
|
||||
[[ -d $RSRCDIR ]] || mkdir -p $RSRCDIR
|
||||
|
||||
cd $RSRCDIR;
|
||||
|
||||
# do any late variable expansions
|
||||
RAWCMD=$BUILDCMD
|
||||
BUILDCMD=$(eval echo $RAWCMD)
|
||||
|
||||
if [[ $RHOST = localhost ]] ; then
|
||||
log "Build locally for $OSDEST ($BUILDCMD)...";
|
||||
cd $BUILDDIR && pwd && $BUILDCMD && echo $PROG: Success
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $OSDEST build"; fi
|
||||
|
||||
log "Completed local build..."
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ "$SHARESRC" != "yes" ]]; then
|
||||
log "Extracting source for $OSDEST...";
|
||||
$RSH $RHOST -n "cd $RSRCDIR && pwd && $TAR xzf $SRCTAR";
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $OSDEST source extraction"; fi
|
||||
else
|
||||
log "Using common source in $RSRCDIR";
|
||||
fi
|
||||
|
||||
log "Building for $OSDEST ($BUILDCMD)...";
|
||||
$RSH $RHOST -n "cd $RSRCDIR/$BUILDDIR && pwd && $BUILDCMD && echo $PROG: Success"
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $OSDEST build"; fi
|
||||
|
||||
log "Completed $OSDEST...";
|
||||
}
|
||||
|
||||
buildhost() {
|
||||
RHOST=$1
|
||||
|
||||
log "Query $RHOST configuration...";
|
||||
|
||||
if [[ $RHOST = localhost ]] ; then
|
||||
uname -s > /tmp/$$.$RHOST 2>&1
|
||||
else
|
||||
$RSH $RHOST -n "uname -s" > /tmp/$$.$RHOST 2>&1
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then
|
||||
quit "..[$RHOST] ### Failed($RET): $RSH $RHOST -n \"uname -s\"";
|
||||
fi
|
||||
fi
|
||||
ROSTYPE=`tail -1 /tmp/$$.$RHOST`
|
||||
|
||||
if [[ "$ROSTYPE" = "AIX" ]]; then
|
||||
$RSH $RHOST -n "uname -v" > /tmp/$$.$RHOST 2>&1
|
||||
ROSTYPE=${ROSTYPE}`tail -1 /tmp/$$.$RHOST`
|
||||
fi
|
||||
|
||||
if [[ $RHOST = localhost ]] ; then
|
||||
uname -r > /tmp/$$.$RHOST 2>&1
|
||||
else
|
||||
$RSH $RHOST -n "uname -r" > /tmp/$$.$RHOST 2>&1
|
||||
fi
|
||||
ROSREV=`tail -1 /tmp/$$.$RHOST`
|
||||
rm /tmp/$$.$RHOST
|
||||
|
||||
if [[ $RHOST = localhost ]] ; then
|
||||
OSDEST=`hostname | cut -f1 -d.`-${ROSTYPE}${ROSREV}
|
||||
else
|
||||
OSDEST=${RHOST}-${ROSTYPE}${ROSREV}
|
||||
fi
|
||||
log "..Building on [$OSDEST]..."
|
||||
|
||||
REV=1 # find unique logfile name
|
||||
OSLOG=$LOGDIR/$OSDEST.$REV
|
||||
while [[ -f $OSLOG ]]; do
|
||||
let "REV = REV + 1"
|
||||
OSLOG=$LOGDIR/$OSDEST.$REV
|
||||
done
|
||||
|
||||
if [[ "$JUST_TEST" = "yes" ]]; then
|
||||
echo "$PROG: Success" > $OSLOG
|
||||
else
|
||||
( do_rbuild $OSDEST ) > $OSLOG 2>&1
|
||||
fi
|
||||
|
||||
grep "$PROG: Success" $OSLOG > /dev/null
|
||||
RET=$?
|
||||
if [[ $RET -eq 0 ]]; then
|
||||
RESULT="SUCCESS";
|
||||
else
|
||||
RESULT="FAILURE($RET)";
|
||||
fi
|
||||
log "..Completed [$OSDEST] <$RESULT>.";
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# The function which initiates all the builds
|
||||
########################################################################
|
||||
|
||||
do_builds() {
|
||||
log "Launching builds..."
|
||||
|
||||
for HOST in $BUILDHOSTS; do
|
||||
buildhost $HOST &
|
||||
done
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# main
|
||||
########################################################################
|
||||
|
||||
main() {
|
||||
if [[ "$JUST_TEST" = "yes" ]]; then
|
||||
log "Automated test starting..."
|
||||
else
|
||||
log "Automated build of [$DESCRIPTION] starting..."
|
||||
fi
|
||||
log ""
|
||||
log " ARGS = $ARGS"
|
||||
log " BUILDHOSTS = $BUILDHOSTS"
|
||||
log " WORKDIR = $WORKDIR"
|
||||
log " SRCDIR = $SRCDIR"
|
||||
log " LOGDIR = $LOGDIR"
|
||||
log " CHECKOUT = $CHECKOUT"
|
||||
log " BUILDDIR = $BUILDDIR"
|
||||
log " BUILDCMD = $BUILDCMD"
|
||||
log " RESPIN = $RESPIN"
|
||||
log ""
|
||||
|
||||
[[ "$RESPIN" = "no" ]] && prepare_source
|
||||
do_builds
|
||||
log "Waiting for all builds to complete..."
|
||||
wait
|
||||
log "All builds completed."
|
||||
|
||||
if [[ -n "$POSTCMD" && "$POSTBUILD" = "yes" ]] ; then
|
||||
log "Running post build command."
|
||||
|
||||
REV=1 # find unique logfile name
|
||||
POSTLOG=$LOGDIR/postbuild.$REV
|
||||
while [[ -f $POSTLOG ]]; do
|
||||
let "REV = REV + 1"
|
||||
POSTLOG=$LOGDIR/postbuild.$REV
|
||||
done
|
||||
|
||||
echo "Dir $SRCDIR/$BUILDDIR" > $POSTLOG
|
||||
echo "Cmd $POSTCMD" >> $POSTLOG
|
||||
(cd $SRCDIR/$BUILDDIR && $POSTCMD && echo $PROG: Success) >> $POSTLOG 2>&1
|
||||
|
||||
log "Post build command completed."
|
||||
elif [[ -n "$POSTCMD" ]] ; then
|
||||
echo "Skipping post build command: $POSTCMD"
|
||||
fi
|
||||
}
|
||||
|
||||
REV=1
|
||||
PROGLOG=$LOGDIR/$PROG.$REV
|
||||
|
||||
while [[ -f $PROGLOG ]]; do
|
||||
REV=`expr $REV + 1`
|
||||
PROGLOG=$LOGDIR/$PROG.$REV
|
||||
done
|
||||
|
||||
main | tee $PROGLOG 2>&1
|
||||
exit 0
|
||||
@@ -1,164 +0,0 @@
|
||||
@if not "%echo%" == "on" echo off
|
||||
|
||||
REM ************ simple autobuild for mailstone
|
||||
|
||||
setlocal
|
||||
|
||||
set BOTH=0
|
||||
|
||||
if not "%1" == "" goto GetTag
|
||||
|
||||
set BOTH=1
|
||||
set TAG=_OPT
|
||||
goto SetConfig
|
||||
|
||||
:GetTag
|
||||
|
||||
if %1 == dbg set TAG=_DBG
|
||||
if %1 == DBG set TAG=_DBG
|
||||
if %1 == Debug set TAG=_DBG
|
||||
if %1 == debug set TAG=_DBG
|
||||
if %1 == Release set TAG=_OPT
|
||||
if %1 == release set TAG=_OPT
|
||||
if %1 == opt set TAG=_OPT
|
||||
if %1 == OPT set TAG=_OPT
|
||||
if %1 == optimize set TAG=_OPT
|
||||
if %1 == Optimize set TAG=_OPT
|
||||
if %1 == optimized set TAG=_OPT
|
||||
if %1 == Optimized set TAG=_OPT
|
||||
if %1 == clean goto CleanBoth
|
||||
|
||||
:SetConfig
|
||||
|
||||
if %TAG% == _DBG set Config=Debug
|
||||
if %TAG% == _OPT set Config=Release
|
||||
|
||||
set ARCH=WINNT4.0%TAG%.OBJ
|
||||
|
||||
set FINAL_PATH=built\package\%ARCH%\mailstone
|
||||
|
||||
if not "%2" == "clean" if not exist %FINAL_PATH%\nul mkdir %FINAL_PATH%
|
||||
|
||||
|
||||
REM ************ first, clean the binary release
|
||||
nmake /f mailstone.mak CFG="mailstone - Win32 %Config%" /nologo NO_EXTERNAL_DEPS=1 CLEAN
|
||||
|
||||
if not "%2" == "clean" goto BuildMailstone
|
||||
|
||||
if exist src\%Config%\nul echo y | rd /s src\%Config% > nul
|
||||
if exist src\gnuplot-3.7\%Config%\nul echo y | rd /s src\gnuplot-3.7\%Config% > nul
|
||||
if exist src\gd1.3\%Config%\nul echo y | rd /s src\gd1.3\%Config% > nul
|
||||
if exist built\%ARCH%\nul echo y | rd /s built\%ARCH% > nul
|
||||
if exist %FINAL_PATH%\nul echo y | rd /s %FINAL_PATH% > nul
|
||||
|
||||
goto done
|
||||
|
||||
:BuildMailstone
|
||||
|
||||
REM **************** next, build it
|
||||
nmake /f mailstone.mak CFG="mailstone - Win32 %Config%" /nologo NO_EXTERNAL_DEPS=1
|
||||
if errorlevel 1 goto BadBuild
|
||||
|
||||
REM ************ next, copy the top-level files
|
||||
copy mstone.bat %FINAL_PATH%
|
||||
copy setup.bat %FINAL_PATH%
|
||||
copy CHANGELOG %FINAL_PATH%
|
||||
copy INSTALL %FINAL_PATH%
|
||||
copy README %FINAL_PATH%
|
||||
copy LICENSE %FINAL_PATH%
|
||||
|
||||
REM ************ now, copy the files for running mailstone into bin
|
||||
if not exist %FINAL_PATH%\bin\nul mkdir %FINAL_PATH%\bin
|
||||
copy built\%ARCH%\mailclient.exe %FINAL_PATH%\bin
|
||||
if exist built\package\%ARCH%\mailclient.exe copy built\package\%ARCH%\mailclient.exe %FINAL_PATH%\bin
|
||||
if exist built\package\%ARCH%\mailclient.exe del /f /q built\package\%ARCH%\mailclient.exe
|
||||
copy bin\*.pl %FINAL_PATH%\bin
|
||||
|
||||
REM ************ now, copy the configuration files into conf
|
||||
if not exist %FINAL_PATH%\conf\nul mkdir %FINAL_PATH%\conf
|
||||
copy conf\*.* %FINAL_PATH%\conf
|
||||
|
||||
REM ************ now, copy the data files into data
|
||||
if not exist %FINAL_PATH%\data\nul mkdir %FINAL_PATH%\data
|
||||
copy data\*.msg %FINAL_PATH%\data
|
||||
|
||||
REM ************ now, copy the gd files into gd
|
||||
if not exist %FINAL_PATH%\gd\nul mkdir %FINAL_PATH%\gd
|
||||
copy src\gd1.3\index.html %FINAL_PATH%\gd\gd.html
|
||||
|
||||
REM ************ now, copy the gnuplot files into gnuplot
|
||||
if not exist %FINAL_PATH%\gnuplot\nul mkdir %FINAL_PATH%\gnuplot
|
||||
copy built\%ARCH%\gnuplot\gnuplot.exe %FINAL_PATH%\gnuplot
|
||||
copy src\gnuplot-3.7\Copyright %FINAL_PATH%\gnuplot
|
||||
copy src\gnuplot-3.7\docs\gnuplot.1 %FINAL_PATH%\gnuplot
|
||||
|
||||
REM ************ now, copy the perl files into perl
|
||||
if not exist %FINAL_PATH%\perl\nul mkdir %FINAL_PATH%\perl
|
||||
if not exist %FINAL_PATH%\perl\bin\nul mkdir %FINAL_PATH%\perl\bin
|
||||
if not exist %FINAL_PATH%\perl\lib\nul mkdir %FINAL_PATH%\perl\lib
|
||||
if not exist %FINAL_PATH%\perl\lib\5.00503\nul mkdir %FINAL_PATH%\perl\lib\5.00503
|
||||
if not exist %FINAL_PATH%\perl\lib\5.00503\MSWin32-x86\nul mkdir %FINAL_PATH%\perl\lib\5.00503\MSWin32-x86
|
||||
#copy built\%ARCH%\perl\perl.exe %FINAL_PATH%\perl\bin
|
||||
#rcp -b sandpit:/share/builds/components/perl5/WINNT-perl5/perl.exe %FINAL_PATH%\perl\bin\perl.exe
|
||||
#if errorlevel 1 goto BadRcp
|
||||
#if not exist %FINAL_PATH%\perl\perl.exe goto BadRcp
|
||||
#rcp -b sandpit:/share/builds/components/perl5/WINNT-perl5/perl300.dll %FINAL_PATH%\perl\bin\perl300.dll
|
||||
#if errorlevel 1 goto BadRcp
|
||||
#if not exist %FINAL_PATH%\perl\perl300.dll goto BadRcp
|
||||
|
||||
copy src\perl5.005_03\Artistic %FINAL_PATH%\perl
|
||||
copy c:\perl\5.00503\bin\MSWin32-x86\perl.exe %FINAL_PATH%\perl\bin
|
||||
copy c:\perl\5.00503\bin\MSWin32-x86\perl.dll %FINAL_PATH%\perl\bin
|
||||
copy c:\perl\5.00503\lib\*.pm %FINAL_PATH%\perl\lib\5.00503
|
||||
copy c:\perl\5.00503\lib\*.pl %FINAL_PATH%\perl\lib\5.00503
|
||||
copy c:\perl\5.00503\lib\MSWin32-x86\*.pm %FINAL_PATH%\perl\lib\5.00503\MSWin32-x86
|
||||
|
||||
|
||||
goto end
|
||||
|
||||
:CleanBoth
|
||||
|
||||
echo.
|
||||
echo NOTICE: CLEANING debug build
|
||||
call autobuild.bat debug clean
|
||||
|
||||
echo NOTICE: CLEANING optimized build
|
||||
call autobuild.bat release clean
|
||||
|
||||
echo NOTICE: Removing generated dependency files
|
||||
del /s *.dep
|
||||
|
||||
if exist built\nul echo y | rd /s built > nul
|
||||
|
||||
goto done
|
||||
|
||||
:BadRcp
|
||||
|
||||
echo.
|
||||
echo ERROR: Failed to rcp perl files over to mailstone packaging
|
||||
echo ERROR: Two common causes of this are .rhosts permissions or a broken rcp.exe
|
||||
echo ERROR: Make sure you are not using rcp.exe from NT4.0 SP4
|
||||
echo ERROR: The SP5 version is available in \\cobra\engineering\bin\rcp_sp5.exe
|
||||
echo ERROR: Use this version to replace ...\system32\rcp.exe
|
||||
goto done
|
||||
|
||||
:BadBuild
|
||||
|
||||
echo.
|
||||
echo ERROR: Failed to build mailstone
|
||||
goto done
|
||||
|
||||
:end
|
||||
|
||||
echo.
|
||||
|
||||
if %BOTH% == 0 goto done
|
||||
if %TAG% == _DBG goto done
|
||||
|
||||
set TAG=_DBG
|
||||
goto SetConfig
|
||||
|
||||
:done
|
||||
|
||||
endlocal
|
||||
|
||||
@@ -1,852 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# This file does argument processing, file IO, and other utility routines
|
||||
|
||||
# Where the online docs live
|
||||
#$mailstoneURL =
|
||||
# "http://home.netscape.com/eng/server/messaging/4.1/mailston/stone.htm";
|
||||
#$mailstoneURL =
|
||||
# "http://developer.iplanet.com/docs/manuals/messaging.html";
|
||||
#$mailstoneURL =
|
||||
# "http://docs.iplanet.com/docs/manuals/messaging/nms415/mailstone/stone.htm"
|
||||
$mailstoneURL = "http:doc/MailStone.html";
|
||||
|
||||
# Subdirs for results (each under a timestamp dir). Should just hardwire.
|
||||
$tmpbase = "tmp";
|
||||
$resultbase = "results";
|
||||
|
||||
# This holds everything about the test and system configuration
|
||||
@workload = ();
|
||||
# Setup the special CONFIG section
|
||||
$params{"sectionTitle"} = "CONFIG";
|
||||
$params{"sectionParams"} = "";
|
||||
$params{"lineList"} = ();
|
||||
push @workload, \%params;
|
||||
|
||||
# Get the lists discribing the data we process
|
||||
do 'protoconf.pl' || die "$@\n";
|
||||
|
||||
%includedFiles = (); # array of included files
|
||||
|
||||
# Utility functions
|
||||
# Create a unique hash array. Programming Perl, 2nd edition, p291 (p217?)
|
||||
package ArrayInstance;
|
||||
sub new {
|
||||
my $type = shift;
|
||||
my %params = @_;
|
||||
my $self = {};
|
||||
return bless $self, $type;
|
||||
}
|
||||
|
||||
package main;
|
||||
|
||||
# run a command in the background, return its PID
|
||||
# Uses fork: will not run on NT in perl 5.004
|
||||
# if the server is "localhost", ignore the rcmd part
|
||||
# if stdin, stdout, and/or stderr is set, redirect those for the sub process
|
||||
sub forkproc {
|
||||
my $rcmd = shift;
|
||||
my $server = shift;
|
||||
my $command = shift;
|
||||
my $stdin = shift;
|
||||
my $stdout = shift;
|
||||
my $stderr = shift;
|
||||
|
||||
if (my $pid = fork()) {
|
||||
return $pid; # parent
|
||||
}
|
||||
|
||||
# rest of this is in the child
|
||||
if ($stdin) { # redirect stdin if needed
|
||||
close (STDIN);
|
||||
open STDIN, "<$stdin"
|
||||
|| die "Couldn't open $stdin for input\n";
|
||||
}
|
||||
|
||||
if ($stdout) { # redirect stdout if needed
|
||||
close (STDOUT);
|
||||
open STDOUT, ">>$stdout"
|
||||
|| die "Couldn't open $stdout for output\n";
|
||||
}
|
||||
|
||||
if ($stderr) { # redirect stderr if needed
|
||||
close (STDERR);
|
||||
open STDERR, ">>$stderr"
|
||||
|| die "Couldn't open $stderr for output\n";
|
||||
}
|
||||
|
||||
if ($server =~ /^localhost$/i) {
|
||||
exec $command;
|
||||
die "Coundn't exec $command:$!\n";
|
||||
} else {
|
||||
exec split (/\s+/, $rcmd), $server, $command;
|
||||
die "Coundn't exec $rcmd $server $command:$!\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Relocate file to tmp directory (if it is in the results directory),
|
||||
# and put a ~ on the end of it.
|
||||
# ASSUMES tmp and results are on the same partition (on NT, same drive).
|
||||
# Usage: fileBackup (filename)
|
||||
sub fileBackup {
|
||||
my $filename = shift;
|
||||
my $bfile = $filename;
|
||||
|
||||
(-f $filename) || return 0; # file doent exist
|
||||
$bfile =~ s/$resultbase/$tmpbase/; # move to tmp
|
||||
$bfile .= "~"; # indicate that this is a backup
|
||||
(-f $bfile) && unlink ($bfile);
|
||||
#print "Backing up $filename to $bfile\n"; # DEBUG
|
||||
rename ($filename, $bfile) || unlink ($filename);
|
||||
}
|
||||
|
||||
# Insert text into a file after a tagline
|
||||
# fileInsertAfter (filename, tagstring, newtext)
|
||||
sub fileInsertAfter {
|
||||
my $filename = shift || die "fileInsertAfter: missing filename";
|
||||
my $tagline = shift || die "fileInsertAfter: missing tagline";
|
||||
my $newtext = shift || die "fileInsertAfter: missing text";
|
||||
my $foundit = 0;
|
||||
|
||||
open(OLD, "<$filename") ||
|
||||
open(OLD, "gunzip -c $filename |") ||
|
||||
die "fileInsertAfter: Could not open input $filename: $!";
|
||||
open(NEW, ">$filename+") ||
|
||||
die "fileInsertAfter: Could not open output $filename+: $!";
|
||||
|
||||
while (<OLD>) {
|
||||
print NEW $_; # copy (including tagline)
|
||||
|
||||
next unless (/$tagline/); # matched tagline
|
||||
|
||||
print NEW $newtext; # insert new text
|
||||
$foundit++;
|
||||
last; # only change first occurance
|
||||
}
|
||||
|
||||
if ($foundit) { # copy rest of file
|
||||
while (<OLD>) {
|
||||
print NEW $_;
|
||||
}
|
||||
}
|
||||
|
||||
close (OLD);
|
||||
close (NEW);
|
||||
if ($foundit) {
|
||||
fileBackup ($filename);
|
||||
rename ("$filename+", "$filename");
|
||||
#print "Updated $filename\n"; # DEBUG
|
||||
return $foundit;
|
||||
} else {
|
||||
($params{DEBUG}) && print "No change to $filename\n"; # DEBUG
|
||||
unlink ("$filename+");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
# Do text for text replacements in a file.
|
||||
# Perl wildcards are automatically quoted.
|
||||
# fileReplace (filename, matchPat, oldtext, newtext)
|
||||
sub fileReplaceText {
|
||||
my $filename = shift || die "fileReplaceText: missing filename";
|
||||
my $tagline = shift || die "fileReplaceText: missing tagline ($filename)";
|
||||
my $oldtext = shift;
|
||||
my $newtext = shift;
|
||||
my $foundit = 0;
|
||||
|
||||
return if ($newtext eq ""); # nothing to do
|
||||
return if ($oldtext eq ""); # nothing can be done
|
||||
|
||||
open(OLD, "<$filename") ||
|
||||
open(OLD, "gunzip -c $filename |") ||
|
||||
die "fileReplaceText: Could not open input $filename: $!";
|
||||
open(NEW, ">$filename+") ||
|
||||
die "fileReplaceText: Could not open output $filename+: $!";
|
||||
|
||||
$oldtext =~ s/([][{}*+?^.\/])/\\$1/g; # quote regex syntax
|
||||
|
||||
while (<OLD>) {
|
||||
if (/$tagline/i) { # matched tagline
|
||||
$foundit++;
|
||||
s/$oldtext/$newtext/; # do the replace
|
||||
}
|
||||
print NEW $_;
|
||||
}
|
||||
|
||||
close (OLD);
|
||||
close (NEW);
|
||||
if ($foundit) {
|
||||
fileBackup ($filename);
|
||||
rename ("$filename+", "$filename");
|
||||
#print "Updated $filename\n"; # DEBUG
|
||||
return $foundit;
|
||||
} else {
|
||||
($params{DEBUG}) && print "No change to $filename\n"; # DEBUG
|
||||
unlink ("$filename+");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
# copy a file to a new name. Handles possible compression. OS independent.
|
||||
# fileCopy (filename, newname)
|
||||
sub fileCopy {
|
||||
my $filename = shift || die "fileReplaceText: missing filename";
|
||||
my $newname = shift || die "fileReplaceText: missing newname ($filename)";
|
||||
|
||||
open(OLD, "<$filename") ||
|
||||
open(OLD, "gunzip -c $filename |") ||
|
||||
die "fileReplaceText: Could not open input $filename: $!";
|
||||
open(NEW, ">$newname") ||
|
||||
die "fileReplaceText: Could not open output $newname: $!";
|
||||
|
||||
while (<OLD>) { # copy it
|
||||
print NEW $_;
|
||||
}
|
||||
|
||||
close (OLD);
|
||||
close (NEW);
|
||||
return 0;
|
||||
}
|
||||
|
||||
# display a file to STDOUT. Handles possible compression
|
||||
sub fileShow {
|
||||
my $filename = shift || die "fileShow: missing filename";
|
||||
open(SHOWIT, "<$filename") ||
|
||||
open(SHOWIT, "gunzip -c $filename.gz |") ||
|
||||
die "fileShow: Couldn't open $filename: $!";
|
||||
while (<SHOWIT>) { print; }
|
||||
close(SHOWIT);
|
||||
}
|
||||
|
||||
# sub function to figure time extents
|
||||
# (start, end) = dataMinMax counterName \@protocols oldstarttime oldendtime
|
||||
# Use 0 for uninitialized start or end
|
||||
sub dataMinMax {
|
||||
my $name = shift;
|
||||
my $protos = shift;
|
||||
my $start = shift;
|
||||
my $end = shift;
|
||||
|
||||
# make global
|
||||
# create the plot script and data files
|
||||
# Figure out the encompassing time extent
|
||||
foreach $p (@$protos) { # create the plot data files
|
||||
my @times = sort numeric keys %{ $graphs{$p}->{$name}};
|
||||
if ($#times <= 0) {
|
||||
next;
|
||||
}
|
||||
if (($start == 0) || ($times[0] < $start)) {
|
||||
$start = $times[0];
|
||||
}
|
||||
if (($end == 0) || ($times[0] > $end)) {
|
||||
$end = $times[$#times];
|
||||
}
|
||||
}
|
||||
#printf ("Data $name start=$start end=$end (%d points)...\n",
|
||||
# $end - $start);
|
||||
return ($start, $end);
|
||||
}
|
||||
|
||||
# simple function to formatted a number into n, n K, n M, or n G
|
||||
sub kformat {
|
||||
my $n = shift;
|
||||
my $r = "";
|
||||
if ($n > (1024*1024*1024)) {
|
||||
$r = sprintf "%.2fG", $n / (1024*1024*1024);
|
||||
} elsif ($n > (1024*1024)) {
|
||||
$r = sprintf "%.2fM", $n / (1024*1024);
|
||||
} elsif ($n > 1024) {
|
||||
$r = sprintf "%.2fK", $n / 1024;
|
||||
} else {
|
||||
$r = sprintf "%d ", $n;
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
# simple function to formatted a time into Ns, Nms, or Nus
|
||||
# the goal is to make a table of timss uncluttered and easy to read
|
||||
# I dont convert to minutes or hours because the non-1000x multipliers
|
||||
# are hard to back solve in your head for comparisons
|
||||
sub tformat {
|
||||
my $n = shift;
|
||||
my $r = "";
|
||||
if ($n == 0.0) {
|
||||
$r = "0.0"; # make exactly 0 explicit
|
||||
} elsif ($n < 0.001) {
|
||||
$r = sprintf "%.2fus", $n * 1000 * 1000;
|
||||
} elsif ($n < 1.0) {
|
||||
$r = sprintf "%.2fms", $n * 1000;
|
||||
} elsif ($n >= 1000.0) {
|
||||
$r = sprintf "%.0fs", $n;
|
||||
} elsif ($n >= 100.0) {
|
||||
$r = sprintf "%.1fs", $n;
|
||||
} else {
|
||||
$r = sprintf "%.3fs", $n;
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
#Usage: commify (1234567) returns 1,234,567
|
||||
sub commify { # perl cookbook p64-65
|
||||
my $text = reverse $_[0];
|
||||
$text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
|
||||
return scalar reverse $text;
|
||||
}
|
||||
|
||||
# subroutine to enable numeric sorts. Programming Perl p218
|
||||
# Use: sort numeric ...
|
||||
sub numeric { $a <=> $b; }
|
||||
|
||||
# on NT, turn slash to backslash, then print. Else print.
|
||||
sub pathprint {
|
||||
my $str = shift;
|
||||
$str =~ s!/!\\!g if ($params{NT}); # turn slash to back slash
|
||||
print $str;
|
||||
}
|
||||
|
||||
# figureTimeNumber number
|
||||
# Given an number like: 60m, 1h, 100s, 4d, 200
|
||||
# Return 60, 1, 100, 4, 200
|
||||
sub figureTimeNumber {
|
||||
my $arg = shift;
|
||||
|
||||
($arg =~ /([0-9]+)(s|sec|second|seconds|m|min|minute|minutes|h|hr|hour|hours|d|day|days)$/i)
|
||||
&& return $1;
|
||||
return $arg; # return default
|
||||
}
|
||||
|
||||
# figureTimeUnits number, default
|
||||
# Given an number like: 60m, 1h, 100s, 4d
|
||||
# Return a string of minutes, hours, seconds, days
|
||||
# Else return the second argument
|
||||
sub figureTimeUnits {
|
||||
my $arg = shift;
|
||||
|
||||
($arg =~ /(s|sec|second|seconds)$/i) && return "seconds";
|
||||
($arg =~ /(m|min|minute|minutes)$/i) && return "minutes";
|
||||
($arg =~ /(h|hr|hour|hours)$/i) && return "hours";
|
||||
($arg =~ /(d|day|days)$/i) && return "days";
|
||||
|
||||
return shift; # return default
|
||||
}
|
||||
|
||||
# figureTimeSeconds number, defaultUnits
|
||||
# Given an number like: 60m, 2h, 100s, 4d
|
||||
# Return 60*60, 2*60*60, 100, 4*24*60*60
|
||||
sub figureTimeSeconds {
|
||||
my $arg = shift;
|
||||
|
||||
($arg =~ /([0-9]+)(s|sec|second|seconds)$/i) && return $1;
|
||||
($arg =~ /([0-9]+)(m|min|minute|minutes)$/i) && return (60*$1);
|
||||
($arg =~ /([0-9]+)(h|hr|hour|hours)$/i) && return (60*60*$1);
|
||||
($arg =~ /([0-9]+)(d|day|days)$/i) && return (24*60*60*$1);
|
||||
|
||||
if ($_) {
|
||||
my $def = shift;
|
||||
return $arg * figureTimeSeconds ("1$def"); # return scaled by default
|
||||
} else {
|
||||
return $arg; # return it
|
||||
}
|
||||
}
|
||||
|
||||
# BACK COMPATIBILITY (everything now in the workload file)
|
||||
# read the testbed conf file, convert to workload sections
|
||||
# machine, how many processes, how many threads/proc, arch
|
||||
# only the first 2 fields are required. Lines starting with # are ignored.
|
||||
# You can include other files using <include conf/filename.tbd>
|
||||
# exampe:
|
||||
# client1 5 10 SunOS5.5.1
|
||||
sub readTestbedFile {
|
||||
my $filename = shift;
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
print "Testbed $filename skipped, clients read in workload\n";
|
||||
return 1; # clients already read in workload
|
||||
}
|
||||
|
||||
my $level = 0;
|
||||
if ($_) {
|
||||
$level = 1 + shift;
|
||||
die "Too many nested includes ($level) in $filename!"
|
||||
unless ($level < 100);
|
||||
}
|
||||
my $handle = "$filename$level";
|
||||
open($handle, "<$filename") ||
|
||||
open($handle, "gunzip -c $filename.gz |") ||
|
||||
die "Couldn't open testbed $filename: $!";
|
||||
|
||||
while(<$handle>) {
|
||||
chomp;
|
||||
|
||||
s/#.*//; # strip any comments from line
|
||||
|
||||
m/^\s*$/o && next; # continue if blank line
|
||||
|
||||
# handle include statement
|
||||
if (m/^<(include|INCLUDE)\s+([^\s]+)\s*>/o) {
|
||||
#print "Including $2 from $filename\n";
|
||||
readTestbedFile ($2, $level) || die;
|
||||
next;
|
||||
}
|
||||
|
||||
# get the server name and number of processes
|
||||
my @line = split(/\s+/);
|
||||
# create CLIENT entry in workload
|
||||
my $sparm = ArrayInstance->new();
|
||||
if ($line[1]) {
|
||||
$sparm->{"sectionTitle"} = "CLIENT";
|
||||
$sparm->{"sectionParams"} = "HOSTS=$line[0]";
|
||||
$sparm->{"PROCESSES"} = $line[1];
|
||||
$sparm->{"THREADS"} = $line[2] if ($line[2]);
|
||||
$sparm->{"ARCH"} = $line[3] if ($line[3]);
|
||||
} else {
|
||||
$sparm->{"sectionTitle"} = "MONITOR";
|
||||
$sparm->{"sectionParams"} = "HOSTS=$line[0]";
|
||||
$sparm->{"COMMAND"} = $line[2];
|
||||
}
|
||||
($params{DEBUG})
|
||||
&& print "<$sparm->{sectionTitle} $sparm->{sectionParams}>\n";
|
||||
push @workload, $sparm;
|
||||
}
|
||||
close ($handle);
|
||||
}
|
||||
|
||||
# BACK COMPATIBILITY (everything now in the saved workload file)
|
||||
# This is now only needed to process mailstone4.1 runs
|
||||
sub readConfigFile {
|
||||
my $filename = shift;
|
||||
open(CONFIG, "<$filename") ||
|
||||
open(CONFIG, "gunzip -c $filename.gz |") ||
|
||||
die "Couldn't open config file $filename: $!";
|
||||
|
||||
while(<CONFIG>) {
|
||||
chomp;
|
||||
|
||||
s/#.*//; # strip any comments from line
|
||||
|
||||
m/^\s*$/o && next; # continue if blank line
|
||||
|
||||
# get the property and value
|
||||
my @line = split(/=/);
|
||||
$params{$line[0]} = $line[1];
|
||||
}
|
||||
close CONFIG;
|
||||
}
|
||||
|
||||
# read the workload file and store it as a list of hashes
|
||||
# Each hash always has the fields: sectionTitle and sectionParams
|
||||
# usage: readWorkloadFile filename, \@list
|
||||
sub readWorkloadFile {
|
||||
my $filename = shift || die "readWorkloadFile: Missing file name";
|
||||
my $plist = shift || die "readWorkloadFile: Missing return list";
|
||||
my $level = 0; # file inclusion level
|
||||
my @handles;
|
||||
|
||||
my $fh = "$filename$level";
|
||||
|
||||
($params{DEBUG}) && print "Reading workload from $filename.\n";
|
||||
open($fh, "<$filename") ||
|
||||
open($fh, "gunzip -c $filename.gz |") ||
|
||||
die "readWorkloadFile Couldn't open testbed $filename: $!";
|
||||
$includedFiles{$filename} = 1; # mark file as included
|
||||
|
||||
my $sparm=0;
|
||||
my $conline = "";
|
||||
|
||||
while($fh) {
|
||||
while(<$fh>) {
|
||||
s/#.*//; # strip any comments from line (quoting?)
|
||||
s/\s*$//; # strip trailing white space
|
||||
if ($conline) { # utilize line continue
|
||||
$_ = $conline . "\\\n" . $_;
|
||||
$conline = "";
|
||||
}
|
||||
if (m/\\$/o) { # check for quoted line continue
|
||||
s/\\$//; #
|
||||
$conline = $_;
|
||||
next;
|
||||
}
|
||||
s/^\s*//; # strip initial white space
|
||||
m/^$/o && next; # continue if blank line
|
||||
|
||||
# handle include and includeOnce statements
|
||||
if ((m/^<(include)\s+(\S+)\s*>/i)
|
||||
|| (m/^<(includeonce)\s+(\S+)\s*>/i)) {
|
||||
my $incfile = $2;
|
||||
if (($1 =~ m/^includeonce/i) && ($includedFiles{$incfile})) {
|
||||
($params{DEBUG})
|
||||
&& print "readWorkloadFile:includeOnce $incfile already read.\n";
|
||||
next;
|
||||
}
|
||||
($params{DEBUG})
|
||||
&& print "readWorkloadFile include $incfile from $filename.\n";
|
||||
$includedFiles{$incfile} = 1; # mark file
|
||||
push @handles, $fh; # push current handle on to stack
|
||||
if ($level++ > 99) { # check recursion and make handles unique
|
||||
die "readWorkloadFile: include level too deep: $filename $level\n";
|
||||
}
|
||||
$fh = "$incfile$level";
|
||||
open($fh, "<$incfile") ||
|
||||
open($fh, "gunzip -c $incfile.gz |") ||
|
||||
die "readWorkloadFile Couldn't open testbed file $incfile: $!";
|
||||
$filename = $incfile; # for error messages
|
||||
next;
|
||||
}
|
||||
|
||||
if (m!^</(\w+)>$!o) { # end of section
|
||||
my $end = $1;
|
||||
unless ($sparm->{"sectionTitle"} =~ /$end/i) {
|
||||
die "readWorkloadFile Mismatched section $filename: $. '$sparm->{sectionTitle}' '$end'\n";
|
||||
return 0;
|
||||
}
|
||||
($params{DEBUG}) && print "</$sparm->{sectionTitle}>\n";
|
||||
push @$plist, $sparm;
|
||||
$sparm = 0;
|
||||
next;
|
||||
}
|
||||
|
||||
if (m!^<(\w+)\s*(.*)>$!o) { # start of section
|
||||
my $sec = $1;
|
||||
my $more = $2;
|
||||
|
||||
if ($sparm) {
|
||||
die "readWorkloadFile Missing section end $filename: $. '$sparm->{sectionTitle}'\n";
|
||||
}
|
||||
if ($sec =~ /CONFIG/i) { # special case, map to existing global
|
||||
$sparm = \%params;
|
||||
} elsif ($sec =~ /DEFAULT/i) { # special case, only one DEFAULT
|
||||
if ($defaultSection) { # use existing defaultSection
|
||||
$sparm = $defaultSection;
|
||||
} else { # create a new one
|
||||
$sparm = ArrayInstance->new();
|
||||
$sparm->{"sectionTitle"} = uc $sec; # ignore case
|
||||
$sparm->{"lineList"} = ();
|
||||
$defaultSection = $sparm;
|
||||
}
|
||||
} else {
|
||||
$sparm = ArrayInstance->new();
|
||||
$sparm->{"sectionTitle"} = uc $sec; # ignore case
|
||||
$sparm->{"lineList"} = ();
|
||||
}
|
||||
$sparm->{"sectionParams"} = $more; # take newest more info
|
||||
($params{DEBUG})
|
||||
&& print "<$sparm->{sectionTitle} $sparm->{sectionParams}>\n";
|
||||
next;
|
||||
}
|
||||
|
||||
# must be in a section, get parameters
|
||||
unless ($sparm) {
|
||||
die "readWorkloadFile Entry encountered outside a section $filename: $. $_\n";
|
||||
return 0;
|
||||
}
|
||||
my ($nm, $val) = split (/[\s=]+/, $_, 2);
|
||||
$nm = uc $nm; # ignore case
|
||||
($params{DEBUG}) && print " $nm = $val\n";
|
||||
if ($nm =~ /ACCOUNTFORMAT/) { # BACK COMPATIBILITY
|
||||
print "WARNING: 'accountFormat' is obsolete. Use 'addressFormat' and 'loginFormat'\n";
|
||||
$sparm->{"addressFormat"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "addressFormat $val";
|
||||
$val =~ s/@.+$//; # strip at and everything after
|
||||
$sparm->{"loginFormat"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "loginFormat $val";
|
||||
next;
|
||||
} elsif ($nm =~ /NUMACCOUNTS/) { # BACK COMPATIBILITY
|
||||
print "WARNING: 'numAccounts' is obsolete. Use 'numAddresses' and 'numLogins'\n";
|
||||
$sparm->{"numAddresses"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "numAddresses $val";
|
||||
$sparm->{"numLogins"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "numLogins $val";
|
||||
next;
|
||||
} elsif ($nm =~ /BEGINACCOUNTS/) { # BACK COMPATIBILITY
|
||||
print "WARNING: 'beginAccounts' is obsolete. Use 'firstAddress' and 'firstLogin'\n";
|
||||
$sparm->{"firstAddress"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "firstAddress $val";
|
||||
$sparm->{"firstLogin"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "firstLogin $val";
|
||||
next;
|
||||
}
|
||||
push @{$sparm->{"lineList"}}, $_; # save lines in original order
|
||||
$sparm->{$nm} = $val;
|
||||
next;
|
||||
}
|
||||
close ($fh);
|
||||
$fh = pop @handles || last; # empty include stack
|
||||
$filename = $fh;
|
||||
$sparm = 0; # can only include whole sections
|
||||
}
|
||||
return 1; # success
|
||||
}
|
||||
|
||||
# Write out a workload list to a file
|
||||
# Optionally, pass in a list of sectionTitle's it should ignore
|
||||
# usage: writeWorkloadFile filename \@list [\@skipList]
|
||||
sub writeWorkloadFile {
|
||||
my $filename = shift || die "writeWorkloadFile: Missing file name";
|
||||
my $plist = shift || die "writeWorkloadFile: Missing return list";
|
||||
my $skip = shift;
|
||||
my @skipH;
|
||||
my $configSeen = 0;
|
||||
my $defaultSeen = 0;
|
||||
my @paramH;
|
||||
|
||||
if ($skip) {
|
||||
foreach $s (@$skip) { # turn list into a hash
|
||||
$skipH{(uc $s)} = $s; # fix case for index
|
||||
}
|
||||
}
|
||||
foreach $s (@workloadParameters) { # turn list into a hash
|
||||
$paramH{(uc $s)} = $s; # fix case for index
|
||||
}
|
||||
|
||||
($params{DEBUG}) && print "Writing workload to $filename.\n";
|
||||
unless (open(WORKOUT, ">$filename")) {
|
||||
die "Couldn't open testbed $filename: $!";
|
||||
}
|
||||
|
||||
foreach $sparm (@$plist) { # each hash reference in the list
|
||||
if (($skip)
|
||||
&& ($skipH{$sparm->{"sectionTitle"}})) {
|
||||
#($params{DEBUG}) &&
|
||||
#print "Skipping section $sparm->{sectionTitle}\n";
|
||||
next;
|
||||
}
|
||||
|
||||
# all CONFIG,DEFAULT sections point to the same hash, output once only
|
||||
if ($sparm->{"sectionTitle"} =~ /^CONFIG$/) {
|
||||
next if $configSeen;
|
||||
$configSeen++;
|
||||
}
|
||||
if ($sparm->{"sectionTitle"} =~ /^DEFAULT$/) {
|
||||
next if $defaultSeen;
|
||||
$defaultSeen++;
|
||||
}
|
||||
if ($sparm->{sectionParams}) { # write section with extra args
|
||||
print WORKOUT "<$sparm->{sectionTitle} $sparm->{sectionParams}>\n";
|
||||
} else {
|
||||
print WORKOUT "<$sparm->{sectionTitle}>\n";
|
||||
}
|
||||
if ($sparm->{"sectionTitle"} =~ /^(CONFIG|CLIENT)$/) {
|
||||
# for Config or Client, output the hash to get computed config
|
||||
foreach $k (sort keys %$sparm) { # output each parameter
|
||||
# skip sectionTitle and sectionParams
|
||||
($k =~ /^(sectionTitle|sectionParams|lineList)$/) && next;
|
||||
printf WORKOUT " %s\t%s\n",
|
||||
($paramH{$k}) ? $paramH{$k} : $k,
|
||||
$sparm->{$k};
|
||||
}
|
||||
} else { # write out the line list
|
||||
foreach $l (@{$sparm->{"lineList"}}) {
|
||||
print WORKOUT " $l\n";
|
||||
}
|
||||
}
|
||||
print WORKOUT "</$sparm->{sectionTitle}>\n\n";
|
||||
}
|
||||
close WORKOUT;
|
||||
}
|
||||
|
||||
# Usage: getClientFilename hostname section
|
||||
sub getClientFilename {
|
||||
my $cli = shift || die "Missing client name";
|
||||
my $section = shift || die "Missing section hash";
|
||||
return "$tmpdir/$cli-$section->{GROUP}.out"
|
||||
if ($params{USEGROUPS} && $section->{GROUP});
|
||||
return "$tmpdir/$cli.out"
|
||||
}
|
||||
|
||||
sub setConfigDefaults { # set CONFIG defaults
|
||||
# These are set after writing out the test copy to avoid clutter
|
||||
|
||||
# Path to gnuplot executable
|
||||
$params{GNUPLOT}="gnuplot/gnuplot"
|
||||
unless ($params{GNUPLOT});
|
||||
|
||||
# This is the directory the client lives in
|
||||
$params{TEMPDIR} = "/var/tmp"
|
||||
unless($params{TEMPDIR});
|
||||
|
||||
# Set default remote shell
|
||||
#$params{RSH} = "/usr/bin/rsh"
|
||||
$params{RSH} = "ssh"
|
||||
unless($params{RSH});
|
||||
|
||||
# Set default remote copy
|
||||
#$params{RCP} = "/usr/bin/rcp"
|
||||
$params{RCP} = "scp"
|
||||
unless($params{RCP});
|
||||
|
||||
# Size of generated gifs
|
||||
$params{CHARTHEIGHT} = 480
|
||||
unless($params{CHARTHEIGHT});
|
||||
$params{CHARTWIDTH} = 640
|
||||
unless($params{CHARTWIDTH});
|
||||
$params{CHARTPOINTS} = int (($params{CHARTWIDTH}-60)*0.8)
|
||||
unless($params{CHARTPOINTS});
|
||||
|
||||
|
||||
# The name of the remote executable
|
||||
$params{CLIENTCOMMAND} = "mailclient"
|
||||
unless ($params{CLIENTCOMMAND});
|
||||
|
||||
# Set default monitoring command
|
||||
$params{MONITORCOMMAND} = "vmstat %f"
|
||||
unless($params{MONITORCOMMAND});
|
||||
|
||||
# Set default switches to makeusers
|
||||
$params{MAKEUSERSARGS} = "-4"
|
||||
unless ($params{MAKEUSERSARGS});
|
||||
|
||||
# Figure out @protocols, this sets the report order
|
||||
@protocols = ();
|
||||
{
|
||||
my %skipH;
|
||||
foreach $s (@nonProtocolSections) { # turn list into a hash
|
||||
#print "$s ";
|
||||
$skipH{(uc $s)} = $s; # fix case for index
|
||||
}
|
||||
print "\n";
|
||||
foreach $sparm (@workload) { # each hash reference in the list
|
||||
next if ($skipH{$sparm->{"sectionTitle"}});
|
||||
|
||||
($params{DEBUG}) &&
|
||||
print "Found protocol ". $sparm->{"sectionTitle"} . "\n";
|
||||
|
||||
push @protocols, $sparm->{"sectionTitle"};
|
||||
# add to skip list so only added once
|
||||
$skipH{(uc $sparm->{"sectionTitle"})} = $sparm->{"sectionTitle"};
|
||||
}
|
||||
}
|
||||
@protocolsAll = @protocols;
|
||||
push @protocolsAll, "Total";
|
||||
|
||||
# figure out the graphs ???
|
||||
}
|
||||
|
||||
sub parseArgs { # get args
|
||||
while (@ARGV) {
|
||||
my $arg = shift(@ARGV);
|
||||
|
||||
if ($arg =~ /^-a$/i) { # was undocumented feature in 4.1
|
||||
$params{ADDGRAPHS} = shift(@ARGV); # extra graphs
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-b$/i) {
|
||||
$params{TITLE} = shift(@ARGV); # banner
|
||||
next;
|
||||
}
|
||||
|
||||
# BACK COMPATIBILITY (everything now in the saved workload file)
|
||||
if ($arg =~ /^-c$/i) { # config file, read when encountered
|
||||
my $configFile = shift(@ARGV);
|
||||
readConfigFile ($configFile);
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-d$/i) {
|
||||
$params{DEBUG}++; # Debug
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-h$/i) { # Help
|
||||
print "Usage: -w workfile [-t time] [-r ramptime] [-l load] [-v] [-d]\n";
|
||||
print "\t[-b banner] [-n notes] [-s sysconfigfile] [-a add_graphs_file]\n";
|
||||
print "\t[-c configfile] [-m machinefile] [-z] [PARAM=value]...\n";
|
||||
|
||||
die "Usage";
|
||||
}
|
||||
|
||||
if ($arg =~ /^-l$/i) { # "load", FIX: naming conventions
|
||||
$params{CLIENTCOUNT} = shift(@ARGV); # desired client count
|
||||
next;
|
||||
}
|
||||
|
||||
# BACK COMPATIBILITY (everything now in the saved workload file)
|
||||
if ($arg =~ /^-m$/i) {
|
||||
$params{TESTBED} = shift(@ARGV); # testbed machines file
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-n$/i) {
|
||||
$params{COMMENTS} = shift(@ARGV); # notes
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-r$/i) {
|
||||
$params{RAMPTIME} = shift(@ARGV); # ramptime
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-s$/i) {
|
||||
$params{SYSCONFIG} = shift(@ARGV); # system config html file
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-t$/i) {
|
||||
$params{TIME} = shift(@ARGV); # test time
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-v$/i) {
|
||||
$params{VERBOSE} = 1; # verbose mode
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-w$/i) { # workload file (may occur multiple times)
|
||||
my $f = shift(@ARGV);
|
||||
readWorkloadFile ($f, \@workload) || die "Error reading workload: $@\n";
|
||||
$params{WORKLOAD} = $f;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-z$/i) {
|
||||
$params{NT} = 1; # NT mode
|
||||
next;
|
||||
}
|
||||
|
||||
# any other CONFIG parameter: FIELD=value
|
||||
if ($arg =~ /^(\w+)=(\S.*)$/) {
|
||||
my $field = uc $1;
|
||||
$params{$field} = $2;
|
||||
next;
|
||||
}
|
||||
die "Unknown argument '$arg'";
|
||||
}
|
||||
|
||||
if ($params{NT}) { # should use Cwd module
|
||||
$cwd = `cd`; # NT get current directory
|
||||
$cwd = `pwd` unless ($cwd); # in case we are really on UNIX
|
||||
} else {
|
||||
$cwd = `pwd`; # in case we are really on UNIX
|
||||
}
|
||||
chomp $cwd; # strip NL
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -1,317 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# This file deals with the graphs data only
|
||||
# Interfaces to gnuplot to generate gifs for HTML inclusion.
|
||||
|
||||
# Type of images to hold plots (e.g. png, gif, jpeg, svg, tiff, pbm, etc)
|
||||
unless ($params{IMAGETYPE}) {
|
||||
# Should probe gnuplot and see if it can generate one of:
|
||||
# png, gif, jpeg, svg, tiff, or pbm.
|
||||
# Not all the programs that use args.pl need this (or have gnuplot, yet)
|
||||
my $outfile = "$tmpbase/termtypes.out";
|
||||
my %types = (); # hash of interesting types that we spot
|
||||
|
||||
unless (open(NEW, "<$outfile")) { # re-use old file if present
|
||||
($params{DEBUG}) &&
|
||||
print "Asking gnuplot what output types it supports\n";
|
||||
|
||||
my $infile = "$tmpbase/setterm.gpt";
|
||||
open (NEW, ">$infile") ||
|
||||
die "genPlot: Could not open output $infile: $!";
|
||||
print NEW "set terminal";
|
||||
close (NEW);
|
||||
# Redirect STDIN, and STDERR
|
||||
open SAVEIN, "<STDIN";
|
||||
open STDIN, "<$infile"
|
||||
|| die "Coundn't open $infile for input\n";
|
||||
open SAVEERR, ">&STDERR";
|
||||
open STDERR, ">$outfile"
|
||||
|| die "Couldnt open $outfile for output\n";
|
||||
system $params{GNUPLOT}; # gnuplot < $infile 2> $outfile
|
||||
# Restore STDERR and STDIN
|
||||
close STDERR;
|
||||
open STDERR, ">&SAVEERR";
|
||||
open STDIN, "<SAVEIN";
|
||||
|
||||
open(NEW, "<$outfile") ||
|
||||
die ": Could not open gnuplot output for parsing ($outfile): $!";
|
||||
|
||||
unlink ($infile); # clean up
|
||||
}
|
||||
|
||||
# now check through the output for terminal types we can use.
|
||||
# I havent verified the jpeg or tiff types. e-mail me success or failure
|
||||
while (<NEW>) {
|
||||
(/\spng\s/) && ++$types{"png"} && next;
|
||||
(/\sgif\s/) && ++$types{"gif"} && next;
|
||||
(/\sjpeg\s/) && ++$types{"jpeg"} && next;
|
||||
(/\ssvg\s/) && ++$types{"svg"} && next;
|
||||
(/\stiff\s/) && ++$types{"tiff"} && next;
|
||||
(/\spbm\s/) && ++$types{"pbm"} && next;
|
||||
}
|
||||
close (NEW);
|
||||
|
||||
($params{DEBUG}) &&
|
||||
print "Found these gnuplot types: " . (join " ", (keys %types)) . "\n";
|
||||
|
||||
# The ordering here determines our preferences
|
||||
# This list is by likely browser compatibility and image compactness
|
||||
# png is about 10x smaller than gif
|
||||
# svg is smooth and scalable but usually requires a plug-in
|
||||
# jpeg will probably look bad, but will be directly supported
|
||||
if ($types{"png"}) { $params{IMAGETYPE}="png"; }
|
||||
elsif ($types{"gif"}) { $params{IMAGETYPE}="gif"; }
|
||||
elsif ($types{"jpeg"}) { $params{IMAGETYPE}="jpeg"; }
|
||||
elsif ($types{"svg"}) { $params{IMAGETYPE}="svg"; }
|
||||
elsif ($types{"tiff"}) { $params{IMAGETYPE}="tiff"; }
|
||||
elsif ($types{"pbm"}) { $params{IMAGETYPE}="pbm"; }
|
||||
else {
|
||||
die "Gnuplot doesn't support any good image types. Check $outfile.\n";
|
||||
}
|
||||
# leave the output file around to speed up repeat runs
|
||||
}
|
||||
|
||||
# sub function to write data files, fire off gnuscript, and clean up
|
||||
# Uses global startTime and endTime figured above
|
||||
# genPlot counterName title label \@protocols \@variables
|
||||
sub genPlot {
|
||||
my $name = shift;
|
||||
my $title = shift;
|
||||
my $label = shift;
|
||||
my $protos = shift || die "genPlot: '$name' missing protocols";
|
||||
my $f = shift;
|
||||
my $vars = shift || die "genPlot: '$name' missing vars";
|
||||
|
||||
my $runlist = "";
|
||||
my $totPoints = 0;
|
||||
my $totProtos = 0;
|
||||
my @realProtos;
|
||||
my @goodProtos;
|
||||
|
||||
# user fewer data points than pixels to look good.
|
||||
# on 640x480 gif, the graph is about 579x408
|
||||
my $maxData = int (($params{CHARTWIDTH}-60) * 0.9);
|
||||
my $averageCnt = int (($endTime - $startTime + ($maxData - 1))/$maxData);
|
||||
if ($averageCnt < 1) { $averageCnt = 1; } # must be a positive int
|
||||
|
||||
($params{DEBUG}) && print "$name: averageCnt=$averageCnt vars = @$vars \n";
|
||||
|
||||
foreach $p (@$protos) { # First see if there is anything to graph
|
||||
($p =~ /^Total$/o) && next; # derived if needed
|
||||
my $pPoints = 0;
|
||||
my $gp = $graphs{$p};
|
||||
ALLVAR: foreach $vm (@$vars) {
|
||||
my $vp = ($f) ? $gp->{$vm}->{$f} : $gp->{$vm};
|
||||
|
||||
unless (($vp) && (scalar %$vp)) {
|
||||
#print "genplot Checking: $p $vm $f => NO\n";
|
||||
next;
|
||||
}
|
||||
#print "genplot Checking: $p $vm $f => ";
|
||||
foreach $time (keys %$vp) {
|
||||
next unless ($vp->{$time} != 0);
|
||||
$totPoints++;
|
||||
$pPoints++;
|
||||
#print "VALUES\n";
|
||||
last ALLVAR;
|
||||
}
|
||||
#print "nothing\n"
|
||||
}
|
||||
if ($pPoints > 0) { # count how many protocols have non 0
|
||||
$totProtos++;
|
||||
push @goodProtos, $p;
|
||||
}
|
||||
}
|
||||
($params{DEBUG}) && print "\tprotocols: @goodProtos\n";
|
||||
|
||||
if ($totPoints == 0) { # nothing in any protocol
|
||||
print "No data for graph '$name', variables '@$vars'\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
foreach $p (@$protos) {
|
||||
unlink ("$tmpdir/$name.$p"); # remove any previous runs
|
||||
|
||||
(($p =~ /^Total$/o) && ($totProtos <= 1))
|
||||
&& next; # skip Totally if only 1 protocol plus total
|
||||
|
||||
($p !~ /^Total$/o) && push @realProtos, $p; # everything but Total
|
||||
|
||||
# if ($p =~ /^Total$/o) { # move from last to first
|
||||
# $runlist = "\'$name.$p\' with lines, " . $runlist;
|
||||
# next;
|
||||
# }
|
||||
|
||||
$runlist .= ", " if ($runlist); # later ones
|
||||
|
||||
$runlist .= "\'$name.$p\' with lines";
|
||||
}
|
||||
|
||||
$totPoints = 0;
|
||||
foreach $p (@realProtos) { # create the plot data files
|
||||
open(DATA, ">$tmpdir/$name.$p") ||
|
||||
die "Can't open $tmpdir/$name.$p:$!";
|
||||
my $gp = $graphs{$p};
|
||||
my $n = 0;
|
||||
my $s = 0.0;
|
||||
my $sTime = 0.0;
|
||||
my $vp = ($f) ? $gp->{$vars->[0]}->{$f} : $gp->{$vars->[0]};
|
||||
|
||||
# foreach $time (sort numeric keys %$vp) {
|
||||
for (my $tm = $startTime; $tm <= $endTime; $tm++) {
|
||||
my $v = 0.0;
|
||||
foreach $vm (@$vars) {
|
||||
$vp = ($f) ? $gp->{$vm}->{$f} : $gp->{$vm};
|
||||
|
||||
$totPoints++;
|
||||
|
||||
# due to optimization in updateDelta,
|
||||
# 0 entries are undefined (also avoids warning)
|
||||
$v += ($vp->{$tm}) ? $vp->{$tm} : 0;
|
||||
|
||||
# if ($vp->{$tm} < 0) {
|
||||
# print $name, ": proto=", $p, " var=", $vm,
|
||||
# " value=", $vp->{$tm}, "\n";
|
||||
# }
|
||||
}
|
||||
$s += $v;
|
||||
$n += 1;
|
||||
if ($n == 1) { # NOTE: shifts left in sliding window
|
||||
$sTime = $tm-$startTime;
|
||||
}
|
||||
if ($n >= $averageCnt) {
|
||||
printf (DATA "%d %f\n", $sTime * $timeStep, $s/$n);
|
||||
$n = 0;
|
||||
$s = 0.0;
|
||||
}
|
||||
}
|
||||
if ($n > 0) { # handle end case
|
||||
printf (DATA "%d %f\n", $sTime * $timeStep, $s/$n);
|
||||
}
|
||||
close(DATA);
|
||||
}
|
||||
#($params{DEBUG}) && print "\tpoints: $totPoints\n";
|
||||
|
||||
# need to handle "Total" case
|
||||
# read the other files and write out the sum
|
||||
# FIX: total my be mis-aligned with data
|
||||
if (($#$protos > $#realProtos) && ($totProtos > 1)) {
|
||||
unlink ("$tmpdir/$name.Total");
|
||||
open(DATA, ">$tmpdir/$name.Total") ||
|
||||
die "Can't open $tmpdir/$name.Total:$!";
|
||||
|
||||
foreach $r (@goodProtos) { # get file handles
|
||||
open($r, "$tmpdir/$name.$r")
|
||||
|| die "Couldn't open $tmpdir/$name.$r: $!";
|
||||
}
|
||||
# ASSUMES files are identical in order
|
||||
my $first = shift @goodProtos;
|
||||
# print "First protocol: $first Rest: @realProtos\n";
|
||||
while (<$first>) {
|
||||
my ($t, $s) = split ' ', $_;
|
||||
foreach $r (@goodProtos) { # get file handles
|
||||
$l = <$r>;
|
||||
if ($l) {
|
||||
my ($tt, $v) = split ' ', $l;
|
||||
$t = $tt unless ($t); # in case first proto missing time
|
||||
$s += $v;
|
||||
}
|
||||
}
|
||||
printf (DATA "%d %f\n", $t, $s);
|
||||
}
|
||||
|
||||
foreach $r (@goodProtos) { close($r); }
|
||||
close (DATA);
|
||||
}
|
||||
|
||||
# Create a script to feed to gnuplot, which creates a .gif graph.
|
||||
$runTime = ($endTime - $startTime + 1) * $timeStep;
|
||||
unlink("$tmpdir/$name.gpt");
|
||||
open(SCRIPT, ">$tmpdir/$name.gpt")
|
||||
|| die "Can't open $tmpdir/$name.gpt:$!";
|
||||
|
||||
$gnuplot = $params{GNUPLOT};
|
||||
if ($gnuplot !~ /^\//) { # if not absolute, adjust for cd $tmpbase
|
||||
$gnuplot = "../../$gnuplot"; # ASSUME $tmpbase is single dir
|
||||
}
|
||||
#print "gnuplot is $gnuplot $params{GNUPLOT}\n";
|
||||
|
||||
my $varstring = ""; # create display version of names
|
||||
foreach $t (@$vars) {
|
||||
$varstring .= ", " if ($varstring);
|
||||
$varstring .= ($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
}
|
||||
|
||||
# Setup output "terminal type"
|
||||
if ($params{IMAGETYPE} eq "gif") { # gif type has different arguments
|
||||
print SCRIPT "set terminal $params{IMAGETYPE} small size $params{CHARTWIDTH},$params{CHARTHEIGHT}\n";
|
||||
} elsif ($params{IMAGETYPE} eq "svg") { # svg type has different args too
|
||||
print SCRIPT "set terminal $params{IMAGETYPE} size $params{CHARTWIDTH} $params{CHARTHEIGHT}\n";
|
||||
} else { # most types work like this
|
||||
print SCRIPT "set terminal $params{IMAGETYPE} small color\n";
|
||||
if (($params{CHARTWIDTH} != 640) || ($params{CHARTHEIGHT} != 480)) {
|
||||
my $xscale = $params{CHARTWIDTH} / 640;
|
||||
my $yscale = $params{CHARTHEIGHT} / 480;
|
||||
print SCRIPT "set size $xscale,$yscale\n";
|
||||
}
|
||||
}
|
||||
print SCRIPT<<"!GROK!THIS!";
|
||||
set output "../../$resultdir/$name.$params{IMAGETYPE}" # ASSUME $tmpbase is single dir
|
||||
set autoscale
|
||||
set xlabel "Test time (seconds)"
|
||||
set ylabel "$label"
|
||||
set title "$title ($varstring) -- $params{TSTAMP}"
|
||||
plot [0:$runTime] $runlist
|
||||
!GROK!THIS!
|
||||
close(SCRIPT);
|
||||
|
||||
# run script from tmpbase to clean up line labeling
|
||||
# my $olddir=getcwd();
|
||||
chdir $tmpdir;
|
||||
system (split (/\s/, $gnuplot), "$name.gpt");
|
||||
chdir "../..";
|
||||
# chdir $olddir;
|
||||
|
||||
unless ($params{DEBUG}) {
|
||||
# cleanup the plot data (or leave around for debugging)
|
||||
foreach $p (@$protos) {
|
||||
unlink("$tmpdir/$name.$p");
|
||||
}
|
||||
unlink("$tmpdir/$name.gpt");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
@@ -1,576 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
# Mike Blakely
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# see setup.pl for full usage
|
||||
# mailmaster [-d] [-c <config file>] ...
|
||||
|
||||
# This script reads in the client configuration files and will
|
||||
# fork children to rsh the mailclient process on network clients,
|
||||
# each child will write test results to /mailstone directory before
|
||||
# dying. The parent will the read and combine the results.
|
||||
#
|
||||
# Make sure the user running this script has rsh privilege across
|
||||
# all client machines
|
||||
|
||||
print "Netscape Mailstone version 4.2\n";
|
||||
print "Copyright (c) Netscape Communications Corp. 1997-2000\n";
|
||||
|
||||
# this parses the command line and config file
|
||||
do 'args.pl'|| die "$@\n";
|
||||
parseArgs(); # parse command line
|
||||
|
||||
{ # get unique date string
|
||||
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
|
||||
my $tstamp = sprintf ("%04d%02d%02d.%02d%02d",
|
||||
1900+$year, 1+$mon, $mday, $hour, $min);
|
||||
|
||||
if ( -d "$resultbase/$tstamp") { # check for runs within a minute
|
||||
my $tail = 'a';
|
||||
while ( -d "$resultbase/$tstamp$tail" ) { $tail++; }
|
||||
$tstamp .= $tail;
|
||||
}
|
||||
$params{TSTAMP} = $tstamp;
|
||||
}
|
||||
|
||||
$resultdir = "$resultbase/$params{TSTAMP}";
|
||||
$tmpdir = "$tmpbase/$params{TSTAMP}";
|
||||
$resultstxt = "$resultdir/results.txt";
|
||||
$resultshtml = "$resultdir/results.html";
|
||||
mkdir ("$resultbase", 0775);
|
||||
mkdir ("$tmpbase", 0775);
|
||||
mkdir ("$resultdir", 0775);
|
||||
mkdir ("$tmpdir", 0775);
|
||||
|
||||
# Make sure we have everything
|
||||
die "Must specify the test time" unless $params{TIME};
|
||||
die "Must specify a workload file" unless $params{WORKLOAD};
|
||||
|
||||
if ($params{TESTBED}) { # BACK COMPATIBILITY
|
||||
readTestbedFile ($params{TESTBED}) || die "Error reading testbed: $@\n";
|
||||
}
|
||||
|
||||
$testsecs = figureTimeSeconds ($params{TIME}, "seconds");
|
||||
|
||||
# figure out the processes and thread, given the desired number
|
||||
# takes into account all the constraints. todo can be a float.
|
||||
sub figurePT {
|
||||
my $sec = shift;
|
||||
my $todo = shift;
|
||||
my $p = 1; # first guess
|
||||
my $t = 1;
|
||||
my $start = 1; # initial process guess
|
||||
my $end = 250; # highest process guess
|
||||
|
||||
if ($todo < 1) { # mark this client as inactive
|
||||
$sec->{PROCESSES} = 0;
|
||||
$sec->{THREADS} = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (($section->{MAXCLIENTS}) && ($todo > $section->{MAXCLIENTS})) {
|
||||
$todo = $section->{MAXCLIENTS}; # trim to max client per host
|
||||
}
|
||||
if ($section->{PROCESSES}) { # they set this part already
|
||||
$start = int ($section->{PROCESSES});
|
||||
$end = $start;
|
||||
$p = $start;
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
print "Using specified $p processes for clients $slist\n";
|
||||
}
|
||||
|
||||
$end = int ($section->{MAXPROCESSES})
|
||||
if ($section->{MAXPROCESSES}); # they set a max
|
||||
|
||||
if (($params{NT}) || ($section->{ARCH} eq "NT4.0")) {
|
||||
$end = 1; # # NT is currently limited to 1 process
|
||||
$start = 1;
|
||||
$p = 1;
|
||||
}
|
||||
|
||||
# step through some process counts
|
||||
# it should first reduce errors due to MAXTHREADS,
|
||||
# the it will reduce errors due to integer math.
|
||||
# not optimal, just good enough
|
||||
my $misses = 0;
|
||||
for (my $n = $start; $n <= $end; $n++) { # try some process counts
|
||||
my $tryt = int ($todo / $n);
|
||||
if (($sec->{MAXTHREADS}) && ($tryt > $sec->{MAXTHREADS})) {
|
||||
$tryt = $sec->{MAXTHREADS};
|
||||
}
|
||||
# see if this is a better match than the last one
|
||||
if (abs ($todo - ($n * $tryt)) < abs ($todo - ($p * $t))) {
|
||||
$p = $n;
|
||||
$t = $tryt;
|
||||
$misses = 0;
|
||||
} else {
|
||||
$misses++;
|
||||
last if ($misses > 1); # getting worse
|
||||
}
|
||||
}
|
||||
$sec->{PROCESSES} = $p;
|
||||
$sec->{THREADS} = $t;
|
||||
return $p * $t;
|
||||
}
|
||||
|
||||
# Allocate CLIENTCOUNT to the client machines
|
||||
# try NOT to turn this into a massive linear programming project
|
||||
# works best to put bigger machines last
|
||||
if ($params{CLIENTCOUNT}) {
|
||||
my $todo = $params{CLIENTCOUNT};
|
||||
my $softcli = 0; # how many can we play with
|
||||
|
||||
foreach $section (@workload) { # see which are already fixed
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
unless (($section->{PROCESSES}) && ($section->{THREADS})) {
|
||||
$softcli++;
|
||||
next;
|
||||
}
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my @hlist = split /[\s,]/, $slist;
|
||||
my $hcnt = (1 + $#hlist);
|
||||
|
||||
# subtract fixed entries
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 1;
|
||||
$todo -= $tcount * $section->{PROCESSES} * $hcnt;
|
||||
$clientProcCount += $section->{PROCESSES} * $hcnt; # total processes
|
||||
$params{DEBUG} &&
|
||||
print "Fixed load group with $hcnt hosts: $section->{PROCESSES} x $tcount\n";
|
||||
}
|
||||
|
||||
$params{DEBUG} &&
|
||||
print "Allocating $todo clients over $softcli groups\n";
|
||||
if ($softcli) {
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
next if (($section->{PROCESSES}) && ($section->{THREADS}));
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my @hlist = split /[\s,]/, $slist;
|
||||
my $hcnt = (1 + $#hlist);
|
||||
|
||||
#print "todo=$todo softcli=$softcli hcnt=$hcnt\n";
|
||||
$todo -= $hcnt * figurePT ($section, $todo / ($softcli * $hcnt));
|
||||
$clientProcCount += $hcnt * $section->{PROCESSES}; # total procs
|
||||
|
||||
$softcli--;
|
||||
last if ($softcli <= 0); # should not happen
|
||||
}
|
||||
}
|
||||
if ($todo) {
|
||||
print "Warning: Could not allocate $todo of $params{CLIENTCOUNT} clients.\n";
|
||||
$params{CLIENTCOUNT} -= $todo;
|
||||
}
|
||||
|
||||
|
||||
} else { # figure out the client count
|
||||
my $cnt = 0;
|
||||
foreach $section (@workload) { # see which are already fixed
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
next unless ($section->{PROCESSES});
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my @hlist = split /[\s,]/, $slist;
|
||||
my $hcnt = (1 + $#hlist);
|
||||
|
||||
# subtract fixed entries
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 1;
|
||||
$cnt += $tcount * $section->{PROCESSES} * $hcnt;
|
||||
$clientProcCount += $section->{PROCESSES} * $hcnt; # total processes
|
||||
}
|
||||
$params{CLIENTCOUNT} = $cnt;
|
||||
die "No clients configured!\n" unless ($cnt > 0);
|
||||
}
|
||||
|
||||
# This has to be written into save workload file for later processing
|
||||
unless ($params{FREQUENCY}) { # unless frequency set on command line
|
||||
my $chartp = ($params{CHARTPOINTS}) ? $params{CHARTPOINTS} : 464;
|
||||
|
||||
# approximate data points for good graphs (up to 2 times this)
|
||||
$params{FREQUENCY} = int ($testsecs / $chartp);
|
||||
if ($params{FREQUENCY} < 2) { # fastest is every 2 seconds
|
||||
$params{FREQUENCY} = 2;
|
||||
} elsif ($params{FREQUENCY} > 60) { # slowest is every minute
|
||||
$params{FREQUENCY} = 60;
|
||||
}
|
||||
}
|
||||
|
||||
{ # set a unique block id on every section
|
||||
my $id = 0;
|
||||
my $configSeen = 0;
|
||||
my $defaultSeen = 0;
|
||||
foreach $section (@workload) {
|
||||
if ($section->{"sectionTitle"} =~ /^CONFIG$/) {
|
||||
next if $configSeen;
|
||||
$configSeen++;
|
||||
}
|
||||
if ($section->{"sectionTitle"} =~ /^DEFAULT$/) {
|
||||
next if $defaultSeen;
|
||||
$defaultSeen++;
|
||||
}
|
||||
$id++; # number 1, 2, ...
|
||||
if ($section->{"sectionTitle"} =~ /^(CONFIG|CLIENT)$/) {
|
||||
$section->{BLOCKID} = $id;
|
||||
} else {
|
||||
push @{$section->{"lineList"}}, "blockID\t$id\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Write the version we pass to mailclient
|
||||
writeWorkloadFile ("$resultdir/work.wld", \@workload,
|
||||
\@scriptWorkloadSections);
|
||||
|
||||
# Write the complete inclusive version
|
||||
writeWorkloadFile ("$resultdir/all.wld", \@workload);
|
||||
|
||||
setConfigDefaults(); # pick up any missing defaults
|
||||
|
||||
unless ($#protocolsAll > 0) {
|
||||
die "No protocols found. Test Failed!\n";
|
||||
}
|
||||
|
||||
print "Starting: ", scalar(localtime), "\n";
|
||||
|
||||
# redirect STDERR
|
||||
open SAVEERR, ">&STDERR";
|
||||
open(STDERR, ">$resultdir/stderr") || warn "Can't redirect STDERR:$!\n";
|
||||
|
||||
$totalProcs = 0; # number of clients started
|
||||
|
||||
# iterate over every client in the testbed, complete the cmd and rsh
|
||||
if ($params{NT}) { # single client on local host
|
||||
pathprint ("Starting clients (errors logged to $resultdir/stderr)\n");
|
||||
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 1;
|
||||
|
||||
|
||||
# Build the initial Mailclient command line
|
||||
my $preCmd = ($section->{COMMAND})
|
||||
? $section->{COMMAND} : $params{CLIENTCOMMAND};
|
||||
$preCmd .= " -s -t $params{TIME} -f $params{FREQUENCY}";
|
||||
$preCmd .= " -d" if ($params{DEBUG});
|
||||
$preCmd .= " -r" if ($params{TELEMETRY});
|
||||
$preCmd .= " -R $params{RAMPTIME}" if ($params{RAMPTIME});
|
||||
$preCmd .= " -m $params{MAXERRORS}" if ($params{MAXERRORS});
|
||||
$preCmd .= " -M $params{MAXBLOCKS}" if ($params{MAXBLOCKS});
|
||||
$preCmd .= " -n 1 -N $tcount";
|
||||
$preCmd .= ($params{USEGROUPS} && $section->{GROUP})
|
||||
? " -H $section->{GROUP}" : " -H $cli";
|
||||
|
||||
my $stdout = "$tmpdir/localhost.out";
|
||||
|
||||
$totalProcs += $tcount;
|
||||
do 'makeindex.pl' || warn "$@\n"; # html index
|
||||
|
||||
printf "\nTest duration: %d %s. Rampup time: %d %s. Number of clients: %d\n",
|
||||
figureTimeNumber ($params{TIME}),
|
||||
figureTimeUnits ($params{TIME}, "seconds"),
|
||||
figureTimeNumber ($params{RAMPTIME}),
|
||||
figureTimeUnits ($params{RAMPTIME}, "seconds"),
|
||||
$totalProcs;
|
||||
|
||||
print STDERR "localhost: cd $params{TEMPDIR}; $preCmd\n";
|
||||
|
||||
# Redirect STDIN, and STDOUT
|
||||
#open SAVEIN, "<STDIN";
|
||||
open STDIN, "<$resultdir/work.wld"
|
||||
|| die "Coundn't open $resultdir/work.wld for input\n";
|
||||
open SAVEOUT, ">&STDOUT";
|
||||
open STDOUT, ">$stdout"
|
||||
|| die "Couldnt open $stdout for output\n";
|
||||
|
||||
chdir $params{TEMPDIR} || die "Could not cd $params{TEMPDIR}: $!\n";
|
||||
system $preCmd;
|
||||
close STDOUT;
|
||||
open STDOUT, ">&SAVEOUT";
|
||||
printf "Test done.\n";
|
||||
|
||||
chdir $cwd || die "Could not cd $cwd: $!\n";
|
||||
last; # only do the first one
|
||||
}
|
||||
} else { # not NT (forking works)
|
||||
|
||||
foreach $section (@workload) { # do pre run commands
|
||||
next unless ($section->{sectionTitle} =~ /PRETEST/o);
|
||||
unless ($section->{COMMAND}) {
|
||||
print "PreTest with no Command for $section->{sectionParams}\n";
|
||||
next;
|
||||
}
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $myCmd = $section->{COMMAND};
|
||||
$myCmd =~ s/%f/$params{FREQUENCY}/; # fill in frequency variable
|
||||
if ($myCmd =~ m/%c/o) { # dont force down if count is used
|
||||
$count = $testsecs / $params{FREQUENCY};
|
||||
$myCmd =~ s/%c/$count/; # fill in count variable
|
||||
}
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
print "Running pre test command on $cli\n";
|
||||
open PRE, ">>$resultdir/$cli-pre.log";
|
||||
print PRE "========\n";
|
||||
print PRE "$myCmd\n";
|
||||
print PRE "========\n";
|
||||
close PRE;
|
||||
print STDERR "$cli: $myCmd\n"; # log the actual command
|
||||
forkproc ($rsh, $cli, $myCmd,
|
||||
"/dev/null", "$resultdir/$cli-pre.log");
|
||||
}
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
wait(); # run multiple PRETEST section sequentially
|
||||
}
|
||||
}
|
||||
|
||||
foreach $section (@workload) { # start monitors
|
||||
next unless ($section->{sectionTitle} =~ /MONITOR/o);
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $myCmd = ($section->{COMMAND})
|
||||
? $section->{COMMAND} : $params{MONITORCOMMAND};
|
||||
my $forceDown = 0;
|
||||
$myCmd =~ s/,/ /g; # turn commas into spaces BACK COMPATIBIILITY
|
||||
$myCmd =~ s/%f/$params{FREQUENCY}/; # fill in frequency variable
|
||||
|
||||
if ($myCmd =~ m/%c/o) { # dont force down if count is used
|
||||
$count = $testsecs / $params{FREQUENCY};
|
||||
$myCmd =~ s/%c/$count/; # fill in count variable
|
||||
} else {
|
||||
$forceDown = 1;
|
||||
}
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
printf "Monitoring on $cli\n";
|
||||
open PRE, ">>$resultdir/$cli-run.log";
|
||||
print PRE "========\n";
|
||||
print PRE "$myCmd\n";
|
||||
print PRE "========\n";
|
||||
close PRE;
|
||||
print STDERR "$cli: $myCmd\n"; # log the actual command
|
||||
$pid = forkproc ($rsh, $cli, $myCmd,
|
||||
"/dev/null", "$resultdir/$cli-run.log");
|
||||
push @forceDownPids, $pid if ($forceDown); # save PID for shutdown
|
||||
}
|
||||
}
|
||||
|
||||
print "Starting clients (errors logged to $resultdir/stderr)\n";
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
next unless ($section->{PROCESSES}); # unused client
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
my $pcount = $section->{PROCESSES};
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 0;
|
||||
my $tempdir;
|
||||
if ($section->{TEMPDIR}) {
|
||||
$tempdir = $section->{TEMPDIR};
|
||||
} elsif ($params{TEMPDIR}) {
|
||||
$tempdir = $params{TEMPDIR};
|
||||
}
|
||||
my $preCmd = "./" . (($section->{COMMAND})
|
||||
? $section->{COMMAND} : $params{CLIENTCOMMAND});
|
||||
$preCmd .= " -s -t $params{TIME} -f $params{FREQUENCY}";
|
||||
$preCmd .= " -d" if ($params{DEBUG});
|
||||
$preCmd .= " -r" if ($params{TELEMETRY});
|
||||
$preCmd .= " -R $params{RAMPTIME}" if ($params{RAMPTIME});
|
||||
if ($params{MAXERRORS}) {
|
||||
# distribute error count over processes, rounding up
|
||||
my $n = int (($params{MAXERRORS} + $clientProcCount - 1)
|
||||
/ $clientProcCount);
|
||||
$n = 1 if ($n < 1);
|
||||
$preCmd .= " -m $n";
|
||||
}
|
||||
if ($params{MAXBLOCKS}) {
|
||||
# distribute block count over processes, rounding up
|
||||
my $n = int (($params{MAXBLOCKS} + $clientProcCount - 1)
|
||||
/ $clientProcCount);
|
||||
$n = 1 if ($n < 1);
|
||||
$preCmd .= " -M $n";
|
||||
}
|
||||
$preCmd = "cd $tempdir; " . $preCmd if ($tempdir);
|
||||
$preCmd .= " -n $pcount";
|
||||
$preCmd =~ s!/!\\!g if ($section->{ARCH} eq "NT4.0");
|
||||
$preCmd =~ s/;/&&/g if ($section->{ARCH} eq "NT4.0");
|
||||
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
my $stdout = getClientFilename ($cli, $section);
|
||||
my $myCmd = $preCmd;
|
||||
$myCmd .= ($params{USEGROUPS} && $section->{GROUP})
|
||||
? " -H $section->{GROUP}" : " -H $cli";
|
||||
|
||||
if ($tcount) {
|
||||
$myCmd .= " -N $tcount";
|
||||
printf "Starting %d x %d on $cli\n", $pcount, $tcount;
|
||||
$totalProcs += $pcount * $tcount;
|
||||
} else {
|
||||
printf "Starting %d processes on $cli\n", $pcount;
|
||||
$totalProcs += $pcount;
|
||||
}
|
||||
|
||||
print STDERR "$cli: $myCmd\n"; # log the actual command
|
||||
$pid = forkproc ($rsh, $cli, $myCmd,
|
||||
"$resultdir/work.wld", $stdout);
|
||||
push @localPids, $pid if ($cli =~ /^localhost$/i);
|
||||
}
|
||||
}
|
||||
|
||||
if (@localPids) {
|
||||
# print "Trapping extraneous local signals\n";
|
||||
# This doesnt trap quite right. We dont die, but shell returns...
|
||||
$SIG{ALRM} = 'IGNORE'; # in case we get an ALRM from the mailclient
|
||||
}
|
||||
|
||||
printf "\nTest duration: %d %s. Rampup time: %d %s. Number of clients: %d\n",
|
||||
figureTimeNumber ($params{TIME}),
|
||||
figureTimeUnits ($params{TIME}, "seconds"),
|
||||
figureTimeNumber ($params{RAMPTIME}),
|
||||
figureTimeUnits ($params{RAMPTIME}, "seconds"),
|
||||
$totalProcs;
|
||||
|
||||
do 'makeindex.pl' || warn "$@\n"; # html index
|
||||
|
||||
print "Waiting for test to finish.\n";
|
||||
print "Waiting: ", scalar(localtime), "\n";
|
||||
# wait for children to finish
|
||||
$pid = wait();
|
||||
if (@forceDownPids) { # shut down after the first return.
|
||||
print "Shutting down @forceDownPids\n";
|
||||
kill 1 => @forceDownPids; # sigHUP
|
||||
# kill 9 => @forceDownPids; # sigTERM
|
||||
}
|
||||
while ($pid != -1) { # wait for all children
|
||||
$pid = wait();
|
||||
}
|
||||
|
||||
foreach $section (@workload) { # do post test commands
|
||||
next unless ($section->{sectionTitle} =~ /POSTTEST/o);
|
||||
unless ($section->{COMMAND}) {
|
||||
print "PostTest with no command for $section->{sectionParams}\n";
|
||||
next;
|
||||
}
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $myCmd = $section->{COMMAND};
|
||||
$myCmd =~ s/%f/$params{FREQUENCY}/; # fill in frequency variable
|
||||
if ($myCmd =~ m/%c/o) { # dont force down if count is used
|
||||
$count = $testsecs / $params{FREQUENCY};
|
||||
$myCmd =~ s/%c/$count/; # fill in count variable
|
||||
}
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
printf "Running post test command on $cli\n";
|
||||
open PRE, ">>$resultdir/$cli-post.log";
|
||||
print PRE "========\n";
|
||||
print PRE "$myCmd\n";
|
||||
print PRE "========\n";
|
||||
close PRE;
|
||||
print STDERR "$cli: $myCmd\n"; # log the actual command
|
||||
forkproc ($rsh, $cli, $myCmd,
|
||||
"/dev/null", "$resultdir/$cli-post.log");
|
||||
}
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
wait(); # run multiple POSTTEST section sequentially
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
print STDERR "\nDone.\n";
|
||||
close(STDERR);
|
||||
open STDERR, ">&SAVEERR";
|
||||
|
||||
print "\nClients done: ", scalar(localtime), "\n";
|
||||
print "Collecting results\n";
|
||||
|
||||
do 'reduce.pl' || die "$@\n"; # generate graphs and sums
|
||||
|
||||
print "Generating results pages\n";
|
||||
|
||||
do 'report.pl' || die "$@\n";
|
||||
|
||||
# Now display that data to console
|
||||
if ($params{VERBOSE}) {
|
||||
fileShow ($resultstxt);
|
||||
print "\n";
|
||||
}
|
||||
print "Processing done: ", scalar (localtime), "\n";
|
||||
|
||||
pathprint ("\nResults (text):\t$resultstxt\n");
|
||||
pathprint ( "Results (HTML):\t$resultshtml\n");
|
||||
print "Index of runs: \tfile://$cwd/$resultbase/index.html\n";
|
||||
|
||||
|
||||
# Now check for major problems in the stderr file
|
||||
if (open(RESULTSTXT, "$resultdir/stderr")) {
|
||||
$ERRCNT=0;
|
||||
while (<RESULTSTXT>) { $ERRCNT++; }
|
||||
close(RESULTSTXT);
|
||||
pathprint ("Error log ($ERRCNT lines):\t$resultdir/stderr\n");
|
||||
}
|
||||
|
||||
{ # list user requested logging
|
||||
my @logfiles = <$resultdir/*-pre.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
print "Pre test log: \t$f\n";
|
||||
}
|
||||
}
|
||||
@logfiles = <$resultdir/*-run.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
print "Monitoring log: \t$f\n";
|
||||
}
|
||||
}
|
||||
@logfiles = <$resultdir/*-post.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
print "Post test log: \t$f\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print "Mailmaster done: ", scalar(localtime), "\n"; exit 0;
|
||||
@@ -1,115 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# usage: perl -Ibin makeindex.pl
|
||||
# Look at all the results files and create a top level index
|
||||
|
||||
unless ($resultbase) { # pick up systematic defaults, if needed
|
||||
do 'args.pl'|| die $@;
|
||||
parseArgs(); # parse command line
|
||||
}
|
||||
|
||||
($testname = $params{WORKLOAD}) =~ s:conf/::;
|
||||
$testname =~ s:.wld::;
|
||||
|
||||
my $entry = "";
|
||||
|
||||
$entry .= "<TR><TD><BR><A HREF=\"$params{TSTAMP}/results.html\">$params{TSTAMP}</A></TD>";
|
||||
$entry .= "<TD>$testname</TD>\n";
|
||||
$entry .= "<TD>$params{TITLE}</TD>\n";
|
||||
$entry .= "<TD>$params{TIME}</TD>\n";
|
||||
$entry .= "<TD>$params{CLIENTCOUNT}</TD>\n";
|
||||
$entry .= "<TD><A HREF=\"$params{TSTAMP}/all.wld\">workload</A></TD>\n";
|
||||
$entry .= "<TD><A HREF=\"$params{TSTAMP}/stderr\">stderr</A></TD></TR>\n";
|
||||
|
||||
if (-r "$resultbase/index.html") {
|
||||
fileInsertAfter ("$resultbase/index.html",
|
||||
"^<!-- INSERT TAGS HERE",
|
||||
$entry);
|
||||
} else { # create index from scratch
|
||||
system ("cd $resultbase; ln -s ../doc .");
|
||||
open(INDEXNEW, ">$resultbase/index.new") ||
|
||||
die "Couldn't open $resultbase/index.new: $!";
|
||||
|
||||
print INDEXNEW <<END;
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
||||
<HTML>
|
||||
<TITLE>
|
||||
MailStone Results
|
||||
</TITLE>
|
||||
<HEAD>
|
||||
</HEAD>
|
||||
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#000088">
|
||||
<A HREF=$mailstoneURL>Mailstone documentation</A><BR>
|
||||
<TABLE BORDER=2>
|
||||
<CAPTION> Netscape MailStone Results Index </CAPTION>
|
||||
<TR>
|
||||
<TH>Run</TH> <TH>Testname</TH> <TH> Title </TH>
|
||||
<TH>Duration</TH> <TH>Clients</TH> <TH>Details</TH> <TH>Error log</TH>
|
||||
</TR>
|
||||
<!-- INSERT TAGS HERE - DO NOT DELETE THIS LINE -->
|
||||
END
|
||||
|
||||
print INDEXNEW $entry; # put in this entry
|
||||
|
||||
# Add in any existing entries
|
||||
# get a list of all the results files
|
||||
@resall = <$resultbase/*/results.html>;
|
||||
# Write out all the links
|
||||
# This could be rather slow, but we only do it when index.html is missing
|
||||
foreach $filefull (reverse @resall) {
|
||||
my $file = $filefull;
|
||||
$file =~ s:$resultbase/::;
|
||||
if ($file eq $params{TSTAMP}) { next; } # written above
|
||||
my $dir = $file;
|
||||
$dir =~ s:/results.html::;
|
||||
# dont read in old workloads, it will override the current one
|
||||
print INDEXNEW "<TR><TD><BR><A HREF=\"$file\">$dir</A></TD>\n";
|
||||
print INDEXNEW "<TD> </TD><TD> </TD><TD> </TD><TD> </TD>\n";
|
||||
print INDEXNEW "<TD><A HREF=\"$dir/all.wld\">workload</A></TD>\n";
|
||||
print INDEXNEW "<TD><A HREF=\"$dir/stderr\">stderr</A></TD></TR>\n";
|
||||
}
|
||||
|
||||
print INDEXNEW <<END;
|
||||
</TABLE>
|
||||
</BODY>
|
||||
</HTML>
|
||||
END
|
||||
close (INDEXNEW);
|
||||
fileBackup ("$resultbase/index.html");
|
||||
rename ("$resultbase/index.new", "$resultbase/index.html");
|
||||
print "Created $resultbase/index.html\n";
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -1,414 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# script to create test user accounts for Netscape Messaging Server 3, 4
|
||||
#
|
||||
# Given a set of parameters, this script will create an LDIF file
|
||||
# for a number of email users of the form:
|
||||
# test1, test2, test3, ...
|
||||
#
|
||||
# usage: perl create_accounts_ldif [users] [broadcast] [postmaster] [ options ]
|
||||
# [ -a allUsersAlias ]
|
||||
# [ -b basedn ]
|
||||
# [ -d maildomain ]
|
||||
# [ -f firstaccount ]
|
||||
# [ -k ]
|
||||
# [ -m mailhost ]
|
||||
# [ -n numaccounts ]
|
||||
# [ -o outputfile ]
|
||||
# [ -p password ]
|
||||
# [ -s storebase ]
|
||||
# [ -u username ]
|
||||
# [ -v ]
|
||||
# [ -w workload ]
|
||||
# [ -x maxstores ]
|
||||
# [ -3 ]
|
||||
#
|
||||
#perl -Ibin -- bin/makeusers.pl -d mailhost.example.com -m mailhost.example.com -b 'o=example.com' -u mailhost-test -n 100 -4 -o mailhost100.ldif
|
||||
|
||||
# Create the ldif for the user accounts and/or broadcast, postmaster account.
|
||||
#
|
||||
# The ldif then must be added to
|
||||
# the directory by hand (ldapadd, or through the dir admin server's
|
||||
# Database Mgmt->Add entries from an ldif file).
|
||||
|
||||
# A faster way
|
||||
# is to export the existing directory, append the results of
|
||||
# this script, and re-import the combined file. This can be
|
||||
# done using the following Netscape Directory Server commands:
|
||||
# stop-slapd
|
||||
# db2ldif outputfile
|
||||
# [ merge files ]
|
||||
# ldif2db inputfile # for DS4 you would typically use -noconfig
|
||||
# start-sladp
|
||||
#
|
||||
|
||||
print "Netscape Mailstone.\nCopyright (c) 1998,1999 Netscape Communications Corp.\n";
|
||||
|
||||
# server to be used in the internet mail address of the users
|
||||
$domain = "newdomain.example.net";
|
||||
|
||||
# machine that will act as the user's mailhost
|
||||
$mailhost = "mailhost.example.net";
|
||||
|
||||
# base dn for the user entries, e.g. o=Ace Industry,c=US
|
||||
$basedn = "o=Benchmark Lab, c=US";
|
||||
|
||||
# name of broadcast account
|
||||
$bcastacct = "allusers";
|
||||
|
||||
# name of broadcast account
|
||||
$postmasteraddr = "root\@localhost";
|
||||
|
||||
# base name to build user names, will construct test0, test1, ...
|
||||
$username = "test%ld";
|
||||
|
||||
# user passwds, in SHA format, the passwd below is 'netscape'
|
||||
#$userpassword = "{SHA}aluWfd0LYY9ImsJb3h4afrI4AXk=";
|
||||
# these can also be imported as cleartext
|
||||
$userpassword = "netscape";
|
||||
|
||||
# 0: no numbered passwords, 1: number with userID
|
||||
$maxpass = 0;
|
||||
|
||||
# first account to use
|
||||
$firstaccount = 0;
|
||||
|
||||
# number of user accounts to create ($first - $first+$num-1)
|
||||
$numaccounts = 1_000;
|
||||
|
||||
# For larger systems, spreading the users over multiple partitions
|
||||
# is usually a good idea. This example assumes you have
|
||||
# created partitions named p0, p1, etc.
|
||||
|
||||
# store partition base name
|
||||
$storebase = "p%ld";
|
||||
|
||||
# max store number (0 - maxstores-1), skip if 0
|
||||
$maxstores = 0;
|
||||
|
||||
#default to msg 4 schemas
|
||||
$usemsg4schema = 1;
|
||||
|
||||
#default to writing to stdout
|
||||
$outfile = STDOUT;
|
||||
|
||||
# Initial UID for genpasswd
|
||||
$firstuid = 1000;
|
||||
|
||||
sub usage {
|
||||
print "Usage: perl -Ibin -- makeusers [users] [broadcast] [postmaster]\n";
|
||||
print "\t[ -w workload ] [ -o outputFile ]\n";
|
||||
print "\t[ -d mailDomain ] [ -m mailHost ] [ -b baseDN ]\n";
|
||||
print "\t[ -u username ] [ -f firstAccount ] [ -n numAccounts ]\n";
|
||||
print "\t[ -p password ] [ -k ]\n";
|
||||
print "\t[ -s storeBase ] [ -x numStores ]\n";
|
||||
print "\t[ -a allUsersAlias ] [ -t postmasterAddress ]\n";
|
||||
print "\t[ -3 ]|[ -4 ]\n";
|
||||
}
|
||||
|
||||
sub readWorkConfig { # read the workload in, parse our params
|
||||
my $workloadfile = shift || die "Workload file name expected\n";
|
||||
|
||||
do 'args.pl'|| die $@;
|
||||
readWorkloadFile ($workloadfile, \@workload)
|
||||
|| die "Error reading workload: $@\n";
|
||||
# assign all the parameters from the config
|
||||
$mailhost = $defaultSection->{SERVER}
|
||||
if ($defaultSection->{SERVER});
|
||||
if ($defaultSection->{ADDRESSFORMAT}) {
|
||||
my $addr = $defaultSection->{ADDRESSFORMAT};
|
||||
$addr =~ s/^.*@//;
|
||||
$domain = $addr;
|
||||
}
|
||||
if ($defaultSection->{LOGINFORMAT}) {
|
||||
my $user = $defaultSection->{LOGINFORMAT};
|
||||
#$user =~ s/%ld$//;
|
||||
$username = $user;
|
||||
}
|
||||
$numaccounts = $defaultSection->{NUMLOGINS}
|
||||
if ($defaultSection->{NUMLOGINS});
|
||||
$firstaccount = $defaultSection->{FIRSTLOGINS}
|
||||
if ($defaultSection->{FIRSTLOGINS});
|
||||
|
||||
$userpassword = $defaultSection->{PASSWDFORMAT}
|
||||
if ($defaultSection->{SERVER});
|
||||
|
||||
if ($userpassword =~ m/%ld/) { # see if numbered passwords
|
||||
$maxpass++;
|
||||
#$userpassword =~ s/%ld//g;
|
||||
}
|
||||
|
||||
# what isnt set: basedn, storebase, maxstores, usemsg4schema
|
||||
}
|
||||
|
||||
while (@ARGV) {
|
||||
$arg = shift(@ARGV);
|
||||
|
||||
if ($arg =~ /^-a$/i) { # allusers (broadcast) user name
|
||||
$bcastacct = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-b$/i) { # LDAP base DN
|
||||
$basedn = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-d$/i) { # mail domain
|
||||
$domain = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-f$/i) { # initial account
|
||||
$firstaccount = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-k$/i) { # use numbered passwords
|
||||
$maxpass++;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-h$/i) { # help
|
||||
usage();
|
||||
exit 0;
|
||||
}
|
||||
if ($arg =~ /^-m$/i) { # mail server name
|
||||
$mailhost = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-n$/i) { # number of accounts
|
||||
$numaccounts = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-o$/i) { # name output file
|
||||
my $fname = shift || die "File name expected\n";
|
||||
open OUTFILE, ">$fname" || die "Error opening file $@\n";
|
||||
$outfile = OUTFILE;
|
||||
next; # use msg4 user admin schema
|
||||
}
|
||||
if ($arg =~ /^-p$/i) { # password
|
||||
$userpassword = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-s$/i) { # base name for above
|
||||
$storebase = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-t$/i) { # postmaster address
|
||||
$postmasteraddress = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-u$/i) { # user name base
|
||||
$username = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-v$/i) { # be verbose
|
||||
$verbose++;
|
||||
next;
|
||||
}
|
||||
# do this when read, so that later switches can override
|
||||
if ($arg =~ /^-w$/i) { # get a workload file
|
||||
readWorkConfig (shift(@ARGV));
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-x$/i) { # number of partitions (0 to skip)
|
||||
$maxstores = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-3$/) { # no msg4 schema
|
||||
$usemsg4schema = 0;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-4$/) { # use msg4 user admin schema
|
||||
$usemsg4schema = 1;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^users$/i) {
|
||||
$genusers++;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^broadcast$/i) {
|
||||
$genbroadcast++;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^passwd$/i) {
|
||||
$genpasswd++;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^postmaster$/i) {
|
||||
$genpostmaster++;
|
||||
next;
|
||||
}
|
||||
|
||||
print STDERR "Unknown argument $arg. Use -h for help.\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
unless (($genusers) || ($genbroadcast) || ($genpasswd) || ($genpostmaster)) {
|
||||
print STDERR "Must specify mode [users] [broadcast] [postmaster] ...\n";
|
||||
usage();
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# specify number fields, if needed
|
||||
unless ($username =~ /%ld/) {
|
||||
$username .= '%ld';
|
||||
}
|
||||
if (($maxpass) && !($userpassword =~ /%ld/)) {
|
||||
$userpassword .= '%ld';
|
||||
}
|
||||
if (($maxstores) && !($storename =~ /%ld/)) {
|
||||
$storename .= '%ld';
|
||||
}
|
||||
|
||||
if ($verbose) {
|
||||
print STDERR "Here is the configuration:\n";
|
||||
print STDERR "baseDN='$basedn' \t";
|
||||
print STDERR (($usemsg4schema) ? "-4\n" : "-3\n");
|
||||
print STDERR "mailHost='$mailhost' \tdomain='$domain'\n";
|
||||
print STDERR "userName='$username' \tnumAccounts=$numaccounts \tfirstAccount=$firstaccount\n";
|
||||
print STDERR "userPassword='$userpassword'\n";
|
||||
print STDERR "allUsersAccount='$bcastacct'\n" if ($genbroadcast);
|
||||
print STDERR "postmasterAddress='$postmasterAddress'\n" if ($genpostmaster);
|
||||
}
|
||||
|
||||
|
||||
if ($genusers) { # Create the user accounts
|
||||
$storenum=0;
|
||||
for ($i = $firstaccount; $i < $firstaccount+$numaccounts; $i++) {
|
||||
# build user account name
|
||||
my $acctname = $username;
|
||||
$acctname =~ s/%ld/$i/; # insert user number
|
||||
my $password = $userpassword;
|
||||
$password =~ s/%ld/$i/; # insert user number
|
||||
|
||||
|
||||
|
||||
# MAKE SURE THERE ARE NO TRAILING SPACES IN THE LDIF
|
||||
my $extradata = "";
|
||||
|
||||
if ($maxstores > 0) { # assign them to a store
|
||||
my $storename = $storebase;
|
||||
$storename =~ s/%ld/$storenum/;
|
||||
$extradata .= "mailmessagestore: $storename\n";
|
||||
$storenum++;
|
||||
$storenum=0 if ($storenum >= $maxstores);
|
||||
}
|
||||
|
||||
$extradata .= "objectclass: nsMessagingServerUser\n"
|
||||
if ($usemsg4schema);
|
||||
|
||||
print $outfile <<END;
|
||||
dn: uid=$acctname, $basedn
|
||||
userpassword: $password
|
||||
givenname: $acctname
|
||||
sn: $acctname
|
||||
cn: $acctname
|
||||
uid: $acctname
|
||||
mail: $acctname\@$domain
|
||||
mailhost: $mailhost
|
||||
maildeliveryoption: mailbox
|
||||
objectclass: top
|
||||
objectclass: person
|
||||
objectclass: organizationalPerson
|
||||
objectclass: inetOrgPerson
|
||||
objectclass: mailRecipient
|
||||
$extradata
|
||||
END
|
||||
}
|
||||
}
|
||||
|
||||
if ($genbroadcast) { # Create the broadcast account
|
||||
# MAKE SURE THERE ARE NO TRAILING SPACES IN THE LDIF
|
||||
my $password = $userpassword;
|
||||
$password =~ s/%ld//; # strip user number
|
||||
# initial part
|
||||
print $outfile <<END;
|
||||
dn: uid=$bcastacct, $basedn
|
||||
userpassword: $password
|
||||
givenname: $bcastacct
|
||||
sn: $bcastacct
|
||||
cn: $bcastacct
|
||||
uid: $bcastacct
|
||||
mail: $bcastacct\@$domain
|
||||
mailhost: $mailhost
|
||||
maildeliveryoption: forward
|
||||
END
|
||||
|
||||
# now put in each address
|
||||
for ($i = $firstaccount; $i < $firstaccount+$numaccounts; $i++) {
|
||||
# build user account name
|
||||
my $acctname = $username;
|
||||
$acctname =~ s/%ld/$i/; # insert user number
|
||||
|
||||
print $outfile "mailforwardingaddress: $acctname\@$domain\n";
|
||||
}
|
||||
|
||||
# final part
|
||||
print $outfile <<END;
|
||||
objectclass: top
|
||||
objectclass: person
|
||||
objectclass: organizationalPerson
|
||||
objectclass: inetOrgPerson
|
||||
objectclass: mailRecipient
|
||||
|
||||
END
|
||||
}
|
||||
|
||||
if ($genpostmaster) { # Create the postmaster account
|
||||
# MAKE SURE THERE ARE NO TRAILING SPACES IN THE LDIF
|
||||
print $outfile <<END;
|
||||
dn: cn=postmaster, $basedn
|
||||
cn: postmaster
|
||||
mail: postmaster\@$domain
|
||||
mailalternateaddress: postmaster\@$mailhost
|
||||
mgrprfc822mailmember: $postmasterAddress
|
||||
objectclass: top
|
||||
objectclass: mailGroup
|
||||
objectclass: groupOfUniqueNames
|
||||
|
||||
END
|
||||
}
|
||||
|
||||
# mixing passwd output with the ldif output above would be quite silly
|
||||
if ($genpasswd) { # Create passwd entries for makeusers
|
||||
for ($i = $firstaccount; $i < $firstaccount+$numaccounts; $i++) {
|
||||
# build user account name
|
||||
my $acctname = $username;
|
||||
$acctname =~ s/%ld/$i/; # insert user number
|
||||
my $password = $userpassword;
|
||||
$password =~ s/%ld/$i/; # insert user number
|
||||
my $uid = $firstuid + $i;
|
||||
print $outfile "$acctname:$password:$uid:$uid:Mail user $acctname:/home/$acctname:/bin/sh\n";
|
||||
}
|
||||
}
|
||||
|
||||
exit 0;
|
||||
@@ -1,371 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# Generate reports independently of mailmaster
|
||||
# Can be used during a run or after mailmaster has finished
|
||||
|
||||
print "Netscape Mailstone\n";
|
||||
print "Copyright (c) 1997-2000 Netscape Communications Corp.\n";
|
||||
|
||||
# this parses the command line and config file
|
||||
do 'args.pl'|| die $@;
|
||||
parseArgs(); # parse command line
|
||||
setConfigDefaults(); # pick up any missing defaults
|
||||
|
||||
$resultdir = "$resultbase/$params{TSTAMP}";
|
||||
$tmpdir = "$tmpbase/$params{TSTAMP}";
|
||||
$resultstxt = "$resultdir/results.txt";
|
||||
$resultshtml = "$resultdir/results.html";
|
||||
|
||||
if ($params{TESTBED}) { # BACK COMPATIBILITY
|
||||
$params{TESTBED} = "$resultdir/testbed.tbd"; # use saved testbed
|
||||
# open the saved testbed conf file
|
||||
readTestbedFile($params{TESTBED}) || die "$@\n";
|
||||
}
|
||||
|
||||
# Convert old style to new. Write the complete inclusive workload
|
||||
writeWorkloadFile ("$resultdir/all.wld", \@workload)
|
||||
unless ((-r "$resultdir/all.wld") || (-r "$resultdir/all.wld.gz"));
|
||||
|
||||
$testsecs = figureTimeSeconds ($params{TIME}, "minutes");
|
||||
|
||||
print "Starting data reduction\n";
|
||||
|
||||
sub readClientCSV {
|
||||
my $file = shift;
|
||||
my @fields;
|
||||
my $line;
|
||||
|
||||
print "Reading client summary: $file\n";
|
||||
open(CSV, "<$file") || # Summary of all clients
|
||||
open(CSV, "gunzip -c $file.gz |") ||
|
||||
return 0; # failed
|
||||
|
||||
# Title line: Verify that arguments are in the same order
|
||||
$line = <CSV>;
|
||||
unless ($line) {
|
||||
print "readClientCSV: Error reading $file. \n";
|
||||
return 0;
|
||||
}
|
||||
chomp $line; # strip newline
|
||||
@fields = split /,/, $line; # turn into an array
|
||||
my $cli = shift @fields; # pull off client header
|
||||
my $cn = shift @fields; # pull off num header
|
||||
my $pro = shift @fields; # pull off protocol header
|
||||
|
||||
# Client array, per variable, per protocol
|
||||
foreach $p (@protocols) {
|
||||
# This hash will hold the timers
|
||||
$clidata{$p} = ArrayInstance->new();
|
||||
foreach $t (@timers) {
|
||||
# This hash will hold the values in the timer
|
||||
$clidata{$p}->{$t} = ArrayInstance->new();
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
# This hash that will hold the actual values per client
|
||||
$clidata{$p}->{$t}->{$f} = ArrayInstance->new();
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarClientFields) { # non-timer fields
|
||||
# This hash that will hold the actual values per client
|
||||
$clidata{$p}->{$t} = ArrayInstance->new();
|
||||
}
|
||||
}
|
||||
|
||||
foreach $f (@commClientFields) { # proto independent
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$f/i) {
|
||||
print "readClientCSV: Protocol order mismatch '$v', '$f' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
foreach $t (@timers) { # timers
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$t:$f/i) {
|
||||
print "readClientCSV: Protocol order mismatch '$v', '$t:$f' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarClientFields) { # scalars
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$t/i) {
|
||||
print "readClientCSV: Protocol order mismatch '$v', '$t' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
# Now read actual data
|
||||
while (<CSV>) {
|
||||
chomp; # strip newline
|
||||
@fields = split /,/; # turn into an array
|
||||
my $cli = shift @fields; # pull off client header
|
||||
my $cn = shift @fields; # pull off num header
|
||||
my $p = shift @fields; # pull off protocol header
|
||||
my $cp = $clidata{$p};
|
||||
|
||||
# Create the needed finals arrays
|
||||
unless ($finals{$p}) {
|
||||
#print "Creating finals{$p}\n"; # DEBUG
|
||||
$finals{$p} = ArrayInstance->new();
|
||||
foreach $t (@timers) {
|
||||
$finals{$p}->{$t} = ArrayInstance->new();
|
||||
}
|
||||
}
|
||||
|
||||
foreach $f (@commClientFields) { # proto independent
|
||||
$cliGen{$f}->{$cn} = shift @fields;
|
||||
}
|
||||
foreach $t (@timers) { # timers
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
$cp->{$t}->{$f}->{$cn} = shift @fields;
|
||||
$finals{$p}->{$t}->{$f} += $cp->{$t}->{$f}->{$cn};
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarClientFields) { # scalars
|
||||
$cp->{$t}->{$cn} = shift @fields;
|
||||
$finals{$p}->{$t} += $cp->{$t}->{$cn};
|
||||
}
|
||||
|
||||
foreach $section (@workload) { # find thread count for this client
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
next unless ($section->{sectionParams} =~ /$cli/);
|
||||
#print "Process $cli has threads $section->{THREADS}\n";
|
||||
$reportingClients += ($section->{THREADS})
|
||||
? $section->{THREADS} : 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
close (CSV);
|
||||
return 1; # success
|
||||
}
|
||||
|
||||
sub readTimeCSV {
|
||||
my $file = shift;
|
||||
my $p = shift;
|
||||
my $gp = $graphs{$p};
|
||||
my $line;
|
||||
|
||||
print "Reading time $p summary: $file\n";
|
||||
open(CSV, "<$file") || # Summary over time
|
||||
open(CSV, "gunzip -c $file.gz |") ||
|
||||
return 0; # failed
|
||||
|
||||
# Verify that arguments are in the same order
|
||||
$line = <CSV>;
|
||||
unless ($line) {
|
||||
print "readTimeCSV: Error reading $file. \n";
|
||||
return 0;
|
||||
}
|
||||
chomp $line; # strip newline
|
||||
@fields = split /,/, $line;
|
||||
my $t = shift @fields; # pull off time header
|
||||
foreach $t (@timers) {
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$t:$f/i) {
|
||||
print "readTimeCSV: Protocol order mismatch '$v', '$t:$f' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarGraphFields) {
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$t/i) {
|
||||
print "readTimeCSV: Protocol order mismatch '$v', '$t' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
while (<CSV>) {
|
||||
chomp;
|
||||
#print "LINE: $_\n";
|
||||
@fields = split /,/;
|
||||
my $tm = shift @fields; # pull off time header
|
||||
#print "t=$t ";
|
||||
foreach $t (@timers) {
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
$gp->{$t}->{$f}->{$tm} = shift @fields;
|
||||
#print "$v=$gp->{$v}->{$tm} ";
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarGraphFields) {
|
||||
$gp->{$t}->{$tm} = shift @fields;
|
||||
#print "$v=$gp->{$v}->{$tm} ";
|
||||
}
|
||||
#print "\n";
|
||||
}
|
||||
close (CSV);
|
||||
return 1; # success
|
||||
}
|
||||
|
||||
sub loadCSV {
|
||||
my @csvs = <$resultdir/time-*.csv>;
|
||||
@csvs = <$resultdir/time-*.csv.gz> unless (@csvs);
|
||||
return 0 unless (@csvs); # no time.csv files
|
||||
|
||||
# stuff normally done from reduce.pl (should all be in protoconf?)
|
||||
# Basic sanity check
|
||||
return 0 unless ($testsecs > 0);
|
||||
|
||||
$startTime = 0; # these are timeInSeconds/$timeStep
|
||||
$endTime = 0;
|
||||
|
||||
# keep graphs with somewhat more precision than sample rate;
|
||||
$timeStep = int ($params{FREQUENCY} / 2);
|
||||
if ($timeStep < 1) { $timeStep = 1; }
|
||||
|
||||
# global results initialization
|
||||
$reportingClients = 0;
|
||||
$totalProcs = 0; # number of clients started
|
||||
|
||||
foreach $f (@commClientFields) { # protocol independent fields
|
||||
$cliGen{$f} = ArrayInstance->new();
|
||||
}
|
||||
|
||||
return 0 unless (readClientCSV ("$resultdir/clients.csv")); # client info
|
||||
|
||||
foreach $c (@csvs) { # read time info
|
||||
$c =~ s/.gz$//; # strip .gz extension
|
||||
my $p = $c; # strip down to protocol portion
|
||||
$p =~ s/$resultdir\/time-//;
|
||||
$p =~ s/.csv$//;
|
||||
return 0 unless (readTimeCSV ($c, $p));
|
||||
}
|
||||
|
||||
return 0 unless ($reportingClients > 0);
|
||||
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my @hlist = split /[\s,]/, $slist;
|
||||
my $hcnt = (1 + $#hlist);
|
||||
my $pcount = $section->{PROCESSES};
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 1;
|
||||
|
||||
$totalProcs += $pcount * $tcount * $hcnt;
|
||||
}
|
||||
|
||||
# Find time extent for a key graph
|
||||
($startTime, $endTime) = dataMinMax ("blocks", \@protocols,
|
||||
$startTime, $endTime);
|
||||
|
||||
$realTestSecs = ($endTime - $startTime) * $timeStep;
|
||||
$realTestSecs = 1 unless ($realTestSecs); # in case of small MaxBlocks
|
||||
printf "Reported test duration %d seconds with %d second resolution\n",
|
||||
$realTestSecs, $timeStep;
|
||||
$realTestSecs = $testsecs if ($realTestSecs > $testsecs);
|
||||
|
||||
my @newProtos; # figure real protocol list
|
||||
foreach $p (@protocols) {
|
||||
my $gp = $graphs{$p};
|
||||
my $numValid = 0;
|
||||
# See if there is real data here
|
||||
CHECKVAL: foreach $t (@timers) {
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
my $vp = $gp->{$t}->{$f};
|
||||
next unless ($vp); # no data
|
||||
next unless (scalar %$vp); # redundant???
|
||||
|
||||
#print "Checking: $p $t $f => ENTRIES\n";
|
||||
$numValid++;
|
||||
last CHECKVAL;
|
||||
}
|
||||
}
|
||||
($numValid > 0) || next;
|
||||
|
||||
push @newProtos, $p;
|
||||
}
|
||||
# update protocol list to only have what was used
|
||||
@protocols = @newProtos;
|
||||
@protocolsAll = @newProtos;
|
||||
push @protocolsAll, "Total";
|
||||
}
|
||||
|
||||
|
||||
my $doFull = 1; # re-processing is currently broken
|
||||
|
||||
# if (!((-f "$resultdir/clients.csv")
|
||||
# || (-f "$resultdir/clients.csv.gz"))) { # no processing yet
|
||||
# $doFull = 1;
|
||||
# } else { # see if any source is newer than csv
|
||||
# foreach $section (@workload) {
|
||||
# next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
# my $slist = $section->{sectionParams};
|
||||
# $slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
# foreach $cli (split /[\s,]/, $slist) {
|
||||
# my $fname = getClientFilename ($cli, $section);
|
||||
# if ((-r $fname) # raw source exists
|
||||
# && ((-M "$resultdir/clients.csv")
|
||||
# > (-M $fname))) { # newer
|
||||
# #print "$fname is newer than $resultdir/clients.csv\n";
|
||||
# $doFull++;
|
||||
# last;
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
|
||||
# unless ($doFull) { # do CSV load
|
||||
# # if this is a csv only run, then these may not exist yet
|
||||
# mkdir ("$tmpbase", 0775);
|
||||
# mkdir ("$tmpdir", 0775);
|
||||
# unless (-r "$resultbase/index.html") {
|
||||
# do 'makeindex.pl' || warn "$@\n"; # html index
|
||||
# }
|
||||
|
||||
# $doFull = 1 unless (loadCSV); # if CSV fails, fall back to full processing
|
||||
# }
|
||||
|
||||
if ($doFull) {
|
||||
do 'reduce.pl' || die "$@\n";
|
||||
}
|
||||
|
||||
|
||||
print "Generating results pages:\t", scalar (localtime), "\n";
|
||||
|
||||
do 'report.pl' || die "$@\n";
|
||||
|
||||
# Now display that data to console
|
||||
if ($params{VERBOSE}) {
|
||||
fileShow ($resultstxt);
|
||||
print "\n";
|
||||
}
|
||||
|
||||
pathprint ("\nResults (text):\t$resultstxt\n");
|
||||
pathprint ( "Results (HTML):\t$resultshtml\n");
|
||||
print "Index of runs: \tfile://$cwd/$resultbase/index.html\n";
|
||||
|
||||
print "Process done:\t", scalar (localtime), "\n";
|
||||
@@ -1,158 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# This define the structures that hold summary, client, and graph data,
|
||||
|
||||
# This sets the names used for display. Can be internationalized.
|
||||
# All top level names are here (both timers and scalars).
|
||||
# Any unlisted names will map to themselves.
|
||||
%timerNames
|
||||
= (
|
||||
#internal name, Printed name
|
||||
"total", "total",
|
||||
"conn", "connect",
|
||||
"reconn", "reconnect",
|
||||
"banner", "banner",
|
||||
"login", "login",
|
||||
"cmd", "command",
|
||||
"submit", "submit",
|
||||
"retrieve", "retrieve",
|
||||
"logout", "logout",
|
||||
"idle", "idle",
|
||||
"connections", "connections",
|
||||
"blocks", "blocks",
|
||||
);
|
||||
|
||||
# This sets the names used for display. Can be internationalized.
|
||||
%fieldNames
|
||||
= (
|
||||
#internal name, Printed name
|
||||
"Try", "Try",
|
||||
"Error", "Error",
|
||||
"BytesR", "BytesR",
|
||||
"BytesW", "BytesW",
|
||||
"Time", "Time",
|
||||
"TimeMin", "TMin",
|
||||
"TimeMax", "TMax",
|
||||
"Time2", "TStd",
|
||||
);
|
||||
|
||||
|
||||
# hold time graphs for each protocol
|
||||
%graphs = ();
|
||||
|
||||
# Totals are done during plotting, if needed
|
||||
%finals = (); # create base finals hash
|
||||
|
||||
# These are sections that dont get passed to mailclient (case insensitive)
|
||||
@scriptWorkloadSections
|
||||
= (
|
||||
"Config", # special, references %params
|
||||
"Client", # testbed client(s)
|
||||
"Graph", # graph generation
|
||||
"Setup", # things to run with ./setup
|
||||
"Startup", # things to run before test
|
||||
"Monitor", # other performance monitoring
|
||||
"PreTest", # things to run before test
|
||||
"PostTest", # things to run after test
|
||||
);
|
||||
|
||||
# These are sections that arent protocols. Anything else must be.
|
||||
@nonProtocolSections
|
||||
= (@scriptWorkloadSections, ("Default"));
|
||||
|
||||
# These are the known workload parameters (as they will print)
|
||||
# These are coerced to upper case internally (do NOT internationize)
|
||||
@workloadParameters
|
||||
= (
|
||||
"addressFormat",
|
||||
"arch",
|
||||
"blockID",
|
||||
"blockTime",
|
||||
"chartHeight",
|
||||
"chartPoints",
|
||||
"chartWidth",
|
||||
"clientCount",
|
||||
"command",
|
||||
"comments",
|
||||
"file",
|
||||
"firstAddress",
|
||||
"firstLogin",
|
||||
"frequency",
|
||||
"gnuplot",
|
||||
"group",
|
||||
"idleTime",
|
||||
"leaveMailOnServer",
|
||||
"loginFormat",
|
||||
"loopDelay",
|
||||
"numAddresses",
|
||||
"numLogins",
|
||||
"numLoops",
|
||||
"numRecips",
|
||||
"mailClient",
|
||||
"maxBlocks",
|
||||
"maxClients",
|
||||
"maxErrors",
|
||||
"maxThreads",
|
||||
"maxProcesses",
|
||||
"passwdFormat",
|
||||
"processes",
|
||||
"rampTime",
|
||||
"rcp",
|
||||
"rsh",
|
||||
"sequentialAddresses",
|
||||
"sequentialLogins",
|
||||
"server",
|
||||
"smtpMailFrom",
|
||||
"sysConfig",
|
||||
"threads",
|
||||
"telemetry",
|
||||
"tempDir",
|
||||
"time",
|
||||
"title",
|
||||
"TStamp",
|
||||
"useAuthLogin",
|
||||
"useEHLO",
|
||||
"weight",
|
||||
"wmapBannerCmds",
|
||||
"wmapClientHeader",
|
||||
"wmapInBoxCmds",
|
||||
"wmapLoginCmd",
|
||||
"wmapLoginData",
|
||||
"wmapLogoutCmds",
|
||||
"wmapMsgReadCmds",
|
||||
"wmapMsgWriteCmds",
|
||||
"workload",
|
||||
);
|
||||
|
||||
return 1;
|
||||
@@ -1,605 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# This file deals with the summary data only
|
||||
|
||||
# Should be packages
|
||||
do 'genplot.pl' || die "$@\n";
|
||||
|
||||
sub walkSetupTotals {
|
||||
my $a = shift; my $f = shift; my $p = shift;
|
||||
if ($p =~ /(\w+):(\w+):$/) {
|
||||
my $tm = $2;
|
||||
if (!($finals{Total}->{$tm}->{$f})) {
|
||||
$finals{Total}->{$tm}->{$f} = $a;
|
||||
} elsif ($f =~ /Min$/) {
|
||||
$finals{Total}->{$tm}->{$f} = $a
|
||||
if (($a > 0.0) && ($a < $finals{Total}->{$tm}->{$f}));
|
||||
} elsif ($f =~ /Max$/) {
|
||||
$finals{Total}->{$tm}->{$f} = $a if ($a > $finals{Total}->{$tm}->{$f});
|
||||
} else {
|
||||
$finals{Total}->{$tm}->{$f} += $a;}
|
||||
}
|
||||
elsif ($p =~ /(\w+):$/) {
|
||||
$finals{Total}->{$f} += $a;
|
||||
}
|
||||
}
|
||||
|
||||
sub setupTotals {
|
||||
# Figure out combined timers for "Total" protocol
|
||||
# We might do a smarter merge here (look at context and try to match order)
|
||||
# As long as the first protocol is a superset, it wont matter
|
||||
my @tnames;
|
||||
foreach $proto (@protocols) {
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n;
|
||||
$t =~ s/([][{}*+?^.\/])/\\$1/g; # quote regex syntax
|
||||
my $found = 0;
|
||||
foreach $tn (@tnames) { # see if it is in the list already
|
||||
next unless ($tn =~ /$t/);
|
||||
$found = 1;
|
||||
last;
|
||||
}
|
||||
#print "proto $proto: Found $n\n" if ($found > 0);
|
||||
next if ($found > 0);
|
||||
#print "proto $proto: Add $n\n";
|
||||
push @tnames, $n; # add to list
|
||||
}
|
||||
}
|
||||
#print "'Total' timers @tnames\n";
|
||||
$protocolFields{"Total"} = \@tnames;
|
||||
|
||||
# Create "Total" hashes
|
||||
$finals{Total} = ArrayInstance->new();
|
||||
foreach $n (@{$protocolFields{"Total"}}) { # all timers
|
||||
my $t = $n; # dont modify original list
|
||||
if ($t =~ /^\[(\w+)\]$/) { # Timer case, strip off brackets
|
||||
$finals{Total}->{$1} = ArrayInstance->new();
|
||||
#print "Creating Total timer field $1\n";
|
||||
} else { # scalar
|
||||
$finals{Total}->{$n} = 0;
|
||||
#print "Creating Total scalar field $n\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Total finals array
|
||||
foreach $proto (@protocols) {
|
||||
foreach $t (@{$protocolFields{$proto}}) {
|
||||
if ($t =~ /^\[(\w+)\]$/) { # Timer case, strip off brackets
|
||||
my $tm = $1;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
my $a = $finals{$proto}->{$tm}->{$f};
|
||||
if (!($finals{Total}->{$tm}->{$f})) { # never touched
|
||||
$finals{Total}->{$tm}->{$f} = $a;
|
||||
} elsif ($f =~ /Min$/) {
|
||||
$finals{Total}->{$tm}->{$f} = $a
|
||||
if (($a > 0.0)
|
||||
&& ($a < $finals{Total}->{$tm}->{$f}));
|
||||
} elsif ($f =~ /Max$/) {
|
||||
$finals{Total}->{$tm}->{$f} = $a
|
||||
if ($a > $finals{Total}->{$tm}->{$f});
|
||||
} else {
|
||||
$finals{Total}->{$tm}->{$f} += $a;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$finals{Total}->{$t} += $finals{$proto}->{$t};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Convert Time2 to standard deviation
|
||||
foreach $proto (@protocolsAll) {
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
if ($t =~ /^\[(\w+)\]$/) { $t = $1; } # strip off brackets
|
||||
next unless ($finals{$proto}->{$t}); # proto doesnt have timer
|
||||
next unless ($finals{$proto}->{$t}->{Try});
|
||||
next unless ($finals{$proto}->{$t}->{Time2} > 0);
|
||||
my $ss = $finals{$proto}->{$t}->{Time2};
|
||||
my $tot = $finals{$proto}->{$t}->{Time};
|
||||
my $n = $finals{$proto}->{$t}->{Try};
|
||||
next unless ($n > 0); # skip if this is 0
|
||||
|
||||
my $var = ($ss - (($tot * $tot) / $n)) / $n;
|
||||
print "$proto->$t var < 0: Time2=$ss Time=$tot n=$n\n"
|
||||
if ($var < 0);
|
||||
$finals{$proto}->{$t}->{Time2} = ($var > 0) ? sqrt ($var) : 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
# Divide total times by trys to get averate time
|
||||
foreach $proto (@protocolsAll) {
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
if ($t =~ /^\[(\w+)\]$/) { $t = $1; } # strip off brackets
|
||||
next unless ($finals{$proto}->{$t}); # proto doesnt have timer
|
||||
($finals{$proto}->{$t}->{Try}) || next;
|
||||
$finals{$proto}->{$t}->{Time} /= $finals{$proto}->{$t}->{Try}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# The text version is designed to be machine processable
|
||||
# commify and kformat are not used
|
||||
sub genTextReport {
|
||||
fileBackup ($resultstxt); # if processing as we go, backup old file
|
||||
# Open a text file to hold the results
|
||||
open(RESULTSTXT, ">$resultstxt") ||
|
||||
die "Couldn't open $resultstxt: $!";
|
||||
|
||||
# Store results as text
|
||||
printf RESULTSTXT "---- Netscape MailStone Results $params{TSTAMP} ----\n";
|
||||
|
||||
printf RESULTSTXT "\t\t%s\n", $params{TITLE};
|
||||
printf RESULTSTXT "\t\t%s\n", $params{COMMENTS};
|
||||
printf RESULTSTXT "\n";
|
||||
printf RESULTSTXT "Test duration: %d %s. Rampup: %d %s. Reported duration %s seconds\n",
|
||||
figureTimeNumber ($params{TIME}),
|
||||
figureTimeUnits ($params{TIME}, "minutes"),
|
||||
figureTimeNumber ($params{RAMPTIME}),
|
||||
figureTimeUnits ($params{RAMPTIME}, "seconds"), $realTestSecs;
|
||||
printf RESULTSTXT "Number of reporting clients: %s of %s\n",
|
||||
$reportingClients, $totalProcs;
|
||||
|
||||
foreach $proto (@protocolsAll) {
|
||||
# do op counters
|
||||
printf RESULTSTXT "\n%-15s ", $proto;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
#($f =~ m/^Time2$/o) && next;
|
||||
printf RESULTSTXT "%13s",
|
||||
($fieldNames{$f}) ? $fieldNames{$f} : $f;
|
||||
}
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
unless ($t =~ /^\[(\w+)\]$/) { # scalar case
|
||||
#next; # skip scalars for now
|
||||
# do scalar counters. Column should line up with "Try"
|
||||
printf RESULTSTXT "\n%-15s ",
|
||||
$proto . ":" . (($timerNames{$t}) ? $timerNames{$t} : $t);
|
||||
printf RESULTSTXT
|
||||
"%13s", $finals{$proto}->{$t};
|
||||
next;
|
||||
} else { # strip off brackets
|
||||
$t = $1;
|
||||
}
|
||||
printf RESULTSTXT "\n%-15s ",
|
||||
$proto . ":" . (($timerNames{$t}) ? $timerNames{$t} : $t);
|
||||
foreach $f (@timerFieldsAll) {
|
||||
#($f =~ m/^Time2$/o) && next;
|
||||
if ($f =~ m/Time/o) {
|
||||
printf RESULTSTXT
|
||||
"%13.3f", $finals{$proto}->{$t}->{$f};
|
||||
} elsif ($f =~ m/Bytes/o) {
|
||||
printf RESULTSTXT
|
||||
"%13d", $finals{$proto}->{$t}->{$f};
|
||||
} else {
|
||||
printf RESULTSTXT
|
||||
"%13s", $finals{$proto}->{$t}->{$f};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# do ops/sec
|
||||
printf RESULTSTXT "\n\n%-15s ", $proto;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
($f =~ m/^Time/o) && next;
|
||||
printf RESULTSTXT "%9s/sec",
|
||||
($fieldNames{$f}) ? $fieldNames{$f} : $f;
|
||||
}
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
unless ($t =~ /^\[(\w+)\]$/) { # scalar case
|
||||
#next; # skip scalars for now
|
||||
# do scalar counter/sec. Column should line up with "Try"
|
||||
printf RESULTSTXT "\n%-15s ",
|
||||
$proto . ":" . (($timerNames{$t}) ? $timerNames{$t} : $t) . "/s";
|
||||
printf RESULTSTXT
|
||||
"%13.3f", $finals{$proto}->{$t} / $realTestSecs;
|
||||
next;
|
||||
} else {
|
||||
$t = $1;
|
||||
}
|
||||
printf RESULTSTXT "\n%-15s ",
|
||||
$proto . ":" . (($timerNames{$t}) ? $timerNames{$t} : $t) . "/s";
|
||||
foreach $f (@timerFieldsAll) {
|
||||
($f =~ m/^Time/o) && next;
|
||||
if ($f =~ m/Bytes/o) {
|
||||
printf RESULTSTXT
|
||||
"%13d",
|
||||
$finals{$proto}->{$t}->{$f} / $realTestSecs;
|
||||
} else {
|
||||
printf RESULTSTXT
|
||||
"%13.3f",
|
||||
$finals{$proto}->{$t}->{$f} / $realTestSecs;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf RESULTSTXT "\n\n";
|
||||
}
|
||||
|
||||
if ($params{SYSCONFIG}) {
|
||||
print RESULTSTXT "\nSytem config details\n";
|
||||
if (($params{SYSCONFIG} =~ m/^\S+$/o)
|
||||
&& (open(SCFILE, "<$params{SYSCONFIG}"))) {
|
||||
while (<SCFILE>) {
|
||||
(m/^<\S+>\s*$/o) && next; # skip HTML only on them
|
||||
s/<\S+>//g; # trim out obvious HTML commands
|
||||
s/<!--.*-->//g; # trim out HTML comments
|
||||
print RESULTSTXT $_;
|
||||
}
|
||||
close(SCFILE);
|
||||
} else {
|
||||
my $l = $params{SYSCONFIG}; # filter similar to above
|
||||
$l =~ s/<\S+>//g; # trim out obvious HTML commands
|
||||
$l =~ s/<!--.*-->//g; # trim out HTML comments
|
||||
$l =~ s/\\\n/\n/g; # turn quoted newline to plain newline
|
||||
print RESULTSTXT $l;
|
||||
}
|
||||
}
|
||||
|
||||
close(RESULTSTXT);
|
||||
}
|
||||
|
||||
# Write the main part of the HTML page
|
||||
sub genHTMLReportStart {
|
||||
fileBackup ($resultshtml); # if processing as we go, backup old file
|
||||
# Open an html file to hold the results
|
||||
open(RESULTSHTML, ">$resultshtml") ||
|
||||
die "Couldn't open $resultshtml: $!";
|
||||
|
||||
print RESULTSHTML <<END;
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
||||
<HTML>
|
||||
<A NAME=TitleSection>
|
||||
<TITLE>
|
||||
Netscape MailStone Results $params{TSTAMP}
|
||||
</TITLE>
|
||||
</A>
|
||||
<HEAD>
|
||||
</HEAD>
|
||||
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#000088">
|
||||
<CENTER>
|
||||
<HR NOSHADE WIDTH="100%">
|
||||
<H1>Netscape MailStone Results $params{TSTAMP}</H1>
|
||||
<H2>$params{TITLE}</H2>
|
||||
<I>$params{COMMENTS}</I>
|
||||
<HR WIDTH="100%">
|
||||
</CENTER>
|
||||
|
||||
END
|
||||
printf RESULTSHTML "<BR><B>Test duration:</B> %d %s. ",
|
||||
figureTimeNumber ($params{TIME}),
|
||||
figureTimeUnits ($params{TIME}, "minutes");
|
||||
printf RESULTSHTML "<B>Rampup:</B> %d %s. ",
|
||||
figureTimeNumber ($params{RAMPTIME}),
|
||||
figureTimeUnits ($params{RAMPTIME}, "seconds");
|
||||
printf RESULTSHTML "<B>Reported duration:</B> %s seconds\n",
|
||||
commify ($realTestSecs);
|
||||
|
||||
printf RESULTSHTML "<BR><B>Reporting clients:</B> %s of %s\n",
|
||||
commify ($reportingClients), commify ($totalProcs);
|
||||
|
||||
print RESULTSHTML <<END;
|
||||
<BR>
|
||||
Test <A HREF="all.wld">complete workload</a> description.
|
||||
Filtered <A HREF="work.wld">workload</a> description.
|
||||
<BR>
|
||||
Plain <A HREF="results.txt">text version</a> of results.
|
||||
Log of <A HREF="stderr">stderr</a> and debugging output.
|
||||
<BR>
|
||||
|
||||
<A NAME=MonitoringSection></A>
|
||||
END
|
||||
|
||||
{ # list user requested logging
|
||||
my @logfiles = <$resultdir/*-pre.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
$f =~ s/$resultdir\///o; # strip directory out
|
||||
$f =~ s/-pre\.log$//o; # strip extension off
|
||||
print RESULTSHTML "Pre test log: <A HREF=\"$f-pre.log\">$f</a><BR>\n";
|
||||
}
|
||||
}
|
||||
@logfiles = <$resultdir/*-run.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
$f =~ s/$resultdir\///o; # strip directory out
|
||||
$f =~ s/-run\.log$//o; # strip extension off
|
||||
print RESULTSHTML "Monitoring log: <A HREF=\"$f-run.log\">$f</a><BR>\n";
|
||||
}
|
||||
}
|
||||
@logfiles = <$resultdir/*-post.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
$f =~ s/$resultdir\///o; # strip directory out
|
||||
$f =~ s/-post\.log$//o; # strip extension off
|
||||
print RESULTSHTML "Post test log: <A HREF=\"$f-post.log\">$f</a><BR>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#print RESULTSHTML
|
||||
#"<CENTER><H2>Results per protocol</H2></CENTER>\n";
|
||||
|
||||
foreach $proto (@protocolsAll) {
|
||||
printf RESULTSHTML "<A NAME=%sTable></A>\n", $proto;
|
||||
printf RESULTSHTML
|
||||
"<TABLE BORDER=2 CELLSPACING=2 CELLPADDING=2 COLS=%d WIDTH=\"95%%\">",
|
||||
2+$#{@{$protocolFields{$proto}}};
|
||||
print RESULTSHTML
|
||||
"<CAPTION>$proto Counters</CAPTION>\n";
|
||||
# do op counters
|
||||
print RESULTSHTML
|
||||
"<TR><TH>$proto</TH>\n";
|
||||
foreach $f (@timerFieldsAll) {
|
||||
#($f =~ m/^Time2$/o) && next;
|
||||
printf RESULTSHTML "<TH>%s</TH> ",
|
||||
($fieldNames{$f}) ? $fieldNames{$f} : $f;
|
||||
}
|
||||
print RESULTSHTML
|
||||
"</TR>\n";
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
unless ($t =~ /^\[(\w+)\]$/) { # scalar case
|
||||
next; # skip scalars for now
|
||||
# do scalar counters. Column should line up with "Try"
|
||||
printf RESULTSHTML "<TR ALIGN=RIGHT><TH>%s</TH>\n",
|
||||
($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
commify ($finals{$proto}->{$t});
|
||||
next;
|
||||
} else {
|
||||
$t = $1;
|
||||
}
|
||||
printf RESULTSHTML "<TR ALIGN=RIGHT><TH>%s</TH>\n",
|
||||
($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
#($f =~ m/^Time2$/o) && next;
|
||||
if ($f =~ m/Time/o) {
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
tformat ($finals{$proto}->{$t}->{$f});
|
||||
} elsif ($f =~ m/Bytes/o) {
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
kformat ($finals{$proto}->{$t}->{$f});
|
||||
} else {
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
commify ($finals{$proto}->{$t}->{$f});
|
||||
}
|
||||
}
|
||||
print RESULTSHTML "</TR>\n";
|
||||
}
|
||||
|
||||
# do ops/sec
|
||||
print RESULTSHTML
|
||||
"<TR><TH>$proto</TH>\n";
|
||||
foreach $f (@timerFieldsAll) {
|
||||
($f =~ m/^Time/o) && next;
|
||||
printf RESULTSHTML "<TH>%s/sec</TH> ",
|
||||
($fieldNames{$f}) ? $fieldNames{$f} : $f;
|
||||
}
|
||||
print RESULTSHTML
|
||||
"</TR>\n";
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
unless ($t =~ /^\[(\w+)\]$/) { # scalar case
|
||||
next; # skip scalars for now
|
||||
# do scalar counters. Column should line up with "Try"
|
||||
printf RESULTSHTML "<TR ALIGN=RIGHT><TH>%s</TH>\n",
|
||||
($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
printf RESULTSHTML
|
||||
"<TD>%.3f</TD> ",
|
||||
$finals{$proto}->{$t} / $realTestSecs;
|
||||
next;
|
||||
} else {
|
||||
$t = $1;
|
||||
}
|
||||
printf RESULTSHTML "<TR ALIGN=RIGHT><TH>%s</TH>\n",
|
||||
($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
($f =~ m/^Time/o) && next;
|
||||
if ($f =~ m/Bytes/o) {
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
kformat ($finals{$proto}->{$t}->{$f} / $realTestSecs);
|
||||
} else {
|
||||
printf RESULTSHTML
|
||||
"<TD>%.3f</TD> ",
|
||||
$finals{$proto}->{$t}->{$f} / $realTestSecs;
|
||||
}
|
||||
}
|
||||
print RESULTSHTML "</TR>\n";
|
||||
}
|
||||
printf RESULTSHTML "</TABLE> <BR>\n\n";
|
||||
}
|
||||
|
||||
print RESULTSHTML <<END;
|
||||
|
||||
<BR>
|
||||
|
||||
<CENTER>
|
||||
<A NAME=GraphSection></A>
|
||||
END
|
||||
}
|
||||
|
||||
%genplotGraphs = ();
|
||||
|
||||
# Call genplot; and, if a graph is generated, insert the HTML reference to it
|
||||
sub genHTMLReportGraph {
|
||||
my $name = shift;
|
||||
my $title = shift;
|
||||
my $label = shift;
|
||||
my $protos = shift || die "genHTMLReportGraph: '$name' missing protocols";
|
||||
my $field = shift;
|
||||
my $vars = shift || die "genHTMLReportGraph: '$name' missing vars";
|
||||
|
||||
if ($genplotGraphs{$name}) {
|
||||
print "Graph $name has already been generated.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
$genplotGraphs{$name} = $title;
|
||||
|
||||
# Delineate and tag each graph
|
||||
print RESULTSHTML "<A NAME=$name><HR SIZE=4 WIDTH=\"90%\"></A>\n";
|
||||
if (genPlot ($name, $title, $label, $protos, $field, $vars) > 0) {
|
||||
print RESULTSHTML <<END;
|
||||
<P><H3>$title</H3>
|
||||
<IMG SRC=$name.$params{IMAGETYPE} ALT="$label"></P>
|
||||
END
|
||||
} else {
|
||||
print RESULTSHTML "<BR>Graph \"$name\" contained no data (@{$vars}).<BR>\n";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# Write the final parts of the HTML page
|
||||
sub genHTMLReportEnd {
|
||||
print RESULTSHTML <<END;
|
||||
<!-- INSERT IMAGES HERE - DO NOT DELETE THIS LINE -->
|
||||
</CENTER>
|
||||
<A NAME=EndSection></A>
|
||||
END
|
||||
|
||||
if ($params{SYSCONFIG}) {
|
||||
print RESULTSHTML "<HR WIDTH=\"100%\">";
|
||||
print RESULTSHTML "<CENTER><H2>Details</H2></CENTER>\n";
|
||||
if (($params{SYSCONFIG} =~ m/^\S+$/o)
|
||||
&& (open(SCFILE, "<$params{SYSCONFIG}"))) { # see if its a file
|
||||
while (<SCFILE>) {
|
||||
print RESULTSHTML $_;
|
||||
}
|
||||
close(SCFILE);
|
||||
} else { # output text directly
|
||||
my $l = $params{SYSCONFIG};
|
||||
$l =~ s/\\\n/\n/g; # turn quoted newline to plain newline
|
||||
print RESULTSHTML $l;
|
||||
}
|
||||
}
|
||||
|
||||
print RESULTSHTML <<END;
|
||||
|
||||
<HR NOSHADE WIDTH="100%">
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
END
|
||||
close(RESULTSHTML);
|
||||
}
|
||||
|
||||
|
||||
# Actually generate the standard stuff
|
||||
setupTotals();
|
||||
genTextReport();
|
||||
|
||||
|
||||
genHTMLReportStart();
|
||||
|
||||
my $graphCount = 0;
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /GRAPH/o);
|
||||
my $name = $section->{sectionParams};
|
||||
$name =~ s/name=\s*//; # strip off initial bit
|
||||
my @varlist = split (/[\s,]+/, $section->{VARIABLES});
|
||||
|
||||
$graphCount++;
|
||||
genHTMLReportGraph ($name, $section->{TITLE}, $section->{LABEL},
|
||||
($section->{FIELD} =~ /Time/o)
|
||||
? \@protocols : \@protocolsAll,
|
||||
$section->{FIELD}, \@varlist);
|
||||
}
|
||||
|
||||
if ($graphCount <= 0) { # use built ins
|
||||
|
||||
# generate the graphs we want
|
||||
# NOTE: the first argument (name), must be unique; sets file name
|
||||
genHTMLReportGraph ("connects",
|
||||
"Number of connections attempted", "Connections/sec",
|
||||
\@protocolsAll, "Try", ["conn" ]);
|
||||
genHTMLReportGraph ("connections",
|
||||
"Total connections", "Connections",
|
||||
\@protocolsAll, "", ["connections" ]);
|
||||
genHTMLReportGraph ("errors",
|
||||
"Number of connection errors", "Errors/sec",
|
||||
\@protocolsAll, "Error", ["conn", "banner", "login", "logout" ]);
|
||||
genHTMLReportGraph ("retrieves",
|
||||
"Number of messages read", "Messages/sec",
|
||||
\@protocolsAll, "Try", ["retrieve" ]);
|
||||
genHTMLReportGraph ("submits",
|
||||
"Number of messages written", "Messages/sec",
|
||||
\@protocolsAll, "Try", ["submit" ]);
|
||||
genHTMLReportGraph ("commands",
|
||||
"Protocol commands", "Commands/sec",
|
||||
\@protocolsAll, "Try", ["cmd" ]);
|
||||
genHTMLReportGraph ("readBytes",
|
||||
"Bytes read", "Bytes/sec",
|
||||
\@protocolsAll, "BytesR", ["login", "banner", "cmd", "retrieve", "submit", "logout" ]);
|
||||
genHTMLReportGraph ("writeBytes",
|
||||
"Bytes written", "Bytes/sec",
|
||||
\@protocolsAll, "BytesW", ["login", "banner", "cmd", "retrieve", "submit", "logout" ]);
|
||||
genHTMLReportGraph ("msgTime",
|
||||
"Message transfer time", "Seconds per message",
|
||||
\@protocols, "Time", ["cmd", "submit", "retrieve" ]);
|
||||
genHTMLReportGraph ("setupTime",
|
||||
"Connection setup time", "Seconds per connection",
|
||||
\@protocols, "Time", ["conn", "banner", "login" ]);
|
||||
genHTMLReportGraph ("blocks",
|
||||
"Number of mailstone blocks executed", "Blocks/sec",
|
||||
\@protocolsAll, "", ["blocks" ]);
|
||||
}
|
||||
|
||||
if ($params{ADDGRAPHS}) { # pick up additional graphs
|
||||
my @graphs = ();
|
||||
readWorkloadFile ($params{ADDGRAPHS}, \@graphs);
|
||||
foreach $section (@graphs) {
|
||||
next unless ($section->{sectionTitle} =~ /GRAPH/o);
|
||||
my $name = $section->{sectionParams};
|
||||
$name =~ s/name=\s*//; # strip off initial bit
|
||||
my @varlist = split (/[\s,]+/, $section->{VARIABLES});
|
||||
|
||||
$graphCount++;
|
||||
genHTMLReportGraph ($name, $section->{TITLE}, $section->{LABEL},
|
||||
($section->{FIELD} =~ /Time/o)
|
||||
? \@protocols : \@protocolsAll,
|
||||
$section->{FIELD}, \@varlist);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
genHTMLReportEnd();
|
||||
|
||||
return 1;
|
||||
@@ -1,205 +0,0 @@
|
||||
#!/bin/ksh
|
||||
|
||||
# global configuration parameters.
|
||||
# Fill in defaults for anything that is not already set
|
||||
|
||||
# Look for testname$test_form, first
|
||||
export test_form=${test_form:-""}
|
||||
|
||||
# string appended to every description
|
||||
export desc_conf=${desc_conf:-""}
|
||||
|
||||
# extra arguments common to all tests
|
||||
export extra_args=${extra_args:-""}
|
||||
|
||||
# error limit to abort sequence
|
||||
export error_limit=${error_limit:-100}
|
||||
|
||||
# set this to only show what it will do
|
||||
export only_show_it=${only_show_it:-0}
|
||||
|
||||
# time to allow the server to calm down after each run
|
||||
export sleep_time=${sleep_time:-5}
|
||||
|
||||
# This is where we store the important runs
|
||||
export save_dir=${save_dir:-"results.save"}
|
||||
|
||||
# Basic sanity test
|
||||
if [[ ! -x /usr/bin/perl || ! -f .license ]] ; then # see if setup was ever run
|
||||
echo "Critical files are missing. Run setup."
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
find_timestamp () { # find the timestamp string from latest run
|
||||
#OLD timestamp=`ls -d results/[0-9]*.[0-9][0-9][0-9][0-9]?(a-z) | tail -1`
|
||||
|
||||
# list all directories with the timestamp pattern
|
||||
timestamp=`echo results/[0-9]*.[0-9][0-9][0-9][0-9]?([a-z])`
|
||||
# strip all but the last one
|
||||
timestamp=${timestamp##* }
|
||||
|
||||
# strip the top directory name out
|
||||
timestamp=${timestamp#results/}
|
||||
|
||||
# return it
|
||||
echo $timestamp
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
# copy last mailstone run from the current directory to good results directory
|
||||
save_run () {
|
||||
|
||||
[[ -d $save_dir ]] || \
|
||||
mkdir $save_dir
|
||||
|
||||
[[ $only_show_it -gt 0 ]] && return 0 # dont do anything important
|
||||
|
||||
if [[ -n "$last_timestamp" && -d "results/$last_timestamp/" ]] ; then
|
||||
cp -pR results/$last_timestamp $save_dir/
|
||||
# index probably has lots of extra junk, but its better than nothing
|
||||
cp -pf results/index.html $save_dir/
|
||||
fi
|
||||
}
|
||||
|
||||
# Display and run a command. Skip if in only_show mode.
|
||||
run () {
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" "$@"
|
||||
return 0
|
||||
fi
|
||||
echo "Running: " "$@"
|
||||
"$@"
|
||||
}
|
||||
|
||||
# Sleep. Skip if in only_show mode.
|
||||
run_sleep () {
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would sleep:" "$@"
|
||||
return 0
|
||||
fi
|
||||
echo "Sleeping: " "$@"
|
||||
sleep "$@"
|
||||
}
|
||||
# for readability, just use sleep
|
||||
alias sleep=run_sleep
|
||||
|
||||
|
||||
# This runs the actual mstone run and check for errors
|
||||
# compress tmp files
|
||||
# Usage: run_test testname description [args...]
|
||||
run_test () {
|
||||
testname="$1"; shift;
|
||||
desc="$1"; shift;
|
||||
|
||||
# see if a special version of this test exists
|
||||
if [[ -f conf/$testname$test_form.wld ]] ; then
|
||||
testname=$testname$test_form
|
||||
fi
|
||||
|
||||
#oldtimestamp=`find_timestamp`
|
||||
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" mstone $testname -b "$desc $desc_conf" $extra_args "$@"
|
||||
if [[ ! -f conf/$testname.wld ]] ; then
|
||||
echo "Configuration Error: No such test $testname"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "\n##########################################################"
|
||||
if [[ ! -f conf/$testname.wld ]] ; then
|
||||
echo "CONFIGURATION ERROR: No such test $testname"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "\nRunning:" mstone $testname -b "$desc $desc_conf" $extra_args "$@"
|
||||
# We actually bypass the mstone script
|
||||
/usr/bin/perl -Ibin -- bin/mailmaster.pl -w conf/$testname.wld -b "$desc $desc_conf" $extra_args "$@"
|
||||
stat=$?
|
||||
|
||||
# BUG if another test is running at the same time, this is wrong
|
||||
timestamp="`find_timestamp`"
|
||||
|
||||
# test failed to even run
|
||||
if [[ $stat -ne 0 ]]
|
||||
then
|
||||
echo "ABORT! Test failed to start"
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom Failed run: `date`" "$mail_list"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# compress tmp files. get the csv files, too.
|
||||
gzip tmp/$timestamp/* results/$timestamp/*.csv
|
||||
|
||||
# stick the timestamp someplace global for a save_run
|
||||
export last_timestamp=$timestamp
|
||||
export all_timestamps="$all_timestamps $timestamp"
|
||||
|
||||
# save the results
|
||||
save_run
|
||||
|
||||
# see how many errors we hit
|
||||
totline=`grep 'Total:total ' results/$timestamp/results.txt`
|
||||
|
||||
# strip label and first field
|
||||
errors=${totline##+([+-z])+( )+([+-9])+( )}
|
||||
# strip trailing fields
|
||||
errors=${errors%% *}
|
||||
|
||||
echo "" # space things out
|
||||
|
||||
if [[ $errors -gt $error_limit ]] ; then
|
||||
echo "ABORT! Errors ($errors) exceed error limit ($error_limit)"
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom Aborted run: `date`" "$mail_list"
|
||||
exit 1
|
||||
fi
|
||||
echo "Run completed OK ($errors errors). Timestamp $timestamp"
|
||||
|
||||
sleep $sleep_time
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Usage: mail_series subject "address,address,..."
|
||||
mail_series () {
|
||||
subject=$1; shift
|
||||
file=/tmp/series$$.tar
|
||||
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would mail results about $subject" to "$@"
|
||||
return 0
|
||||
fi
|
||||
echo "Mailing results about $subject" to "$@"
|
||||
|
||||
tar cf $file $save_dir/index.html
|
||||
for f in $all_timestamps ; do
|
||||
tar rf $file $save_dir/$f
|
||||
done
|
||||
gzip $file
|
||||
echo "$all_timestamps" | uuenview -b -30000 -s "$subject" -m "$@" $file.gz
|
||||
rm -f $file.gz
|
||||
}
|
||||
|
||||
# parse command line arguments
|
||||
while [[ -n "$1" ]]
|
||||
do
|
||||
case $1 in
|
||||
# -n mode, do not execute, just show
|
||||
-n) only_show_it=1; shift;;
|
||||
|
||||
# set test form
|
||||
-f) shift; test_form=$1; shift;;
|
||||
|
||||
# set test extra description
|
||||
-d) shift; desc_conf=$1; shift;;
|
||||
|
||||
# Rest are to be passed in exactly
|
||||
--) shift; break;;
|
||||
|
||||
#default, pick up as an extra arg
|
||||
*) extra_args="$extra_args $1"; shift;;
|
||||
esac
|
||||
done
|
||||
@@ -1,417 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
# Jim Salter <jsalter@netscape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# usage: setup.pl setup|cleanup|checktime|timesync -m machine_file
|
||||
# message files are expected to be in ./data/ and end with ".msg"
|
||||
|
||||
print "Netscape Mailstone.\nCopyright (c) 1997-2000 Netscape Communications Corp.\n";
|
||||
|
||||
$mode = shift; # mode must be first
|
||||
|
||||
# this parses the command line for -m machinefile
|
||||
# also sets many defaults
|
||||
do 'args.pl'|| die $@;
|
||||
parseArgs(); # parse command line
|
||||
|
||||
setConfigDefaults(); # setup RSH and RCP
|
||||
|
||||
$cpcmd = "cp"; # copy files... dir
|
||||
$rmcmd = "rm -f"; # remove files...
|
||||
|
||||
die "Must specify workload file" unless (@workload);
|
||||
|
||||
# Add or change client machines
|
||||
sub configClients {
|
||||
print "\n You can enter multiple machines like this: host1,host2\n";
|
||||
my @d = <bin/*/bin>;
|
||||
if (@d) {
|
||||
my @d2;
|
||||
foreach (@d2 = @d) { s/^bin\/// }
|
||||
foreach (@d = @d2) { s/\/bin$// }
|
||||
print " These OS versions are available:\n@d\n";
|
||||
}
|
||||
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $arch = "default OS";
|
||||
$arch = $section->{ARCH} if ($section->{ARCH});
|
||||
print "\nWhat is the name of the client(s) for $arch [$slist]: ";
|
||||
my $ans = <STDIN>; chomp $ans;
|
||||
if ($ans) {
|
||||
$ans =~ s/\s//g; # strip any whitespace
|
||||
fileReplaceText ($params{WORKLOAD}, "<CLIENT", $slist, $ans);
|
||||
}
|
||||
}
|
||||
while (1) {
|
||||
print "\nWhat additional client(s) [none]: ";
|
||||
my $ans = <STDIN>; chomp $ans;
|
||||
last unless ($ans); # done
|
||||
last if ($ans =~ /^none$/i);
|
||||
$ans =~ s/\s//g; # strip any whitespace
|
||||
my $block = "\n<CLIENT HOSTS=$ans>\n";
|
||||
|
||||
print "What OS type [default]: ";
|
||||
my $ans = <STDIN>; chomp $ans;
|
||||
$block .= " Arch\t$ans\n" if ($ans && !($ans =~ /^default$/i));
|
||||
|
||||
$block .= "</CLIENT>\n";
|
||||
fileInsertAfter ($params{WORKLOAD}, "^</CLIENT>", $block);
|
||||
}
|
||||
}
|
||||
|
||||
# Create a user ldif file
|
||||
sub configUserLdif {
|
||||
my $name = "conf/$defaultSection->{SERVER}.ldif";
|
||||
print "\nWhat file to you want to create [$name]? ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
$name = $ans if ($ans);
|
||||
|
||||
my $mode = "users";
|
||||
print "\nDo you want to create a broadcast account [y]? ";
|
||||
$ans = <STDIN>;
|
||||
$mode .= " broadcast" unless ($ans =~ /^n/i);
|
||||
|
||||
my $basedn = $defaultSection->{SERVER}; # pick a default
|
||||
$basedn =~ s/^.*?\.//; # strip off before first dot
|
||||
$basedn = "o=$basedn";
|
||||
|
||||
print "\nWhat is LDAP base DN [$basedn]? ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
$basedn = $ans if ($ans);
|
||||
|
||||
my $args = $params{MAKEUSERSARGS};
|
||||
|
||||
print "\n Common additional makeusers arguments:\n";
|
||||
print "\t-s storeName -x storeCount \tMultiple store partitions\n";
|
||||
print "\t[-3|-4] \tConfigure for NSMS 3.x or 4.x\n";
|
||||
print "Any extra arguments to makeusers [$args]? ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
$args = $ans if ($ans);
|
||||
|
||||
my $perlbin = "/usr/bin/perl";
|
||||
|
||||
$params{DEBUG} &&
|
||||
print "$perlbin -Ibin -- bin/makeusers.pl $mode -w $params{WORKLOAD} -b '$basedn' -o $name $args\n";
|
||||
|
||||
print "\nGenerating $name (this can take a while)\n";
|
||||
system "$perlbin -Ibin -- bin/makeusers.pl $mode -w $params{WORKLOAD} -b '$basedn' -o $name $args"
|
||||
|| warn "$@";
|
||||
print "LDIF generation complete. See $name\n";
|
||||
print "\tSee the manual or INSTALL to create users using the LDIF file.\n";
|
||||
}
|
||||
|
||||
# This uses a match pattern plus text to text replacements.
|
||||
# Could make all changes and then write out new workload
|
||||
# You would have to be carefull about sections with multi-line support.
|
||||
sub configWorkload {
|
||||
my $ans;
|
||||
|
||||
print "\nWhat is the name of the mail host [$defaultSection->{SERVER}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
if ($ans) {
|
||||
fileReplaceText ($params{WORKLOAD},
|
||||
"(SERVER|SMTPMAILFROM|ADDRESSFORMAT)",
|
||||
$defaultSection->{SERVER}, $ans);
|
||||
$defaultSection->{SERVER} = $ans; # needed for ldif generation
|
||||
}
|
||||
print "\nWhat is the user name pattern [$defaultSection->{LOGINFORMAT}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
if ($ans) {
|
||||
fileReplaceText ($params{WORKLOAD},
|
||||
"(LOGINFORMAT|ADDRESSFORMAT)",
|
||||
$defaultSection->{LOGINFORMAT}, $ans);
|
||||
$ans =~ s/%ld/0/; # create smtpMailFrom user
|
||||
my $olduser = $defaultSection->{SMTPMAILFROM};
|
||||
$olduser =~ s/@.*$//; # strip off after @
|
||||
fileReplaceText ($params{WORKLOAD},
|
||||
"SMTPMAILFROM",
|
||||
$olduser, $ans);
|
||||
}
|
||||
|
||||
print "\nWhat is the password pattern [$defaultSection->{PASSWDFORMAT}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
fileReplaceText ($params{WORKLOAD}, "PASSWDFORMAT",
|
||||
$defaultSection->{PASSWDFORMAT}, $ans);
|
||||
|
||||
$defaultSection->{NUMLOGINS} = 100 unless ($defaultSection->{NUMLOGINS});
|
||||
print "\nHow many users [$defaultSection->{NUMLOGINS}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
fileReplaceText ($params{WORKLOAD}, "(NUMADDRESSES|NUMLOGINS)",
|
||||
$defaultSection->{NUMLOGINS}, $ans);
|
||||
|
||||
$defaultSection->{FIRSTLOGIN} = 0 unless ($defaultSection->{FIRSTLOGIN});
|
||||
print "\nWhat is the first user number [$defaultSection->{FIRSTLOGIN}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
fileReplaceText ($params{WORKLOAD}, "(FIRSTADDRESS|FIRSTLOGIN)",
|
||||
$defaultSection->{FIRSTLOGIN}, $ans);
|
||||
|
||||
unless ($params{NT}) {
|
||||
configClients ();
|
||||
}
|
||||
|
||||
print "\nDo you want to view the edited $params{WORKLOAD} [y]? ";
|
||||
$ans = <STDIN>;
|
||||
unless ($ans =~ /^n/i) {
|
||||
print "Here is the edited $params{WORKLOAD}:\n\n";
|
||||
fileShow ($params{WORKLOAD});
|
||||
print "\n";
|
||||
}
|
||||
|
||||
print "\nDo you want to generate a user LDIF file [y]? ";
|
||||
$ans = <STDIN>;
|
||||
unless ($ans =~ /^n/i) {
|
||||
configUserLdif ();
|
||||
}
|
||||
}
|
||||
|
||||
# See if license file has been displayed
|
||||
if (($mode ne "cleanup") && (! -f ".license" )) {
|
||||
fileShow ("LICENSE");
|
||||
print "\nDo you agree to the terms of the license? (yes/no) ";
|
||||
my $ans = <STDIN>;
|
||||
print "\n";
|
||||
unless ($ans =~ /^yes$/i) {
|
||||
print "License not agreed to.\n";
|
||||
exit 0;
|
||||
}
|
||||
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
|
||||
open (LIC, ">.license");
|
||||
printf LIC "%04d$mon$mday$hour$min\n", $year+1900;
|
||||
close (LIC);
|
||||
}
|
||||
|
||||
if ($mode eq "config") { # re-run config
|
||||
configWorkload ();
|
||||
|
||||
print "\nMake any additional changes to $params{WORKLOAD} and then re-run 'setup'\n";
|
||||
exit 0;
|
||||
} elsif ($mode ne "cleanup") { # check if configured
|
||||
my $unconf = 0; # see if default values are in use
|
||||
foreach $section (@workload) {
|
||||
($section->{SERVER})
|
||||
&& ($section->{SERVER} =~ /example\.com$/)
|
||||
&& $unconf++;
|
||||
($section->{SMTPMAILFROM})
|
||||
&& ($section->{SMTPMAILFROM} =~ /example\.com$/)
|
||||
&& $unconf++;
|
||||
($section->{ADDRESSFORMAT})
|
||||
&& ($section->{ADDRESSFORMAT} =~ /example\.com$/)
|
||||
&& $unconf++;
|
||||
last if ($unconf > 0);
|
||||
}
|
||||
if ($unconf > 0) {
|
||||
print "Server has not been configured (example.com is an invalid address).\n";
|
||||
print "Do you want to setup a simple configuration now [y]?";
|
||||
my $ans = <STDIN>;
|
||||
if ($ans =~ /^n/i) {
|
||||
print "Re-run setup when you have edited the configuration.\n";
|
||||
exit 0;
|
||||
}
|
||||
configWorkload ();
|
||||
|
||||
print "\nMake any additional changes to $params{WORKLOAD} and then re-run 'setup'\n";
|
||||
exit 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ($mode eq "timesync") {
|
||||
if ($params{NT}) {
|
||||
print "Timesync has no effect on NT\n";
|
||||
exit 0;
|
||||
}
|
||||
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
|
||||
$mon += 1; # adjust from 0 based to std
|
||||
$systime = sprintf ("%02d%02d%02d%02d%04d.%02d",
|
||||
$mon, $mday, $hour, $min, 1900+$year, $sec);
|
||||
} elsif ($mode eq "checktime") {
|
||||
if ($params{NT}) { # if running on NT, then only single client
|
||||
print "Checktime not needed on NT\n";
|
||||
exit 0;
|
||||
}
|
||||
mkdir ("$resultbase", 0775);
|
||||
mkdir ("$tmpbase", 0775);
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
open MAKEIT, ">$tmpbase/$cli.tim";
|
||||
close MAKEIT;
|
||||
}
|
||||
}
|
||||
} elsif (($mode eq "setup") || ($mode eq "cleanup")) {
|
||||
@msgs = <data/*.msg>;
|
||||
foreach (@files = @msgs) { s/data\/// }
|
||||
print "Found these message files:\n@files\n\n";
|
||||
if ($params{NT}) { # handle NT localhost here
|
||||
exit 0 if ($mode =~ /cleanup$/);
|
||||
my $clipath = "bin/WINNT4.0/bin/mailclient.exe";
|
||||
print "Copying $clipath and message files to $cli\n";
|
||||
system "copy $clipath $params{TEMPDIR}";
|
||||
foreach $f (@files) {
|
||||
system "copy $f $params{TEMPDIR}";
|
||||
}
|
||||
exit 0; # without perl:fork, no more to do
|
||||
}
|
||||
}
|
||||
|
||||
# iterate over every client in the testbed, complete the cmd and rsh
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
my $rcp = ($section->{RCP}) ? $section->{RCP} : $params{RCP};
|
||||
my $tempdir;
|
||||
if ($section->{TEMPDIR}) {
|
||||
$tempdir = $section->{TEMPDIR};
|
||||
} elsif ($params{TEMPDIR}) {
|
||||
$tempdir = $params{TEMPDIR};
|
||||
}
|
||||
# most time critical first
|
||||
if ($mode eq "timesync") {
|
||||
next if ($cli =~ /^localhost$/i); # dont reset our own time
|
||||
# run all these in parallel to minimize skew
|
||||
next if ($section->{ARCH} eq "NT4.0");
|
||||
forkproc ($rsh, $cli, "date $systime");
|
||||
}
|
||||
|
||||
elsif ($mode eq "checktime") {
|
||||
# run all these in parallel to minimize skew
|
||||
forkproc ($rsh, $cli, ($section->{ARCH} eq "NT4.0")
|
||||
? "time" : "date",
|
||||
"/dev/null", "$tmpbase/$cli.tim");
|
||||
}
|
||||
|
||||
elsif ($mode eq "setup") {
|
||||
my ($clibin) = split /\s/, (($section->{COMMAND})
|
||||
? $section->{COMMAND}
|
||||
: $params{CLIENTCOMMAND});
|
||||
my $clipath = "bin/$clibin";
|
||||
if ($section->{ARCH}) {
|
||||
if (-x "bin/$section->{ARCH}/bin/$clibin") {
|
||||
$clipath="bin/$section->{ARCH}/bin/$clibin";
|
||||
} else {
|
||||
print "Requested OS $section->{ARCH} $cli not found. Using default.\n";
|
||||
}
|
||||
}
|
||||
my $rdir = ($tempdir) ? "$tempdir/" : ".";
|
||||
# chmod so that the remote files can be easily cleaned up
|
||||
my $rcmd = "chmod g+w @files $clibin; uname -a";
|
||||
$rcmd = "cd $tempdir; " . $rcmd if ($tempdir);
|
||||
$rdir =~ s!/!\\!g if ($section->{ARCH} eq "NT4.0");
|
||||
if ($cli =~ /^localhost$/i) {
|
||||
die "TEMPDIR must be set for 'localhost'\n"
|
||||
unless ($tempdir);
|
||||
die "Invalid local NT copy. Should never get here.\n"
|
||||
if ($section->{ARCH} eq "NT4.0"); # should never happen
|
||||
print "Copying $clipath and message files to $rdir\n";
|
||||
system ("$cpcmd @msgs $clipath $rdir");
|
||||
system ($rcmd);
|
||||
} else {
|
||||
print "$rcp $clipath @msgs $cli:$rdir\n" if ($params{DEBUG});
|
||||
print "Copying $clipath and message files to $cli:$rdir\n";
|
||||
system (split (/\s+/, $rcp), $clipath, @msgs, "$cli:$rdir");
|
||||
next if ($section->{ARCH} eq "NT4.0"); # chmod not valid
|
||||
print "rcmd='$rcmd'\n" if ($params{DEBUG});
|
||||
system (split (/\s+/, $rsh), $cli, $rcmd);
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
elsif ($mode eq "cleanup") {
|
||||
if ($params{DEBUG}) { # get debug files
|
||||
print "Cleaning up debug files on $cli\n";
|
||||
my $rcmd = ($section->{ARCH} eq "NT4.0") ? "DEL" : "$rmcmd";
|
||||
$rmcmd .= " mstone-debug.[0-9]*";
|
||||
$rcmd = "cd $tempdir; " . $rcmd if ($tempdir);
|
||||
$rcmd =~ s/;/&&/g if ($section->{ARCH} eq "NT4.0");
|
||||
if ($cli =~ /^localhost$/i) {
|
||||
die "TEMPDIR must be set for 'localhost'\n"
|
||||
unless ($tempdir);
|
||||
system ($rcmd);
|
||||
} else {
|
||||
system (split (/\s+/, $rsh), $cli, $rcmd);
|
||||
}
|
||||
} else {
|
||||
print "Cleaning $cli\n";
|
||||
my $rcmd = ($section->{ARCH} eq "NT4.0") ? "DEL" : "$rmcmd";
|
||||
$rcmd .= " $clibin @files";
|
||||
$rcmd = "cd $tempdir; " . $rcmd if ($tempdir);
|
||||
$rcmd =~ s/;/&&/g if ($section->{ARCH} eq "NT4.0");
|
||||
if ($cli =~ /^localhost$/i) {
|
||||
die "TEMPDIR must be set for 'localhost'\n"
|
||||
unless ($tempdir);
|
||||
system ($rcmd);
|
||||
} else {
|
||||
system (split (/\s+/, $rsh), $cli, $rcmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
die "Couldn't recognize mode $mode!\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# wait for children to finish
|
||||
if (($mode eq "timesync") || ($mode eq "checktime")) {
|
||||
$pid = wait();
|
||||
while ($pid != -1) {
|
||||
$pid = wait();
|
||||
}
|
||||
}
|
||||
|
||||
# Print the results of the time checks
|
||||
if ($mode eq "checktime") {
|
||||
print "Time from each client:\n";
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/o);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
open TIMEFILE, "$tmpbase/$cli.tim"
|
||||
|| warn "Counldn't open $tmpbase/$cli.tim\n";
|
||||
printf "%32s: ", $cli;
|
||||
while (<TIMEFILE>) { print; last;} # single line (2 on NT)
|
||||
close(TIMEFILE);
|
||||
unlink "$tmpbase/$cli.tim";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
# common setup info for tests
|
||||
# See sample.wld for detailed usage
|
||||
|
||||
# Information on how the test is distributed and reported
|
||||
# Test independent configuration
|
||||
<CONFIG>
|
||||
comments Netscape MSG4.15
|
||||
sysConfig conf/sample.html # File for additonal system config
|
||||
|
||||
# Debug with short runs and a few clients, then increase test time
|
||||
# These get overridden in the test specific files (or the command line)
|
||||
clientCount 5 # nominal clientCount (usually overriden)
|
||||
rampTime 10s
|
||||
time 30s
|
||||
|
||||
# each test should set a title in their CONFIG section
|
||||
# This is a reminder when using old test workloads
|
||||
title Need to set test title
|
||||
</CONFIG>
|
||||
|
||||
# Specify client machines
|
||||
<CLIENT HOSTS=localhost>
|
||||
</CLIENT>
|
||||
|
||||
# Information on the test itself
|
||||
|
||||
# Use the <Default> tag to set command defaults
|
||||
<DEFAULT>
|
||||
server mailhost.example.com
|
||||
smtpMailFrom mailtestuser0@mailhost.example.com
|
||||
loginFormat mailtestuser%ld
|
||||
addressFormat mailtestuser%ld@mailhost.example.com
|
||||
passwdFormat myPassword
|
||||
numLogins 100
|
||||
firstLogin 0
|
||||
numAddresses 100
|
||||
firstAddress 0
|
||||
</DEFAULT>
|
||||
@@ -1,10 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical HTTP GETs
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<HTTP>
|
||||
weight 100
|
||||
numLoops 1
|
||||
httpcommand GET /
|
||||
</HTTP>
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/bin/ksh
|
||||
# fire off the series of Mailstone IMAP tests
|
||||
|
||||
# To test series setup, do: go_imap -n
|
||||
|
||||
|
||||
# Look for testname$test_form, first. Override with: go_series -f <string>.
|
||||
export test_form="_mail02"
|
||||
|
||||
export test_host="mail02"
|
||||
|
||||
# string appended to every description. Override with: go_series -d <string>.
|
||||
export desc_conf="12 CPUs"
|
||||
|
||||
# Extra arguments common to all tests. Any other args go here.
|
||||
# Note that arguments with embedded spaces wont work here.
|
||||
# Instead use: go_series -- <args...>
|
||||
export extra_args=""
|
||||
|
||||
# error limit to abort sequence
|
||||
export error_limit=500
|
||||
|
||||
# time to allow the server to calm down after each run (seconds)
|
||||
export sleep_time=120
|
||||
|
||||
# who to mail results to
|
||||
#export mail_list="me@example.com,you@example.com"
|
||||
export mail_list=""
|
||||
|
||||
# Get all the helper functions
|
||||
. test_utils.ksh
|
||||
|
||||
### This is where the series of tests is defined
|
||||
|
||||
# clean and re-start server
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" "$@"
|
||||
return 0
|
||||
else
|
||||
# BUG: rsh never returns.
|
||||
# individual commands in clean work fine, but fail as a whole
|
||||
rsh -n $test_host /bin/ksh /iplanet/bin/clean$test_form &
|
||||
sleep 300 && kill -9 $!
|
||||
wait
|
||||
fi
|
||||
|
||||
# check our setup
|
||||
run timesync
|
||||
|
||||
###echo "DEBUG exit" && exit 0
|
||||
|
||||
run_test popdel 'Create mailboxes (random order)' -t 60m maxblocks=100000 "$@"
|
||||
run_test allpop 'Create mailboxes (exhaustive)' "$@"
|
||||
|
||||
run_test imaplogin 'IMAP login rate' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
run_test imapread10k 'IMAP Message downloads 5k from 10k users' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
run_test imapread 'IMAP Message downloads 5k' "$@"
|
||||
|
||||
run_test imapsmtp-throttle 'Combined IMAP-SMTP load (1 of 3)' "$@"
|
||||
run_test imapsmtp-throttle 'Combined IMAP-SMTP load (2 of 3)' "$@"
|
||||
run_test imapsmtp-throttle 'Combined IMAP-SMTP load (3 of 3)' "$@"
|
||||
|
||||
# Some messages will be left from previous test
|
||||
run_test imapmaxusers 'IMAP 30K simultaneous users' "$@"
|
||||
|
||||
# e-mail the whole batch
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom IMAP: `date`" "$mail_list"
|
||||
@@ -1,19 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical IMAP checks/reads
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title IMAP reads
|
||||
clientCount 100 # since IMAP has long sleeps, use lots of clients
|
||||
</CONFIG>
|
||||
|
||||
<IMAP4>
|
||||
weight 100
|
||||
#leaveMailOnServer 1
|
||||
|
||||
idleTime 2s # time between login and first download check
|
||||
loopDelay 5m # time between download checks
|
||||
numLoops 10 # how many check to do before closing the connection
|
||||
blockTime 2s # time between logout and next login (or other block)
|
||||
</IMAP4>
|
||||
@@ -1,84 +0,0 @@
|
||||
#!/bin/ksh
|
||||
# fire off the series of Mailstone tests
|
||||
|
||||
# To test series, do: go_series -n
|
||||
|
||||
|
||||
# Look for testname$test_form, first. Override with: go_series -f <string>.
|
||||
export test_form="_mail02"
|
||||
|
||||
export test_host="mail02"
|
||||
|
||||
# string appended to every description. Override with: go_series -d <string>.
|
||||
export desc_conf="12 CPUs"
|
||||
|
||||
# Extra arguments common to all tests. Any other args go here.
|
||||
# Note that arguments with embedded spaces wont work here.
|
||||
# Instead use: go_series -- <args...>
|
||||
export extra_args=""
|
||||
|
||||
# error limit to abort sequence
|
||||
export error_limit=500
|
||||
|
||||
# time to allow the server to calm down after each run (seconds)
|
||||
export sleep_time=120
|
||||
|
||||
# who to mail results to
|
||||
#export mail_list="me@example.com,you@example.com"
|
||||
export mail_list=""
|
||||
|
||||
# Get all the helper functions
|
||||
. test_utils.ksh
|
||||
|
||||
### This is where the series of tests is defined
|
||||
|
||||
# clean and re-start server
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" "$@"
|
||||
return 0
|
||||
else
|
||||
# BUG: this never returns. rsh never returns
|
||||
# individual commands in clean work fine, but fail as a whole
|
||||
rsh -n $test_host /bin/ksh /iplanet/bin/clean$test_form &
|
||||
sleep 300 && kill -9 $!
|
||||
wait
|
||||
fi
|
||||
|
||||
# check our setup
|
||||
run timesync
|
||||
|
||||
###echo "DEBUG exit" && exit 0
|
||||
|
||||
run_test popdel 'Create mailboxes (random order)' -t 60m maxblocks=100000 "$@"
|
||||
run_test allpop 'Create mailboxes (exhaustive)' "$@"
|
||||
|
||||
run_test popdel 'Empty checks: never used (1 of 3)' "$@"
|
||||
run_test popdel 'Empty checks: never used (2 of 3)' "$@"
|
||||
run_test popdel 'Empty checks: never used (3 of 3)' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
|
||||
run_test popsave10k 'Message downloads 5k from 10k users (1 of 3)' "$@"
|
||||
run_test popsave10k 'Message downloads 5k from 10k users (2 of 3)' "$@"
|
||||
run_test popsave10k 'Message downloads 5k from 10k users (3 of 3)' "$@"
|
||||
|
||||
run_test popsave 'Message downloads 5k (1 of 3)' "$@"
|
||||
run_test popsave 'Message downloads 5k (2 of 3)' "$@"
|
||||
run_test popsave 'Message downloads 5k (3 of 3)' "$@"
|
||||
|
||||
run_test popsmtp-throttle 'Combined load (1 of 3)' "$@"
|
||||
run_test popsmtp-throttle 'Combined load (2 of 3)' "$@"
|
||||
run_test popsmtp-throttle 'Combined load (3 of 3)' "$@"
|
||||
|
||||
run_test smtp100k 'SMTP delivery rate' "$@"
|
||||
|
||||
run_test popclean 'Message downloads/delete 5k ' "$@"
|
||||
|
||||
run_test popdel 'Empty checks (1 of 3)' "$@"
|
||||
run_test popdel 'Empty checks (2 of 3)' "$@"
|
||||
run_test popdel 'Empty checks (3 of 3)' "$@"
|
||||
|
||||
# e-mail the whole batch
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom POP: `date`" "$mail_list"
|
||||
@@ -1,15 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical POP checks/reads
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title POP reads
|
||||
clientCount 50
|
||||
</CONFIG>
|
||||
|
||||
<POP3>
|
||||
weight 100
|
||||
numLoops 9999 # will close when messages run out
|
||||
#leaveMailOnServer 1
|
||||
</POP3>
|
||||
@@ -1,44 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Deliver mail using SMTP
|
||||
# This can measure delivery rates for a specified message type.
|
||||
# This also fills the store for POP or IMAP tests
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title POP, IMAP, SMTP combined load
|
||||
clientCount 100
|
||||
</CONFIG>
|
||||
|
||||
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical SMTP delivery with 1K message size and restricted accounts
|
||||
|
||||
<SMTP HOSTS=client1>
|
||||
file en-1k.msg
|
||||
weight 100
|
||||
#numAddresses 200
|
||||
</SMTP>
|
||||
|
||||
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical POP checks/reads
|
||||
|
||||
|
||||
<POP3 HOSTS=client2>
|
||||
weight 100
|
||||
#leaveMailOnServer 1
|
||||
</POP3>
|
||||
|
||||
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical IMAP checks/reads
|
||||
|
||||
# IMAP maintains a connection (unlike POP or SMTP)
|
||||
# for combined load tests, run it on separate client machines
|
||||
<IMAP4 HOSTS=client3>
|
||||
weight 100
|
||||
idleTime 5
|
||||
checkMailInterval 10
|
||||
numLoops 1000
|
||||
</IMAP4>
|
||||
@@ -1,21 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Deliver mail using SMTP
|
||||
# This can measure delivery rates for a specified message type.
|
||||
# This also fills the store for POP or IMAP tests
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title POP reads with SMTP message deliveries
|
||||
clientCount 50
|
||||
</CONFIG>
|
||||
|
||||
<include conf/smtp1k.wld>
|
||||
<include conf/smtp5k.wld>
|
||||
<include conf/smtp17k.wld>
|
||||
|
||||
<POP3>
|
||||
weight 100
|
||||
#leaveMailOnServer 1
|
||||
</POP3>
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
<!-- this file provides system comments and is merged into reports -->
|
||||
<PRE>
|
||||
<B> Mailhost.example.com </B>
|
||||
EXAMPLE SYSTEM CONFIGURATION
|
||||
Netscape Messaging Server 4.15 (7/21/99)
|
||||
E6000
|
||||
26x250MHz UltraSPARC-II
|
||||
6.5GB RAM
|
||||
A3500 w/ 60x9GB 7200 RPM
|
||||
store: 5 x (10x9 RAID-0)
|
||||
queue: 1 x (10x9 RAID-0)
|
||||
</PRE>
|
||||
@@ -1,281 +0,0 @@
|
||||
# MailStone workload configuration file
|
||||
#
|
||||
# Include other workload files like this:
|
||||
# <include conf/morework.wld>
|
||||
#
|
||||
# If you want a workload included ONLY ONCE in the test, use this
|
||||
# <includeOnce conf/morework.wld>
|
||||
#
|
||||
# See Also:
|
||||
# smtp.wld - typical SMTP delivery test
|
||||
# pop.wld - typical POP3 check/download test
|
||||
# imap.wld - typical IMAP4 check/download test
|
||||
|
||||
|
||||
######################################################################
|
||||
# These sections discribe how the test is run:
|
||||
# CONFIG, CLIENT, MONITOR, PRETEST, POSTTEST
|
||||
|
||||
# The <CONFIG> section defines test setup and report parameters
|
||||
# Multiple <CONFIG> sections will be merged into a one.
|
||||
# The equivalent command line switch is shown in parenthesis.
|
||||
<CONFIG>
|
||||
title POP reads # title for report and index (-b)
|
||||
comments Netscape MSG4.1 # additional info at top of report (-n)
|
||||
|
||||
time 3m # test time (-t)
|
||||
rampTime 20s # portion of test to start things (-r)
|
||||
clientCount 12 # number of client connections (-l)
|
||||
|
||||
maxErrors 10000 # set an error abort limit
|
||||
maxBlocks 50000 # stop after this many blocks
|
||||
|
||||
#sysConfig conf/mailhost.txt # Pull in config file (-s)
|
||||
sysConfig \ # Inline config text
|
||||
<PRE>\
|
||||
<B> mailhost.example.com </B>\
|
||||
Netscape Messaging Server 4.11\
|
||||
Linux 2.2.5\
|
||||
4x400Mhz Xeon (1Mb)\
|
||||
2Gb RAM\
|
||||
</PRE>
|
||||
|
||||
useGroups 1 # use group names instead of host names
|
||||
|
||||
telemetry 1 # log telemetry (for debugging)
|
||||
|
||||
# These usually dont need to be set. These are the defaults
|
||||
GnuPlot gnuplot/gnuplot
|
||||
RSH ssh
|
||||
# RSH /usr/bin/remsh # HP-UX uses this path
|
||||
RCP scp
|
||||
# RCP /usr/bin/rcp
|
||||
tempDir /var/tmp # client machine directory
|
||||
chartWidth 640
|
||||
chartHeight 480
|
||||
clientCommand mailclient # CLIENT command to run
|
||||
monitorCommand vmstat %f # MONITOR command to run
|
||||
makeUsersArgs -4 # args to makeusers
|
||||
imageType png # gnuplot image type: png, gif, ...
|
||||
</CONFIG>
|
||||
|
||||
# Each <Client> section defines one or more client machines
|
||||
# Every machine in the section will run the same number of connections
|
||||
# Note that there cannot be whitespace between the client hostnames
|
||||
<CLIENT HOSTS=client1,client2>
|
||||
arch Linux2.2_x86
|
||||
maxClients 200
|
||||
maxThreads 50
|
||||
|
||||
# the group is only used if "useGroups" is set
|
||||
group A
|
||||
|
||||
command mailclient -m 100 # override the command to run
|
||||
</CLIENT>
|
||||
|
||||
# Set a specific number of processes and threads
|
||||
<CLIENT HOSTS=client3,client4>
|
||||
arch SunOS5.6
|
||||
processes 2
|
||||
threads 10
|
||||
|
||||
# the group is only used if "useGroups" is set
|
||||
group B
|
||||
</CLIENT>
|
||||
|
||||
# Here is how to configure a WinNT client from a Unix mail master
|
||||
# The NT rshd must interoperate with Unix rsh; allow redirection of
|
||||
# stdin, stdout, and stderr; and must support binary file copies.
|
||||
# Denicomp's wrshdnt has been used sucessfully. www.denicomp.com
|
||||
<CLIENT HOSTS=winnt01>
|
||||
Arch WINNT4.0
|
||||
command mailclient.exe
|
||||
tempDir c:\temp
|
||||
</CLIENT>
|
||||
|
||||
# The PreTest sections will run before the test starts
|
||||
<PRETEST HOSTS=mailhost.example.com>
|
||||
# RSH rsh -l mailuser
|
||||
command cd /usr/netscape/msg-mailhost; ./getconf
|
||||
</PRETEST>
|
||||
|
||||
# Each <Monitor> section defines remote monitoring commands
|
||||
# for one or more machines.
|
||||
# Commands containing '%c' run to completion.
|
||||
# Otherwise the command will be shutdown down
|
||||
<MONITOR HOSTS=mailhost.example.com>
|
||||
command vmstat,%f,%c
|
||||
</MONITOR>
|
||||
|
||||
# The PostTest sections will run after the test completes
|
||||
<POSTTEST HOSTS=mailhost.example.com>
|
||||
command df
|
||||
</POSTTEST>
|
||||
|
||||
|
||||
######################################################################
|
||||
# available protcols: SMTP, POP3, IMAP4
|
||||
# (command names are not case sensitive)
|
||||
#
|
||||
# Time formats use suffixes of 's', 'm', 'h', 'd'
|
||||
# for seconds, minutes, hours, days
|
||||
# In account formats, "%ld" is replaced by user number
|
||||
|
||||
# These parameters apply to the protocol sections
|
||||
# Command parameter applicable command Example
|
||||
#-------------------------------------------------------------------
|
||||
# server <ALL> mail.example.com
|
||||
# portNum <ALL> 25
|
||||
# (if no value is given, the default port for that service is used)
|
||||
#
|
||||
# weight <ALL> 20
|
||||
#
|
||||
# loginFormat <ALL> test%ld
|
||||
# %ld=address %ld=domain
|
||||
# firstLogin <ALL> 0
|
||||
# numLogins <ALL> 2000
|
||||
# sequentialLogins <ALL> 1
|
||||
# passwdFormat <ALL> netscape
|
||||
#
|
||||
# addressFormat <ALL> test%ld@mail.example%ld.com
|
||||
# %ld=address %ld=domain
|
||||
# firstAddress <ALL> 0
|
||||
# numAddresses <ALL> 2000
|
||||
# sequentialAddresses <ALL> 1
|
||||
#
|
||||
# numDomains <ALL> 3
|
||||
# firstDomain <ALL> 0
|
||||
# sequentialDomains <ALL> 1
|
||||
#
|
||||
# idleTime <ALL> 5m
|
||||
# numLoops <ALL> 200
|
||||
# loopDelay <ALL> 1m
|
||||
# blockTime <ALL> 5m
|
||||
#
|
||||
# numRecips SMTP 3
|
||||
# smtpMailFrom SMTP mailstone@mail.example.com
|
||||
# file SMTP en-3k.msg
|
||||
# useEHLO SMTP 1 (default is HELO)
|
||||
# useAUTHLOGIN SMTP 1 (no AUTHLOGIN by default)
|
||||
#
|
||||
# leaveMailOnServer POP3,IMAP4 1
|
||||
# leaveMailUnSeen IMAP4 1
|
||||
|
||||
# The <Default> section sets command block defaults
|
||||
# Multiple <Default> sections will be merged into one
|
||||
<DEFAULT>
|
||||
server mailhost.example.com
|
||||
smtpMailFrom mailhost0@mailhost.example.com
|
||||
addressFormat mailhost%ld@mailhost.example.com
|
||||
loginFormat mailhost%ld
|
||||
passwdFormat netscape
|
||||
numLogins 1000
|
||||
numAddresses 1000
|
||||
</DEFAULT>
|
||||
|
||||
# Note: empty host list means all hosts
|
||||
<SMTP>
|
||||
file en-1k.msg
|
||||
weight 10
|
||||
numAddresses 200
|
||||
</SMTP>
|
||||
|
||||
<include conf/smtp17.wld>
|
||||
|
||||
# Note: the host name must be the same as specified in the CLIENT section
|
||||
<POP3 HOSTS=client1,client2>
|
||||
weight 10
|
||||
#leaveMailOnServer 1
|
||||
</POP3>
|
||||
|
||||
<IMAP4 HOSTS=client3>
|
||||
idleTime 300
|
||||
#weight 15
|
||||
</IMAP4>
|
||||
|
||||
|
||||
######################################################################
|
||||
# These sections are used to generate the right graphs for the test
|
||||
# This is the built in defaults
|
||||
<GRAPH name=connects>
|
||||
title Number of connections attempted
|
||||
label Connections/sec
|
||||
variables conn
|
||||
field Try
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=connections>
|
||||
title Total connections
|
||||
label Connections
|
||||
variables connections
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=connErrors>
|
||||
title Number of connection errors
|
||||
label Errors/sec
|
||||
variables conn, banner, login, logout
|
||||
field Error
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=msgErrors>
|
||||
title Number of command/message errors
|
||||
label Errors/sec
|
||||
variables cmd, submit, retrieve
|
||||
field Error
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=retrieves>
|
||||
Title Number of messages read
|
||||
label Messages/sec
|
||||
variables retrieve
|
||||
field Try
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=submits>
|
||||
title Number of messages written
|
||||
label Messages/sec
|
||||
variables submit
|
||||
field Try
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=commands>
|
||||
title Number of commands sent
|
||||
label Commands/sec
|
||||
variables cmd
|
||||
field Try
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=readBytes>
|
||||
title Bytes read
|
||||
label Bytes/sec
|
||||
variables login, banner, cmd, retrieve, submit, logout
|
||||
field BytesR
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=writeBytes>
|
||||
title Bytes written
|
||||
label Bytes/sec
|
||||
variables login, banner, cmd, retrieve, submit, logout
|
||||
field BytesW
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=msgTime>
|
||||
title Message transfer time
|
||||
label Seconds per message
|
||||
variables cmd, submit, retrieve
|
||||
field Time
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=setupTime>
|
||||
Title Connection setup time
|
||||
label Seconds per connection
|
||||
variables conn, banner, login
|
||||
field Time
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=blocks>
|
||||
title Number of mailstone blocks executed
|
||||
label Blocks/sec
|
||||
variables blocks
|
||||
# this is a scalar. No "field" needed/allowed
|
||||
</GRAPH>
|
||||
@@ -1,16 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Deliver mail using SMTP
|
||||
# This can measure delivery rates for a specified message type.
|
||||
# This also fills the store for POP or IMAP tests
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title SMTP message deliveries
|
||||
clientCount 20
|
||||
</CONFIG>
|
||||
|
||||
# if we include more than one, we get a distribution of all sizes
|
||||
<include conf/smtp1k.wld>
|
||||
<include conf/smtp5k.wld>
|
||||
<include conf/smtp17k.wld>
|
||||
@@ -1,16 +0,0 @@
|
||||
#MailSTone workload configuration
|
||||
|
||||
# Send 17k, 3 recipient messages from all clients
|
||||
<SMTP>
|
||||
weight 100
|
||||
file en-17k.msg
|
||||
|
||||
# uncomment this line to just deliver to a subset of addresses
|
||||
#numAddresses 200
|
||||
|
||||
# deliver each message to more than 1 address
|
||||
numRecips 1
|
||||
|
||||
numLoops 1 # number of messages to send per login
|
||||
|
||||
</SMTP>
|
||||
@@ -1,16 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical SMTP delivery with 1K message size and restricted accounts
|
||||
|
||||
<SMTP>
|
||||
weight 100
|
||||
file en-1k.msg
|
||||
|
||||
# uncomment this line to just deliver to a subset of addresses
|
||||
#numAddresses 200
|
||||
|
||||
# deliver each message to more than 1 address
|
||||
numRecips 1
|
||||
|
||||
numLoops 1 # number of messages to send per login
|
||||
|
||||
</SMTP>
|
||||
@@ -1,16 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical SMTP delivery with 5K message size and restricted accounts
|
||||
|
||||
<SMTP>
|
||||
weight 100
|
||||
file en-5k.msg
|
||||
|
||||
# uncomment this line to just deliver to a subset of addresses
|
||||
#numAddresses 200
|
||||
|
||||
# deliver each message to more than 1 address
|
||||
numRecips 1
|
||||
|
||||
numLoops 1 # number of messages to send per login
|
||||
|
||||
</SMTP>
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/bin/ksh
|
||||
# fire off the series of Mailstone WEBMAIL tests
|
||||
|
||||
# To test series setup, do: go_webmail -n
|
||||
|
||||
|
||||
# Look for testname$test_form, first. Override with: go_series -f <string>.
|
||||
export test_form="_mail02"
|
||||
|
||||
export test_host="mail02"
|
||||
|
||||
# string appended to every description. Override with: go_series -d <string>.
|
||||
export desc_conf="12 CPUs"
|
||||
|
||||
# Extra arguments common to all tests. Any other args go here.
|
||||
# Note that arguments with embedded spaces wont work here.
|
||||
# Instead use: go_series -- <args...>
|
||||
export extra_args=""
|
||||
|
||||
# error limit to abort sequence
|
||||
export error_limit=500
|
||||
|
||||
# time to allow the server to calm down after each run (seconds)
|
||||
export sleep_time=120
|
||||
|
||||
# who to mail results to
|
||||
#export mail_list="me@example.com,you@example.com"
|
||||
export mail_list=""
|
||||
|
||||
# Get all the helper functions
|
||||
. test_utils.ksh
|
||||
|
||||
### This is where the series of tests is defined
|
||||
|
||||
# clean and re-start server
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" "$@"
|
||||
return 0
|
||||
else
|
||||
# BUG: rsh never returns.
|
||||
# individual commands in clean work fine, but fail as a whole
|
||||
rsh -n $test_host /bin/ksh /iplanet/bin/clean$test_form &
|
||||
sleep 300 && kill -9 $!
|
||||
wait
|
||||
fi
|
||||
|
||||
# check our setup
|
||||
run timesync
|
||||
|
||||
###echo "DEBUG exit" && exit 0
|
||||
|
||||
run_test popdel 'Create mailboxes (random order)' -t 60m maxblocks=100000 "$@"
|
||||
run_test allpop 'Create mailboxes (exhaustive)' "$@"
|
||||
|
||||
run_test webmaillogin 'WebMail login rate' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
run_test webmailread10k 'WebMail Message downloads 5k from 10k users' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
run_test webmailread 'WebMail Message downloads 5k' "$@"
|
||||
|
||||
run_test webmailsmtp-throttle 'Combined WebMail-SMTP load (1 of 3)' "$@"
|
||||
run_test webmailsmtp-throttle 'Combined WebMail-SMTP load (2 of 3)' "$@"
|
||||
run_test webmailsmtp-throttle 'Combined WebMail-SMTP load (3 of 3)' "$@"
|
||||
|
||||
# Some messages will be left from previous test
|
||||
run_test webmailmaxusers 'WebMail 30K simultaneous users' "$@"
|
||||
|
||||
# e-mail the whole batch
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom WebMail: `date`" "$mail_list"
|
||||
@@ -1,209 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical WMAP checks/reads
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title WMAP reads
|
||||
clientCount 1 # since WMAP has long sleeps, use lots of clients
|
||||
</CONFIG>
|
||||
|
||||
<DEFAULT>
|
||||
# leaveMailOnServer 1
|
||||
file en-1k.msg
|
||||
#numAddresses 200
|
||||
numRecips 1
|
||||
|
||||
idleTime 2s # time between login and first download check
|
||||
loopDelay 5m # time between download checks
|
||||
numLoops 10 # how many check to do before closing the connection
|
||||
blockTime 2s # time between logout and next login (or other block)
|
||||
</DEFAULT>
|
||||
|
||||
# This version pulls in everything (no caching)
|
||||
<WMAP>
|
||||
weight 20
|
||||
|
||||
# %s=referhost %s=host %d=content-length
|
||||
wmapClientHeader "\
|
||||
Referer: http://%s/\r\n\
|
||||
Connection: Keep-Alive\r\n\
|
||||
User-Agent: Mozilla/4.7 [en] (WinNT; U)\r\n\
|
||||
Host: %s\r\n\
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\n\
|
||||
Accept-Encoding: gzip\r\n\
|
||||
Accept-Language: en\r\n\
|
||||
Accept-Charset: iso-8859-1,*,utf-8\r\n"
|
||||
|
||||
wmapBannerCmds "GET / HTTP/1.0"
|
||||
wmapBannerCmds "GET /imx/N24b.gif HTTP/1.0"
|
||||
|
||||
wmapLoginCmd "POST /login.msc HTTP/1.0"
|
||||
# %s=user %s=password
|
||||
wmapLoginData "user=%s&password=%s"
|
||||
|
||||
# %s=sid
|
||||
# (this one is done automatically from the redirect URL)
|
||||
# wmapInboxCmds "GET /en/mail.html?sid=%s&\
|
||||
#lang=en&host=http://toad.mcom.com/&cert=false HTTP/1.0"
|
||||
wmapInboxCmds "GET /util.js HTTP/1.0"
|
||||
wmapInboxCmds "GET /en/i18n.js HTTP/1.0"
|
||||
wmapInboxCmds "GET /main.js HTTP/1.0"
|
||||
wmapInboxCmds "GET /frame.html HTTP/1.0"
|
||||
wmapInboxCmds "GET /cfg.msc?sid=%s&security=false HTTP/1.0"
|
||||
wmapInboxCmds "GET /mbox_fs.html HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/N16.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/spacer.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/pull.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/compose.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/search.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/divider.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/trash.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/read.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/sort_dn.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/high-0.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/read-1.gif HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapCheckCmds "GET /mbox.msc?sid=%s&security=false&mbox=INBOX&\
|
||||
start=-9999&count=9999&date=true&srch= HTTP/1.0"
|
||||
|
||||
# %s=sid, %d=message uid
|
||||
wmapMsgReadCmds "GET /msg.msc?sid=%s&security=false&mbox=INBOX&\
|
||||
uid=13&process=js,link,target,html,binhex&maxtext=30720 HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /msg_fs.html HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /reply.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /reply_all.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /forward.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /prev-0.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /all-0.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /next-1.gif HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgDeleteCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgComposeCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgReplyCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgReplyallCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgForwardCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapMsgWriteCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapLogoutCmds "GET /cmd.msc?sid=%s&security=false&mbox=&cmd=logout HTTP/1.0"
|
||||
|
||||
</WMAP>
|
||||
|
||||
# This version assumes all static URLs are cached
|
||||
<WMAP>
|
||||
weight 80
|
||||
|
||||
# %s=referhost %s=host %d=content-length
|
||||
wmapClientHeader "\
|
||||
Referer: http://%s/\r\n\
|
||||
Connection: Keep-Alive\r\n\
|
||||
User-Agent: Mozilla/4.7 [en] (WinNT; U)\r\n\
|
||||
Host: %s\r\n\
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\n\
|
||||
Accept-Encoding: gzip\r\n\
|
||||
Accept-Language: en\r\n\
|
||||
Accept-Charset: iso-8859-1,*,utf-8\r\n"
|
||||
|
||||
wmapBannerCmds "GET / HTTP/1.0"
|
||||
|
||||
wmapLoginCmd "POST /login.msc HTTP/1.0"
|
||||
# %s=user %s=password
|
||||
wmapLoginData "user=%s&password=%s"
|
||||
|
||||
# %s=sid
|
||||
# (this one is done automatically from the redirect URL)
|
||||
# wmapInboxCmds "GET /en/mail.html?sid=%s&\
|
||||
#lang=en&host=http://toad.mcom.com/&cert=false HTTP/1.0"
|
||||
wmapInboxCmds "GET /cfg.msc?sid=%s&security=false HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapCheckCmds "GET /mbox.msc?sid=%s&security=false&mbox=INBOX&\
|
||||
start=-9999&count=9999&date=true&srch= HTTP/1.0"
|
||||
|
||||
# %s=sid, %d=message uid
|
||||
wmapMsgReadCmds "GET /msg.msc?sid=%s&security=false&mbox=INBOX&\
|
||||
uid=13&process=js,link,target,html,binhex&maxtext=30720 HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapMsgWriteCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapLogoutCmds "GET /cmd.msc?sid=%s&security=false&mbox=&cmd=logout HTTP/1.0"
|
||||
|
||||
</WMAP>
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Typical Communicator 4.7 to Messenger Express 4.1 dataflow
|
||||
# High level requests (as seen using Network Monitor) and client [port] numbers
|
||||
#
|
||||
### Login
|
||||
#
|
||||
# GET /
|
||||
# (gets login screen)
|
||||
# GET /imx/N24b.gif
|
||||
# (gets a gif as part of the screen)
|
||||
# POST /login.msc
|
||||
# Content-type: application/x-www-form-urlencoded
|
||||
# user=x&password=x
|
||||
# (performs the login, gets a Location: redirect with session ID)
|
||||
# Location: http://mailhost/en/mail.html?sid=ebp32po0bt9u95rh&lang=en&host=http://mailhost/&cert=false
|
||||
#
|
||||
### INBOX Listing
|
||||
#
|
||||
# (first fetch the redirect url)
|
||||
# GET /en/mail.html?sid=ebp32po0bt9u95rh&lang=en&host=http://mailhost/&cert=false
|
||||
# (gets the inbox screen)
|
||||
# GET /util.js
|
||||
# GET /en/i18n.js
|
||||
# GET /main.js
|
||||
# GET /frame.html
|
||||
# GET /frame.html
|
||||
# GET /frame.html
|
||||
# GET /cfg.msc?sid=ebp32po0bt9u95rh&security=false
|
||||
# GET /frame.html
|
||||
# GET /frame.html
|
||||
#
|
||||
# GET /mbox.msc?sid=ebp32po0bt9u95rh&security=false&mbox=INBOX&start=-9999&count=9999&date=true&srch=
|
||||
# GET /mbox_fs.html
|
||||
# GET /imx/N16.gif
|
||||
# GET /imx/spacer.gif
|
||||
# GET /imx/pull.gif
|
||||
# GET /imx/compose.gif
|
||||
# GET /imx/divider.gif
|
||||
# GET /imx/trash.gif
|
||||
# GET /imx/search.gif
|
||||
# GET /imx/read.gif
|
||||
# GET /imx/sort_dn.gif
|
||||
# GET /imx/high-0.gif
|
||||
# GET /imx/read-1.gif
|
||||
#
|
||||
### Reading a message
|
||||
#
|
||||
# GET /msg.msc?sid=ebp32po0bt9u95rh&security=false&mbox=INBOX&uid=13&process=js,link,target,html,binhex&maxtext=30720
|
||||
# GET /msg_fs.html
|
||||
# GET /imx/reply.gif
|
||||
# GET /imx/reply_all.gif
|
||||
# GET /imx/forward.gif
|
||||
# GET /imx/prev-0.gif
|
||||
# GET /imx/all-0.gif
|
||||
# GET /imx/next-1.gif
|
||||
#
|
||||
### Logout
|
||||
#
|
||||
# GET /cmd.msc?sid=ebp32po0bt9u95rh&security=false&mbox=&cmd=logout
|
||||
#
|
||||
########################################################################
|
||||
@@ -1,159 +0,0 @@
|
||||
# Figure out the OS sepecific setup stuff
|
||||
|
||||
# Define a flag for include-at-most-once
|
||||
INCLUDED_CONFIG_MK = 1
|
||||
|
||||
# These normally get overridden on the command line from ../Makefile
|
||||
# This is the default build type
|
||||
BUILD_VARIANT = release
|
||||
ifeq ($(BUILD_VARIANT), debug)
|
||||
BUILD_TYPE = DEBUG
|
||||
OBJDIR_TAG = _DBG
|
||||
else
|
||||
BUILD_TYPE = RELEASE
|
||||
OBJDIR_TAG = _OPT
|
||||
endif
|
||||
|
||||
OS_ARCH := $(shell uname -s)
|
||||
|
||||
ifeq ("$(OBJDIR)", "")
|
||||
ifeq ($(OS_ARCH), WINNT)
|
||||
NSARCH := WIN32
|
||||
else
|
||||
NSARCH := $(shell $(topsrcdir)/nsarch)
|
||||
endif
|
||||
OBJDIR = $(topsrcdir)/build/$(NSARCH)$(OBJDIR_TAG).OBJ
|
||||
PKGDIR = $(topsrcdir)/build/package/$(NSARCH)$(OBJDIR_TAG).OBJ/mstone
|
||||
endif
|
||||
|
||||
|
||||
########################################################################
|
||||
|
||||
# setup OS specific compilers and options
|
||||
|
||||
CC = cc
|
||||
AR = ar
|
||||
INCLUDES = -I$(OBJDIR)
|
||||
REL_OS_CFLAGS = -O
|
||||
REL_OS_LFLAGS =
|
||||
DBG_OS_CFLAGS = -g -D_DEBUG
|
||||
DBG_OS_LFLAGS =
|
||||
LIBS = -lm
|
||||
OBJ_SUFFIX = o
|
||||
LIB_SUFFIX = a
|
||||
EXE_SUFFIX =
|
||||
ECHO = /bin/echo
|
||||
|
||||
ifeq ($(OS_ARCH), WINNT)
|
||||
CC = cl
|
||||
OSDEFS = -DWIN32 -D_WIN32
|
||||
LIBS = wsock32.lib libcmt.lib msvcrt.lib
|
||||
REL_OS_CFLAGS =
|
||||
REL_OS_LINKFLAGS = /link
|
||||
DBG_OS_CFLAGS = -Od -Zi
|
||||
DBG_OS_LINKFLAGS = /link /debug:full
|
||||
OBJ_SUFFIX = obj
|
||||
LIB_SUFFIX = .lib
|
||||
DLL_SUFFIX = .dll
|
||||
EXE_SUFFIX = .exe
|
||||
PERL_OS = MSWin32-x86
|
||||
# build perl manually, install to c:\perl. Then build everything else
|
||||
# cd win32 && nmake && nmake install
|
||||
PERL5_IMPORT = c:/perl/$(PERL_REV)/
|
||||
PERL_FILES = $(PERL_DIR)/Artistic
|
||||
PERL_BIN_FILES = \
|
||||
$(PERL5_IMPORT)/bin/$(PERL_OS)/perl$(EXE_SUFFIX)
|
||||
$(PERL5_IMPORT)/bin/$(PERL_OS)/perl$(DLL_SUFFIX) \
|
||||
PERL_LIB_FILES = $(PERL5_IMPORT)/lib/*.pm $(PERL5_IMPORT)/lib/*.pl
|
||||
PERL_LIB_OS_FILES = $(PERL5_IMPORT)/lib/$(PERL_OS)/*.pm
|
||||
endif
|
||||
ifeq ($(OS_ARCH), IRIX64)
|
||||
ARCH = IRIX
|
||||
endif
|
||||
ifeq ($(OS_ARCH), IRIX)
|
||||
# MIPSpro Compilers: Version 7.2.1
|
||||
CC = /usr/bin/cc -n32
|
||||
REL_OS_CFLAGS = -fullwarn
|
||||
DBG_OS_CFLAGS = -fullwarn
|
||||
OSDEFS = -D__IRIX__ -DHAVE_SELECT_H -DHAVE_WAIT_H -DUSE_PTHREADS -DUSE_LRAND48
|
||||
LIBS = -lm -lpthread
|
||||
# OS specific flags for perl Configure
|
||||
PERL_OS_CONFIGURE = -Dnm=/usr/bin/nm -Dar=/usr/bin/ar
|
||||
PERL_OS = IP27-irix
|
||||
endif
|
||||
ifeq ($(OS_ARCH), OSF1)
|
||||
# DEC C V5.6-071 on Digital UNIX V4.0(D) (Rev. 878)
|
||||
CC = /usr/bin/cc
|
||||
REL_OS_CFLAGS = -warnprotos -verbose -newc -std1 -pthread -w0 -readonly_strings
|
||||
DBG_OS_CFLAGS = -warnprotos -verbose -newc -std1 -pthread -w0 -readonly_strings
|
||||
OSDEFS = -D__OSF1__ -DHAVE_SELECT_H -DHAVE_WAIT_H -DUSE_PTHREADS -DUSE_LRAND48_R
|
||||
LIBS = -lm -lpthread
|
||||
PERL_OS = alpha-dec_osf
|
||||
endif
|
||||
ifeq ($(OS_ARCH), AIX)
|
||||
CC = /usr/bin/xlc_r
|
||||
REL_OS_CFLAGS = -qro -qroconst -qfullpath -qsrcmsg #-qflag=I:W
|
||||
DBG_OS_CFLAGS = -qro -qroconst -g -qfullpath -qsrcmsg #-qflag=I:W
|
||||
OSDEFS = -D__AIX__ -DHAVE_SELECT_H -D_THREAD_SAFE -DUSE_PTHREADS -DUSE_LRAND48_R
|
||||
LIBS = -lm #-lpthread
|
||||
PERL_OS = aix
|
||||
endif
|
||||
ifeq ($(OS_ARCH), HP-UX)
|
||||
CC = /usr/bin/cc
|
||||
# old flags: -Ae +DA1.0 +ESlit
|
||||
REL_OS_CFLAGS = +DAportable +DS2.0 -Ae +ESlit
|
||||
DBG_OS_CFLAGS = +Z +DAportable +DS2.0 -g -Ae +ESlit
|
||||
OSDEFS = -D__HPUX__ -DUSE_PTHREADS -DUSE_LRAND48
|
||||
LIBS = -lm -lpthread
|
||||
PERL_OS = PA-RISC2.0
|
||||
endif
|
||||
ifeq ($(OS_ARCH), SunOS)
|
||||
# Sun Workshop Compilers 5.0
|
||||
# CC = /tools/ns/workshop-5.0/bin/cc
|
||||
REL_OS_CFLAGS = -mt -xstrconst -v -O
|
||||
DBG_OS_CFLAGS = -mt -xstrconst -v -g -xs
|
||||
OSDEFS = -D__SOLARIS__ -DHAVE_SELECT_H -DHAVE_WAIT_H \
|
||||
-DXP_UNIX -D_REENTRANT \
|
||||
-DUSE_PTHREADS -DUSE_GETHOSTBYNAME_R -DUSE_GETPROTOBYNAME_R -DUSE_LRAND48
|
||||
LIBS = -lm -lnsl -lsocket -lpthread
|
||||
PERL_OS = sun4-solaris
|
||||
endif
|
||||
ifeq ($(OS_ARCH), Linux)
|
||||
# Linux 2.1 kernels and above
|
||||
CC = /usr/bin/gcc # gcc 2.7.2.3
|
||||
REL_OS_CFLAGS = -O -g -Wall
|
||||
DBG_OS_CFLAGS = -O1 -g -Wall
|
||||
OSDEFS = -D__LINUX__ -DHAVE_SELECT_H -DHAVE_WAIT_H -DUSE_PTHREADS -DUSE_LRAND48
|
||||
LIBS = -lm -lpthread
|
||||
# Must explicitly enable interpretation of \n
|
||||
# works for /bin/echo, sh:echo, or pdksh:echo. NOT tcsh:echo
|
||||
ECHO = /bin/echo -e
|
||||
PERL_OS = i686-linux
|
||||
endif
|
||||
|
||||
# pull in any OS extra config, if available
|
||||
-include $(topsrcdir)/config/$(OS_ARCH)/config.mk
|
||||
|
||||
ifeq ($(BUILD_TYPE), DEBUG)
|
||||
OS_CFLAGS = $(DBG_OS_CFLAGS) -D_DEBUG
|
||||
OS_LINKFLAGS = $(DBG_OS_LINKFLAGS)
|
||||
else
|
||||
OS_CFLAGS = $(REL_OS_CFLAGS)
|
||||
OS_LINKFLAGS = $(REL_OS_CFLAGS)
|
||||
endif
|
||||
|
||||
CPPFLAGS =
|
||||
CFLAGS = $(OS_CFLAGS)
|
||||
###DEFINES = -DHAVE_CONFIG_H $(OSDEFS)
|
||||
DEFINES = $(OSDEFS)
|
||||
LDFLAGS =
|
||||
|
||||
CP = cp
|
||||
RM = rm -f
|
||||
|
||||
COMPILE = $(CC) $(CFLAGS) $(DEFINES) $(CPPFLAGS) $(INCLUDES)
|
||||
ifeq ($(BUILD_VARIANT),release)
|
||||
STRIP := strip
|
||||
else
|
||||
STRIP := true
|
||||
endif
|
||||
@@ -1,261 +0,0 @@
|
||||
From MalclmKrstl@catlnml.com Mon Aug 2 15:53:54 2004
|
||||
Return-Path: <MalclmKrstl@catlnml.com>
|
||||
Received: from leggite.example.com ([207.111.254.118]) by snacker.example.com
|
||||
(Netscape Messaging Server 4.15) with ESMTP id I1UA2T00.FEQ for
|
||||
<exp@example.com>; Mon, 2 Aug 2004 14:52:05 -0700
|
||||
Received: from 207.111.254.118 ([201.224.129.137])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i72LsWgE015040
|
||||
for <exp@example.com>; Mon, 2 Aug 2004 14:54:51 -0700
|
||||
Received: from 24.4.45.15 by 201.224.129.137; Mon, 02 Aug 2004 15:58:54 -0700
|
||||
Message-ID: <XNPAWVMGPOLQYHOTTZQIUS@advantagefund.com>
|
||||
From: "Joey Lzrd" <MalclmKrstl@catlnml.com>
|
||||
Reply-To: "Joey Lzrd" <MalclmKrstl@catlnml.com>
|
||||
To: exp@example.com
|
||||
Subject: S@ve BlG 0n @ll Adobe S0ftware at Santos's eSoft Inc.
|
||||
Date: Mon, 02 Aug 2004 19:53:54 -0300
|
||||
MIME-Version: 1.0
|
||||
X-MimeOLE: Produced By Microsoft MimeOLE V4.71.2730.1
|
||||
X-Sender: MalclmKrstl@catlnml.com
|
||||
Organization: briton.ceremonious
|
||||
Content-Type: multipart/mixed;
|
||||
boundary="--45793938955694926761"
|
||||
|
||||
remember ale hush manuscript bookish
|
||||
sprinkle vladivostok distraught bathurst hadrian
|
||||
|
||||
|
||||
----45793938955694926761
|
||||
Content-Type: text/html;
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
<html><head><meta http-equiv=3DContent-Language content=3Den-us>
|
||||
<meta name=3DGENERATOR content=3D"self">
|
||||
<meta name=3DProgId content=3Dbourgeois><meta http-equiv=3DContent-Type co=
|
||||
ntent=3D"text/html; charset=3Dwindows-1252"><title>sketch</title></head><b=
|
||||
ody>
|
||||
<table border=3D1 cellpadding=3D0 cellspacing=3D0 style=3D"border-collapse=
|
||||
: collapse" bordercolor=3D#003399 width=3D600 id=3DAutoNumber1 height=3D22=
|
||||
><tr><td width=3D20% height=3D22 align=3Dcenter bgcolor=3D#003399> <font f=
|
||||
ace=3DArial size=3D2 color=3D#FFFFFF><b> <a style=3D"color: #FFFFFF; text-=
|
||||
decoration: none" href=3Dhttp://nlinedwnldsoft.net/?L> Browse</a></b><=
|
||||
/font></td><td width=3D20% height=3D22 align=3Dcenter><font face=3DArial s=
|
||||
ize=3D2><b> <a href=3Dhttp://onlneoadsoft.net/?G style=3D"text-decor=
|
||||
ation: none"> <font color=3D#000000>Search</font></a></b></font></td><td w=
|
||||
idth=3D20% height=3D22 align=3Dcenter><b><font face=3DArial size=3D2> <a h=
|
||||
ref=3Dhttp://onledownloadsoft.net/?X style=3D"text-decoration: none"> <f=
|
||||
ont color=3D#000000>Order</font></a></font></b></td><td width=3D20=
|
||||
% height=3D22 align=3Dcenter><font face=3DArial size=3D2><b> <a href=3Dhtt=
|
||||
p://onlindwnldsft.net/?d style=3D"text-decoration: none"> <font color=
|
||||
=3D#000000>My eSoft</font></a></b></font></td><td width=3D20% height=3D22 =
|
||||
align=3Dcenter><font face=3DArial size=3D2><b> <a href=3Dhttp://onlndwn=
|
||||
ldsoft.net/?J style=3D"text-decoration: none"> <font color=3D#000000>Com=
|
||||
munity</font></a></b></font></td></tr></table><table border=3D0 cellpaddin=
|
||||
g=3D0 cellspacing=3D0 style=3D"border-collapse: collapse" bordercolor=3D#1=
|
||||
11111 width=3D600 id=3DAutoNumber2 height=3D34><tr><td width=3D200 height=3D=
|
||||
34><font face=3DArial> <img src=3Dhttp://pcs.bsttc.com/aw/pcs/viewi=
|
||||
tem/backArrow_14x14.gif width=3D14 height=3D14> <font size=3D2><a href=3Dh=
|
||||
ttp://onlindwnldsft.net/?Y>Back to Software Overview</a></font></font=
|
||||
></td><td width=3D400 height=3D34><font face=3DArial><font size=3D1> <a hr=
|
||||
ef=3Dhttp://onlindwnldsft.net/?5>Home</a> > <a href=3Dhttp://onlin=
|
||||
edownloadsoft.net/?Y>All Categories</a> > <a href=3Dhttp://onlinedownlo=
|
||||
adsoft.net/?B>Computers</a> > <a href=3Dhttp://onlindwnldsft.net/?=
|
||||
d>Software</a> > <a href=3Dhttp://onlindwnldsft.net/?x>Operating S=
|
||||
ystems</a> > </font><b> <font size=3D1>Windows</font></b></font></td></=
|
||||
tr></table><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D"bord=
|
||||
er-collapse: collapse" bordercolor=3D#111111 width=3D600 id=3DAutoNumber3 =
|
||||
height=3D1><tr><td height=3D1 width=3D6> <img src=3Dhttp://pcs.bsttc=
|
||||
com/aw/pcs/listings/allitems_firstDark_6x29.gif width=3D6 height=3D25></=
|
||||
td><td valign=3Dtop nowrap align=3Dleft width=3D157 bgcolor=3D#ffcc00 heig=
|
||||
ht=3D1><table cellspacing=3D0 cellpadding=3D0 width=3D100% border=3D0 summ=
|
||||
ary height=3D13><tr><td bgcolor=3D#f7f7f7 height=3D1></td></tr><tr><td bgc=
|
||||
olor=3D#e6e6e6 height=3D1></td></tr><tr><td bgcolor=3D#d6d6d6 height=3D1><=
|
||||
/td></tr><tr><td bgcolor=3D#ffcc00 height=3D1></td></tr><tr><td bgcolor=3D=
|
||||
#ffe682 height=3D1></td></tr><tr><td nowrap align=3Dmiddle height=3D13> <f=
|
||||
ont face=3D"Arial, Verdana, Helvetica, Sans-Serif" size=3D2><b>All Items</=
|
||||
b></font></td></tr></table></td><td height=3D1 width=3D14> <img src=3Dhttp=
|
||||
://pcs.bsttc.com/aw/pcs/listings/allitems_midDarkOnLight_14x29.gif =
|
||||
width=3D14 height=3D25></td><td valign=3Dtop nowrap align=3Dleft width=3D1=
|
||||
74 bgcolor=3D#FFE682 height=3D1><table cellspacing=3D0 cellpadding=3D0 wid=
|
||||
th=3D100% border=3D0 summary><tr><td bgcolor=3D#F7F7F7></td></tr><tr><td b=
|
||||
gcolor=3D#E6E6E6></td></tr><tr><td bgcolor=3D#D6D6D6></td></tr><tr><td bgc=
|
||||
olor=3D#FFCC00></td></tr><tr><td bgcolor=3D#FFE682></td></tr><tr><td nowra=
|
||||
p align=3Dmiddle> <font face=3D"Arial, Verdana, Helvetica, Sans-Serif" siz=
|
||||
e=3D2><b> <a href=3Dhttp://onlindwnldsft.net/?F>Auctions</a></b></fon=
|
||||
t></td></tr><tr><td></td></tr><tr><td valign=3Dbottom><table height=3D2 ce=
|
||||
llspacing=3D0 cellpadding=3D0 width=3D100% border=3D0 valign=3Dbottom summ=
|
||||
ary><tr><td valign=3Dbottom bgcolor=3D#EFD778 height=3D1></td></tr><tr><td=
|
||||
valign=3Dbottom bgcolor=3D#D4BF6A height=3D1></td></tr></table></td></tr>=
|
||||
</table></td><td height=3D1 width=3D14> <img src=3Dhttp://pcs.bsttc.=
|
||||
com/aw/pcs/listings/allitems_midLightLight_14x29.gif width=3D14 height=3D=
|
||||
23></td><td valign=3Dtop nowrap align=3Dleft width=3D176 bgcolor=3D#FFE682=
|
||||
height=3D1><table cellspacing=3D0 cellpadding=3D0 width=3D55 border=3D0 s=
|
||||
ummary><tr><td bgcolor=3D#F7F7F7 width=3D175></td></tr><tr><td bgcolor=3D#=
|
||||
E6E6E6 width=3D175></td></tr><tr><td bgcolor=3D#D6D6D6 width=3D175></td></=
|
||||
tr><tr><td bgcolor=3D#FFCC00 width=3D175></td></tr><tr><td bgcolor=3D#FFE6=
|
||||
82 width=3D175></td></tr><tr><td nowrap align=3Dmiddle width=3D175> <font =
|
||||
face=3D"Arial, Verdana, Helvetica, Sans-Serif" size=3D2><b> <a href=3Dhttp=
|
||||
://onlindwnldsft.net/?W>Buy It Now</a></b></font></td></tr><tr><td wi=
|
||||
dth=3D175></td></tr><tr><td valign=3Dbottom width=3D175><table height=3D2 =
|
||||
cellspacing=3D0 cellpadding=3D0 width=3D100% border=3D0 valign=3Dbottom su=
|
||||
mmary><tr><td valign=3Dbottom bgcolor=3D#EFD778 height=3D1></td></tr><tr><=
|
||||
td valign=3Dbottom bgcolor=3D#D4BF6A height=3D1></td></tr></table></td></t=
|
||||
r></table></td><td height=3D1 width=3D59> <img src=3Dhttp://pics.ebaystati=
|
||||
c.com/aw/pcs/listings/allitems_endLightTab_14x29.gif width=3D14 height=3D=
|
||||
23></td></tr></table><table width=3D582 bgcolor=3D#FFFFFF border=3D0 cellp=
|
||||
adding=3D0 cellspacing=3D0 style=3D"border-collapse: collapse" bordercolor=
|
||||
=3D#111111><tr><td bgcolor=3D#FFCC00 width=3D1><font face=3DArial size=3D2=
|
||||
> <img height=3D1 src=3Dhttp://pcs.bsttc.com/aw/pcs/s.gif width=3D1=
|
||||
></font></td><td width=3D598><table border=3D1 bgcolor=3D#FFFFCC width=3D5=
|
||||
99 cellpadding=3D0 cellspacing=3D0 style=3D"border-collapse: collapse" bor=
|
||||
dercolor=3D#FFCC00 height=3D52><tr><td valign=3Dmiddle nowrap width=3D592 =
|
||||
height=3D52><font face=3DArial> <input type=3Dtext name=3D=
|
||||
satitle size=3D33 maxlength=3D300 value><font size=3D2> </font><select nam=
|
||||
e=3Dsacategory> <option selected>Windows</option> </select><font size=3D2>=
|
||||
</font><a href=3Dhttp://onlindwnldsft.net/?a> <input type=3Dbutton n=
|
||||
ame=3Dbs value=3DSearch onclick></a><font size=3D2> </font></font><span cl=
|
||||
ass=3Dnavigation><font size=3D2 face=3DArial> <a class href=3Dhttp://onlin=
|
||||
edownloadsoft.net/?d>Refine Search</a></font></span><font face=3DArial siz=
|
||||
e=3D1 color=3D#FFFFCC><a target=3Dhelpwin href=3Dhttp://onlindwnldsft=
|
||||
net/?C style=3D"text-decoration: none"><font color=3D#FFE682>fable</font>=
|
||||
</a></font></td></tr></table></td></tr></table>
|
||||
<table border=3D1 cellpadding=3D0 cellspacing=3D0 style=3D"border-collapse=
|
||||
: collapse" bordercolor=3D#CCCCCC width=3D600 id=3DAutoNumber4 height=3D22=
|
||||
8><tr><td width=3D134 height=3D228 rowspan=3D6><table border=3D1 cellpaddi=
|
||||
ng=3D2 cellspacing=3D0 style=3D"border-collapse: collapse" bordercolor=3D#=
|
||||
FFCC00 width=3D100% id=3DAutoNumber5 height=3D423 bgcolor=3D#FFFFCC><tr><t=
|
||||
d width=3D100% height=3D10 bgcolor=3D#FFE682> <b><font face=3DArial s=
|
||||
ize=3D2>Top Ten Sellers</font></b></td></tr><tr><td width=3D100=
|
||||
% height=3D413 valign=3Dtop><font face=3DArial size=3D1>1 - <a href=3Dhttp=
|
||||
://onlindwnldsft.net/?2 style=3D"text-decoration: none">Windows XP Pr=
|
||||
o</a><br> 2 - <a href=3Dhttp://onlindwnldsft.net/?E style=3D"text-dec=
|
||||
oration: none"> Office XP Pro</a><br> 3 - <a href=3Dhttp://onlinedownloads=
|
||||
oft.net/?7 style=3D"text-decoration: none"> Adobe Acrobat<br> =
|
||||
6.0 Professional</a><br> 4 - <a href=3Dhttp://onlinedownloads=
|
||||
oft.net/?b style=3D"text-decoration: none"> Adobe Photoshop<br> &nbs=
|
||||
p; CS 8.0</a><br> 5<a href=3Dhttp://onlindwnldsft.net/?k =
|
||||
style=3D"text-decoration: none"> - SystemWorks<br>  =
|
||||
; 2004 Pro </a><br> 6 - <a style=3D"text-dec=
|
||||
oration: none" href=3Dhttp://onlindwnldsft.net/?a> Macromedia<br> &nb=
|
||||
sp; DreamWeaver<br> MX 2004</a>=
|
||||
<br> <a href=3Dhttp://onlindwnldsft.net/?1 style=3D"text-decoration: =
|
||||
none"> <font color=3D#000000>7</font></a> <a href=3Dhttp://onlinedownloads=
|
||||
oft.net/?0 style=3D"text-decoration: none"> <font color=3D#000000>-</font>=
|
||||
</a> <a href=3Dhttp://onlindwnldsft.net/?x style=3D"text-decoration: =
|
||||
none">Macromedia Flash<br> MX 2004 Pro</a><br> 8 =
|
||||
- <a href=3Dhttp://onlindwnldsft.net/?I style=3D"text-decoration: non=
|
||||
e"> MS 2003 Server<br> (Enterprise Edition)</a><br> 9 - <a hr=
|
||||
ef=3Dhttp://onlindwnldsft.net/?W style=3D"text-decoration: none"> Win=
|
||||
dows XP<br> (Longhorn Edition)</a><br> 10 - <a href=3Dh=
|
||||
ttp://onlindwnldsft.net/?m style=3D"text-decoration: none">CorelDRAW<=
|
||||
br> Graphics Suite 12.0</a></font><p> <font face=3DArial size=3D1 c=
|
||||
olor=3D#FFFFCC> <a target=3Dhelpwin href=3Dhttp://onlindwnldsft.net/?=
|
||||
A style=3D"text-decoration: none"> <font color=3D#FFE682>skyrocket</font><=
|
||||
/a></font></td></tr></table></td><td width=3D466 height=3D18 bgcolor=3D#D6=
|
||||
D6D6 colspan=3D3><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D=
|
||||
"border-collapse: collapse" bordercolor=3D#111111 width=3D100=
|
||||
% id=3DAutoNumber6><tr><td width=3D80%><p align=3Dcenter><b><font size=3D2=
|
||||
face=3DArial>Item Title</font></b></p></td><td width=3D20%><p align=3Dcen=
|
||||
ter><b><font face=3DArial size=3D2>Price</font></b></p></td></tr></table><=
|
||||
/td></tr><tr><td width=3D97 height=3D92><p align=3Dcenter>
|
||||
<img border=3D0 src=3Dhttp://www.dara.es/soft/co/micro/xpPro.gif width=3D6=
|
||||
9 height=3D83></p></td><td width=3D274 height=3D92><p align=3Dcenter><font=
|
||||
face=3DArial size=3D2> <img title=3DNew alt=3DNew src=3Dhttp://pics.ebays=
|
||||
tatic.com/aw/pcs/icon/iconNew_16x16.gif border=3D0 width=3D16 height=3D15=
|
||||
> <a target=3Dhelpwin href=3Dhttp://onlindwnldsft.net/?D> Micros=
|
||||
oft Windows XP Professional<br> -Current Edition-<br> </a></font><font fac=
|
||||
e=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpwin href=3Dhttp://onli=
|
||||
nedownloadsoft.net/?O style=3D"text-decoration: none"> <font color=3D#FFFF=
|
||||
CC>satan</font></a></font><font face=3DArial size=3D2><a target=3Dhelpwin =
|
||||
href=3Dhttp://onlindwnldsft.net/?j><br> <img title=3D"Gift Services" =
|
||||
alt=3D"Gift Services" src=3Dhttp://pcs.bsttc.com/aw/pcs/bin_15x54.g=
|
||||
if border=3D0 width=3D54 height=3D15></a></font></p></td><td width=3D95 he=
|
||||
ight=3D92><p align=3Dcenter><b>
|
||||
<font size=3D2 color=3D"#800080" face=3D"Arial">Only $49.95</font><font fa=
|
||||
ce=3DArial color=3D#CC0000><br> </font></b><font size=3D2 face=3DArial>Sav=
|
||||
e 80%!</font></p></td></tr><tr><td width=3D466 height=3D20 colspan=3D3 bgc=
|
||||
olor=3D#D6D6D6><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D"=
|
||||
border-collapse: collapse" bordercolor=3D#111111 width=3D100% id=3DAutoNum=
|
||||
ber7><tr><td width=3D80%><p align=3Dcenter><b><font face=3DArial size=3D2>=
|
||||
Hot Summer Package Deals</font></b></p></td><td width=3D20%><p align=3Dcen=
|
||||
ter><b><font size=3D2 face=3DArial> Price</font></b></p></td></tr></t=
|
||||
able></td></tr><tr><td width=3D466 height=3D45 colspan=3D3><table border=3D=
|
||||
0 cellpadding=3D0 cellspacing=3D0 style=3D"border-collapse: collapse" bord=
|
||||
ercolor=3D#111111 width=3D100% id=3DAutoNumber8 height=3D97><tr><td width=3D=
|
||||
18% height=3D97> <img border=3D0 src=3Dhttp://www.dara.es/soft/co/micro/xp=
|
||||
Pro.gif width=3D69 height=3D83 align=3Dright></td><td width=3D3=
|
||||
% height=3D97><p align=3Dright>+</p></td><td width=3D18% height=3D97> <img=
|
||||
border=3D0 src=3Dhttp://www.pym.com.au/images/officexp.gif width=3D80 h=
|
||||
eight=3D82></td><td width=3D3% height=3D97>+</td><td width=3D15=
|
||||
% height=3D97> <img border=3D0 src=3Dhttp://www.gecadnet.ro/ufolder/photos=
|
||||
hopcs.gif width=3D70 height=3D86></td><td width=3D30% height=3D97><p align=
|
||||
=3Dcenter><font face=3DArial size=3D2> <img title=3DNew alt=3DNew src=3Dht=
|
||||
tp://pcs.bsttc.com/aw/pcs/icon/iconNew_16x16.gif border=3D0 width=3D=
|
||||
16 height=3D15> <a href=3Dhttp://onlindwnldsft.net/spo.html?l>Windows=
|
||||
XP Pro + Office XP Pro + Adobe Photoshop CS 8.0</a><br> </font><font face=
|
||||
=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpwin href=3Dhttp://onlin=
|
||||
edownloadsoft.net/?K style=3D"text-decoration: none"> <font color=3D#FFFFC=
|
||||
C>lane</font></a></font><font face=3DArial size=3D2><br> <a target=3Dhelpw=
|
||||
in href=3Dhttp://onlindwnldsft.net/spo.html?u> <img title=3D"Gift Ser=
|
||||
vices" alt=3D"Gift Services" src=3Dhttp://pcs.bsttc.com/aw/pcs/bin_=
|
||||
15x54.gif border=3D0 width=3D54 height=3D15></a></font></p></td><td width=3D=
|
||||
16% height=3D97><p align=3Dcenter><font face=3DArial size=3D2><b>
|
||||
<font color=3D#800080>Only $150.95<br> </font> </b>Save<br> 90=
|
||||
%!</font></p></td></tr></table></td></tr><tr><td width=3D466 height=3D70 c=
|
||||
olspan=3D3><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D"bord=
|
||||
er-collapse: collapse" bordercolor=3D#111111 width=3D100% id=3DAutoNumber9=
|
||||
height=3D99><tr><td width=3D20% height=3D99> <img border=3D0 src=3Dhttp:/=
|
||||
/www.dara.es/soft/co/micro/xpPro.gif width=3D69 height=3D83 align=3Dright>=
|
||||
</td><td width=3D8% height=3D99><p align=3Dcenter>+</p></td><td width=3D22=
|
||||
% height=3D99> <img border=3D0 src=3Dhttp://www.jaeggi.ch/images/tipps_ueb=
|
||||
ersicht/software/systemworks2004.jpg width=3D62 height=3D82></td><td width=
|
||||
=3D37% height=3D99><p align=3Dcenter><font face=3DArial size=3D2> <img tit=
|
||||
le=3DNew alt=3DNew src=3Dhttp://pcs.bsttc.com/aw/pcs/icon/iconNew_1=
|
||||
6x16.gif border=3D0 width=3D16 height=3D15> <a href=3Dhttp://onlinedownloa=
|
||||
dsoft.net/spo.html?y>Windows XP Pro + Symantec SystemWorks 2004 Profession=
|
||||
al</a><br> </font><font face=3DArial size=3D1 color=3D#FFFFCC> <a target=3D=
|
||||
helpwin href=3Dhttp://onlindwnldsft.net/?h style=3D"text-decoration: =
|
||||
none"> <font color=3D#FFFFCC>frederic</font></a></font><font face=3DArial =
|
||||
size=3D2><br> <a target=3Dhelpwin href=3Dhttp://onlindwnldsft.net/spo=
|
||||
html?o> <img title=3D"Gift Services" alt=3D"Gift Services" src=3Dhttp://p=
|
||||
ics.bysttc.com/aw/pcs/bin_15x54.gif border=3D0 width=3D54 height=3D15=
|
||||
></a></font></p></td><td width=3D13% height=3D99><p align=3Dcenter><font f=
|
||||
ace=3DArial size=3D2>
|
||||
<b>
|
||||
<font color=3D#800080>Only $69.95</font><br> </b>Save<br> 90=
|
||||
%!</font></p></td></tr></table></td></tr><tr><td width=3D466 height=3D29 c=
|
||||
olspan=3D3><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D"bord=
|
||||
er-collapse: collapse" bordercolor=3D#111111 width=3D100% id=3DAutoNumber1=
|
||||
0 height=3D70><tr><td width=3D20% height=3D70> <img border=3D0 src=3Dhttp:=
|
||||
//www.ntwrk-d.com.au/Images/flashMXpro.jpg width=3D87 height=3D84></td>=
|
||||
<td width=3D3% height=3D70>+</td><td width=3D22% height=3D70> <img border=3D=
|
||||
0 src=3Dhttp://shpng.trr.com.br/iguate/imgprod/Dreamweaver2004.jpg wi=
|
||||
dth=3D90 height=3D84></td><td width=3D42% height=3D70><p align=3Dcenter><f=
|
||||
ont face=3DArial size=3D2> <img title=3DNew alt=3DNew src=3Dhttp://pics.b=
|
||||
ysttc.com/aw/pcs/icon/iconNew_16x16.gif border=3D0 width=3D16 height=3D=
|
||||
15> <a href=3Dhttp://onlindwnldsft.net/spo.html?Z>Macromedia Flash MX=
|
||||
2004 Professional + Macromedia Dreamweaver 2004 Professional</a><br> </fo=
|
||||
nt><font face=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpwin href=3D=
|
||||
http://onlindwnldsft.net/?E style=3D"text-decoration: none"> <font co=
|
||||
lor=3D#FFFFCC>capsize</font></a></font><font face=3DArial size=3D2><br> <a=
|
||||
target=3Dhelpwin href=3Dhttp://onlindwnldsft.net/spo.html?O> <img ti=
|
||||
tle=3D"Gift Services" alt=3D"Gift Services" src=3Dhttp://pcs.bsttc.c=
|
||||
om/aw/pcs/bin_15x54.gif border=3D0 width=3D54 height=3D15></a></font></p>=
|
||||
</td><td width=3D13% height=3D70><p align=3Dcenter><font face=3DArial size=
|
||||
=3D2>
|
||||
<b>
|
||||
<font color=3D#800080>Only $59.95</font><br> </b>Save<br> 95=
|
||||
%!</font></p></td></tr></table></td></tr></table><p align=3Dcenter><font f=
|
||||
ace=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpwin href=3Dhttp://on=
|
||||
linedownloadsoft.net/?Y style=3D"text-decoration: none"><font color=3D#FFF=
|
||||
FCC>circumscribe deport increase jocose contiguous wave godsend murderous =
|
||||
erodible transmogrify kobayashi adoptive duress methuselah serene photolyt=
|
||||
ic magnetic hahn dozen koinonia circumspect=20</font></a></font></p><p ali=
|
||||
gn=3Dcenter><font face=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpw=
|
||||
in href=3Dhttp://onlindwnldsft.net/?e style=3D"text-decoration: none"=
|
||||
><font color=3D#FFFFCC>platitude dinah apostolic alistair unital boatmen b=
|
||||
eneficiary toothpaste referee balfour coral=20</font></a></font></p></body=
|
||||
></html>
|
||||
|
||||
----45793938955694926761--
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
From Wd@rgsrdds.com Thu Feb 26 03:26:07 2004
|
||||
Return-Path: <Wd@rgsrdds.com>
|
||||
Received: from 24-196-112-88.fdl.wi.chrter.com (24-196-112-88.fdl.wi.charter.com [24.196.112.88])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i1QBRUVf004909
|
||||
for <exp@example.com>; Thu, 26 Feb 2004 03:27:39 -0800
|
||||
Received: from 243.66.85.172 by 24.196.112.88; Thu, 26 Feb 2004 07:22:07 -0400
|
||||
Message-ID: <UAEXRCYRSQWVZYJINKNBA@rtemedsr.com>
|
||||
From: "Mil" <Wd@rgsrdds.com>
|
||||
Reply-To: "Mil" <Wd@rgsrdds.com>
|
||||
To: exp@example.com
|
||||
Subject: compare our prices to other pharmacys
|
||||
Date: Thu, 26 Feb 2004 14:26:07 +0300
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/alternative;
|
||||
boundary="--2159753839863261329"
|
||||
|
||||
----2159753839863261329
|
||||
Content-Type: text/plain;
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
get your meds online
|
||||
|
||||
Your easy-to-use solution is here:
|
||||
|
||||
http://rtmdsr.com/gp/deflt.asp?id=3Djim
|
||||
|
||||
|
||||
|
||||
|
||||
THX,
|
||||
Elvin Hurd
|
||||
|
||||
Dac below is for u if u dislike e-commerce
|
||||
http://rtmdsr.com/er/r.asp?Folder=3Dgp
|
||||
|
||||
|
||||
----2159753839863261329--
|
||||
|
||||
|
||||
@@ -1,549 +0,0 @@
|
||||
From anaspec@rthlnk.net Tue Aug 31 15:36:37 2004
|
||||
Return-Path: <nspec@rthlnk.net>
|
||||
Received: from localhost (localhost [127.0.0.1])
|
||||
by smtp.example.com (8.12.11/8.12.5) with ESMTP id i811APdX006705
|
||||
for <exp@localhost>; Tue, 31 Aug 2004 18:10:26 -0700
|
||||
Received: from snacker.example.com [207.111.254.120]
|
||||
by localhost with IMAP (fetchmail-6.2.5)
|
||||
for exp@localhost (single-drop); Tue, 31 Aug 2004 18:10:26 -0700 (PDT)
|
||||
Received: from leggte.example.com ([207.111.254.118]) by snacker.example.com
|
||||
(Netscape Messaging Server 4.15) with ESMTP id I3C17600.438 for
|
||||
<exp@example.com>; Tue, 31 Aug 2004 15:30:42 -0700
|
||||
Received: from rthlnk.net (218-35-236-63.etheric.net [63.236.35.218] (may be forged))
|
||||
by leggte.example.com (8.12.8/8.12.8) with ESMTP id i7VMbcCu000722
|
||||
for <exp@example.com>; Tue, 31 Aug 2004 15:37:38 -0700
|
||||
Message-ID: <20040831153637.D2409658E4524456@rthlnk.net>
|
||||
From: nspec@rthlnk.net
|
||||
To: exp@example.com
|
||||
Subject: Peptide News
|
||||
Reply-To: nspec@rthlnk.net
|
||||
Date: 31 Aug 2004 15:36:37 -0700
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/html;
|
||||
charset="iso-8859-1"
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
<html xmlns:v=3D"urn:schemas-microsoft-com:vml"
|
||||
xmlns:o=3D"urn:schemas-microsoft-com:office:office"
|
||||
xmlns:w=3D"urn:schemas-microsoft-com:office:word"
|
||||
xmlns=3D"http://www.w3.org/TR/REC-html40">
|
||||
|
||||
<head>
|
||||
<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Diso-8859-1">=
|
||||
|
||||
<meta name=3DProgId content=3DWord.Document>
|
||||
<meta name=3DGenerator content=3D"Microsoft Word 9">
|
||||
<meta name=3DOriginator content=3D"Microsoft Word 9">
|
||||
<link rel=3DFile-List href=3D"./30%25savings_files/fillst.xml">
|
||||
<link rel=3DEdit-Time-Data href=3D"./30%25savings_files/edidta.mso">
|
||||
<!--[if !mso]>
|
||||
<style>
|
||||
v\:* {behavior:url(#default#VML);}
|
||||
o\:* {behavior:url(#default#VML);}
|
||||
w\:* {behavior:url(#default#VML);}
|
||||
.shape {behavior:url(#default#VML);}
|
||||
</style>
|
||||
<![endif]-->
|
||||
<title>SynPep Corporation</title>
|
||||
<!--[if gte mso 9]><xml>
|
||||
<o:DocumentProperties>
|
||||
<o:Author>davids</o:Author>
|
||||
<o:LastAuthor>davids</o:LastAuthor>
|
||||
<o:Revision>2</o:Revision>
|
||||
<o:TotalTime>32</o:TotalTime>
|
||||
<o:Created>2004-08-30T23:39:00Z</o:Created>
|
||||
<o:LastSaved>2004-08-30T23:39:00Z</o:LastSaved>
|
||||
<o:Pages>1</o:Pages>
|
||||
<o:Words>670</o:Words>
|
||||
<o:Characters>3821</o:Characters>
|
||||
<o:Lines>31</o:Lines>
|
||||
<o:Paragraphs>7</o:Paragraphs>
|
||||
<o:CharactersWithSpaces>4692</o:CharactersWithSpaces>
|
||||
<o:Version>9.6926</o:Version>
|
||||
</o:DocumentProperties>
|
||||
</xml><![endif]-->
|
||||
<style>
|
||||
<!--
|
||||
/* Font Definitions */
|
||||
@font-face
|
||||
{font-family:Wingdings;
|
||||
panose-1:5 0 0 0 0 0 0 0 0 0;
|
||||
mso-font-charset:2;
|
||||
mso-generic-font-family:auto;
|
||||
mso-font-pitch:variable;
|
||||
mso-font-signature:0 268435456 0 0 -2147483648 0;}
|
||||
@font-face
|
||||
{font-family:Verdana;
|
||||
panose-1:2 11 6 4 3 5 4 4 2 4;
|
||||
mso-font-charset:0;
|
||||
mso-generic-font-family:swiss;
|
||||
mso-font-pitch:variable;
|
||||
mso-font-signature:536871559 0 0 0 415 0;}
|
||||
/* Style Definitions */
|
||||
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
||||
{mso-style-parent:"";
|
||||
margin:0in;
|
||||
margin-bottom:.0001pt;
|
||||
mso-pagination:widow-orphan;
|
||||
font-size:12.0pt;
|
||||
font-family:"Times New Roman";
|
||||
mso-fareast-font-family:"Times New Roman";
|
||||
color:maroon;}
|
||||
a:link, span.MsoHyperlink
|
||||
{color:blue;}
|
||||
a:visited, span.MsoHyperlinkFollowed
|
||||
{color:blue;}
|
||||
pre
|
||||
{margin:0in;
|
||||
margin-bottom:.0001pt;
|
||||
font-size:10.0pt;
|
||||
font-family:"Courier New";
|
||||
mso-fareast-font-family:"Courier New";
|
||||
color:maroon;}
|
||||
@page Section1
|
||||
{size:8.5in 11.0in;
|
||||
margin:1.0in 1.25in 1.0in 1.25in;
|
||||
mso-header-margin:.5in;
|
||||
mso-footer-margin:.5in;
|
||||
mso-paper-source:0;}
|
||||
div.Section1
|
||||
{page:Section1;}
|
||||
/* List Definitions */
|
||||
@list l0
|
||||
{mso-list-id:410741857;
|
||||
mso-list-type:hybrid;
|
||||
mso-list-template-ids:784620064 286026972 -788265640 993687158 626055678 -1=
|
||||
811375712 -151983676 -930189644 1334191436 815690794;}
|
||||
@list l0:level1
|
||||
{mso-level-number-format:bullet;
|
||||
mso-level-text:\F0B7;
|
||||
mso-level-tab-stop:.5in;
|
||||
mso-level-number-position:left;
|
||||
text-indent:-.25in;
|
||||
mso-ansi-font-size:10.0pt;
|
||||
font-family:Symbol;}
|
||||
@list l1
|
||||
{mso-list-id:573589179;
|
||||
mso-list-type:hybrid;
|
||||
mso-list-template-ids:1335506698 -287414814 -166539250 1278239692 20987546 =
|
||||
-72418112 -735677686 -1233212756 288795288 889766454;}
|
||||
@list l1:level1
|
||||
{mso-level-number-format:bullet;
|
||||
mso-level-text:\F0B7;
|
||||
mso-level-tab-stop:.5in;
|
||||
mso-level-number-position:left;
|
||||
text-indent:-.25in;
|
||||
mso-ansi-font-size:10.0pt;
|
||||
font-family:Symbol;}
|
||||
@list l2
|
||||
{mso-list-id:1811441157;
|
||||
mso-list-type:hybrid;
|
||||
mso-list-template-ids:868497156 -610104194 1657037930 -1004880116 -13919388=
|
||||
22 -1255648344 -314401074 -609714884 -811151446 832969692;}
|
||||
@list l2:level1
|
||||
{mso-level-number-format:bullet;
|
||||
mso-level-text:\F0B7;
|
||||
mso-level-tab-stop:.5in;
|
||||
mso-level-number-position:left;
|
||||
text-indent:-.25in;
|
||||
mso-ansi-font-size:10.0pt;
|
||||
font-family:Symbol;}
|
||||
ol
|
||||
{margin-bottom:0in;}
|
||||
ul
|
||||
{margin-bottom:0in;}
|
||||
-->
|
||||
</style>
|
||||
<!--[if gte mso 9]><xml>
|
||||
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1028"/>
|
||||
</xml><![endif]--><!--[if gte mso 9]><xml>
|
||||
<o:shapelayout v:ext=3D"edit">
|
||||
<o:idmap v:ext=3D"edit" data=3D"1"/>
|
||||
</o:shapelayout></xml><![endif]-->
|
||||
</head>
|
||||
|
||||
<body bgcolor=3Dsilver lang=3DEN-US link=3Dblue vlink=3Dblue style=3D'tab-in=
|
||||
terval:.5in'>
|
||||
|
||||
<div class=3DSection1>
|
||||
|
||||
<div align=3Dcenter>
|
||||
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"80%" bgcolor=3Dma=
|
||||
roon
|
||||
style=3D'width:80.0%;mso-cellspacing:0in;background:maroon;mso-padding-alt:=
|
||||
.6pt .6pt .6pt .6pt'>
|
||||
<tr>
|
||||
<td style=3D'padding:.6pt .6pt .6pt .6pt'><!-- Content Starts Here -->
|
||||
<div align=3Dcenter>
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"100%" bgcolor=
|
||||
=3Dwhite
|
||||
style=3D'width:100.0%;mso-cellspacing:0in;background:white;mso-padding-al=
|
||||
t:
|
||||
0in 0in 0in 0in'>
|
||||
<tr>
|
||||
<td style=3D'padding:0in 0in 0in 0in'>
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"100%" style=
|
||||
=3D'width:100.0%;
|
||||
mso-cellspacing:0in;mso-padding-alt:3.0pt 3.0pt 3.0pt 3.0pt'>
|
||||
<tr>
|
||||
<td width=3D"100%" valign=3Dbottom style=3D'width:100.0%;padding:3.0pt=
|
||||
3.0pt 3.0pt 3.0pt'>
|
||||
<p class=3DMsoNormal><![if !supportEmptyParas]> <![endif]><o:p></=
|
||||
o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=3D"100%" style=3D'width:100.0%;padding:3.0pt 3.0pt 3.0pt 3.0=
|
||||
pt'>
|
||||
<p class=3DMsoNormal align=3Dcenter style=3D'text-align:center'><b><sp=
|
||||
an
|
||||
style=3D'font-size:14.5pt;font-family:Verdana'>Are you or your staff i=
|
||||
n
|
||||
need of Quality Peptides?<o:p></o:p></span></b></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style=3D'background:#FFDD66;padding:3.0pt 3.0pt 3.0pt 3.0pt'>
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"100%"
|
||||
style=3D'width:100.0%;mso-cellspacing:0in;mso-padding-alt:0in 0in 0in=
|
||||
0in'>
|
||||
<tr>
|
||||
<td width=3D"70%" style=3D'width:70.0%;background:#FFDD66;padding:0i=
|
||||
n 0in 0in 0in'>
|
||||
<p class=3DMsoNormal><span style=3D'font-size:18.0pt;mso-bidi-font-s=
|
||||
ize:
|
||||
7.0pt;font-family:Verdana;color:black'>If the answer is </span><stro=
|
||||
ng><span
|
||||
style=3D'font-size:18.0pt;mso-bidi-font-size:7.0pt;font-family:Verda=
|
||||
na;
|
||||
color:navy'>YES</span></strong><span style=3D'font-size:18.0pt;
|
||||
mso-bidi-font-size:7.0pt;font-family:Verdana;color:black'>, </span><=
|
||||
strong><span
|
||||
style=3D'font-size:18.0pt;mso-bidi-font-size:7.0pt;font-family:Verda=
|
||||
na;
|
||||
color:navy'>nSpec</span></strong><span style=3D'font-size:18.0pt;
|
||||
mso-bidi-font-size:7.0pt;font-family:Verdana;color:black'> is offeri=
|
||||
ng
|
||||
up to 30% off your first new order.<br>
|
||||
</span><span style=3D'font-size:7.0pt;font-family:Verdana;color:blac=
|
||||
k'><br>
|
||||
We are the market leader in the manufacturing of Custom Peptides, an=
|
||||
d Catalog
|
||||
Peptides,. We offer high-throughput manufacturing under GLP conditio=
|
||||
ns
|
||||
to meet the demand for synthetic peptides in pharmaceuticals,
|
||||
biotechnology, agrochemical industries and research institutes.<br>
|
||||
<br>
|
||||
With 11 plus years of experience and synthesizing over 10,000 HPLC
|
||||
purified peptides per year, we believe that our innovative productio=
|
||||
n
|
||||
processes, inventory management system, strict quality-assurance and=
|
||||
|
||||
quality-controls insure the highest quality peptides in the industry=
|
||||
.<br>
|
||||
<br>
|
||||
In addition to our superior quality, We provide competitive prices,
|
||||
fast delivery, and an award-winning technical support team that resu=
|
||||
lt
|
||||
in the best value available on the market. <o:p></o:p></span></p>
|
||||
</td>
|
||||
<td width=3D"30%" style=3D'width:30.0%;background:#FFDD66;padding:0i=
|
||||
n 0in 0in 0in'>
|
||||
<p class=3DMsoNormal><img id=3D"_x0000_i1026"
|
||||
src=3D"http://www.bpfrntln.com/sals/girl.jpg" border=3D0
|
||||
align=3Dmiddle></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class=3DMsoNormal><o:p></o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style=3D'background:#FFDD66;padding:3.0pt 3.0pt 3.0pt 3.0pt'>
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"100%"
|
||||
style=3D'width:100.0%;mso-cellspacing:0in;mso-padding-alt:1.8pt 1.8pt=
|
||||
1.8pt 1.8pt'>
|
||||
<tr>
|
||||
<td width=3D"30%" valign=3Dtop style=3D'width:30.0%;background:#FFDD=
|
||||
66;
|
||||
padding:1.8pt 1.8pt 1.8pt 1.8pt'>
|
||||
<p class=3DMsoNormal><img width=3D249 height=3D249 id=3D"_x0000_i102=
|
||||
7"
|
||||
src=3D"http://www.bpfrntln.com/sals/chem.jpg" border=3D0></p>
|
||||
</td>
|
||||
<td width=3D"70%" style=3D'width:70.0%;background:#FFDD66;padding:1.=
|
||||
8pt 1.8pt 1.8pt 1.8pt'>
|
||||
<p class=3DMsoNormal style=3D'margin-bottom:12.0pt'><strong><span
|
||||
style=3D'font-size:8.5pt;font-family:Verdana;color:navy'>Low Cost</s=
|
||||
pan></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'><br>
|
||||
We provide the most competitive rates in the industry. Our
|
||||
cost-effective high-throughput production facility allows us to pass=
|
||||
|
||||
the savings onto you! We have built our facility and capabilities
|
||||
around state-of-the-art equipment and have meticulously fine-tuned o=
|
||||
ur
|
||||
process methodology to avoid the high cost of unnecessary labor. <a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DREF.CODE:SeptemberSpe=
|
||||
cial"><span style=3D'text-decoration:
|
||||
none;text-underline:none'>Click here</span></a> to find out more abo=
|
||||
ut
|
||||
our low cost.<br>
|
||||
<br>
|
||||
</span><strong><span style=3D'font-size:8.5pt;font-family:Verdana;
|
||||
color:navy'>Quality</span></strong><span style=3D'font-size:7.0pt;
|
||||
font-family:Verdana;color:black'><br>
|
||||
Under GLP conditions, our products are manufactured under protocol a=
|
||||
nd
|
||||
tracked using our Data Management System. All produced peptides are
|
||||
shipped with HPLC, Mass Spectra Analysis, and UV Scan Data. Our QC
|
||||
Department verification and signature stands with every product
|
||||
produced and shipped by <strong>nSpec</strong>. <a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DREF.CODE:SeptemberSpe=
|
||||
cial"><span style=3D'text-decoration:
|
||||
none;text-underline:none'>Click here</span></a> to find out more abo=
|
||||
ut
|
||||
our quality.<br>
|
||||
<br>
|
||||
</span><strong><span style=3D'font-size:8.5pt;font-family:Verdana;
|
||||
color:navy'>Service</span></strong><span style=3D'font-size:7.0pt;
|
||||
font-family:Verdana;color:black'><br>
|
||||
We here at <strong>nSpec</strong>, are continuing to advance our
|
||||
excellence to the customer. We provide our customers with 100%
|
||||
satisfaction guarantee on our products, services, and delivery. Our
|
||||
production turnaround time for delivery is around 3 weeks. <a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DREF.CODE:SeptemberSpe=
|
||||
cial"><span style=3D'text-decoration:
|
||||
none;text-underline:none'>Click here</span></a> to find out more abo=
|
||||
ut
|
||||
our service.<o:p></o:p></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class=3DMsoNormal><o:p></o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style=3D'padding:3.0pt 3.0pt 3.0pt 3.0pt'
|
||||
background=3D"http://www.bpfrntln.com/sals/bg.jpg">
|
||||
<p class=3DMsoNormal><strong><span style=3D'font-size:8.5pt;font-famil=
|
||||
y:Verdana;
|
||||
color:black'>The nSpec Family</span></strong><span style=3D'font-siz=
|
||||
e:
|
||||
7.0pt;font-family:Verdana;color:black'><br>
|
||||
In addition to producing the regular peptides, nSpechas the capacity=
|
||||
to
|
||||
offer almost every commercially available peptide modifications. <o:p>=
|
||||
</o:p></span></p>
|
||||
<div align=3Dcenter>
|
||||
<table border=3D0 cellspacing=3D3 cellpadding=3D0 width=3D"80%" style=
|
||||
=3D'width:
|
||||
80.0%;mso-cellspacing:1.5pt'>
|
||||
<tr>
|
||||
<td valign=3Dtop style=3D'padding:.75pt .75pt .75pt .75pt'>
|
||||
<ul type=3Ddisc>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Long Peptide Synt=
|
||||
hesis
|
||||
up to 100-mer <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Fluorescent Label=
|
||||
ed
|
||||
Peptides (such as): FITC/5 FAM, EDANS, TAMRA, Etc. <o:p></o:p><=
|
||||
/span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Multiple Disulfid=
|
||||
e
|
||||
Bridges containing Peptides <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Multiple Phospho
|
||||
Related Peptides <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Symmetrical and
|
||||
Unsymmetrical Multiple Antigenic Peptides (MAPS) <o:p></o:p></s=
|
||||
pan></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td valign=3Dtop style=3D'padding:.75pt .75pt .75pt .75pt'>
|
||||
<ul type=3Ddisc>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Fatty Acid and
|
||||
Isoprenylated Peptides <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Glycosylated Pept=
|
||||
ides <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Regio-Selective C=
|
||||
onjugation
|
||||
of Peptides with Antibiotics, Nucleotides, Proteins, Etc. <o:p>=
|
||||
</o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Biotinylation <o:=
|
||||
p></o:p></span></li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<p class=3DMsoNormal><span style=3D'font-size:7.0pt;font-family:Verdan=
|
||||
a;
|
||||
color:black'>Our state-of-the-art facility and
|
||||
innovative-industrial-processes provide additional services: <o:p></o:=
|
||||
p></span></p>
|
||||
<ul type=3Ddisc>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Purification</span>=
|
||||
</b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - We can employ a =
|
||||
wide
|
||||
range of techniques with our extensive purification facility.<o:p=
|
||||
></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Custom Synthesis</s=
|
||||
pan></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - Custom Synthesis=
|
||||
of
|
||||
Amino Acids & Resins and General Organic Synthesis <o:p></o:p=
|
||||
></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Amino Acid Cartridg=
|
||||
es</span></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - Cost Effective R=
|
||||
efill
|
||||
Service <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Mass Spectrometry</=
|
||||
span></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - Electrospray,
|
||||
Electron Impact, APCI, LC, and Well Plate Analysis <o:p></o:p></s=
|
||||
pan></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Analytical Services=
|
||||
</span></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - Liquid
|
||||
Chromatography, Capillary Electrophoresis, and Amino Acid Analysi=
|
||||
s <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Antibody Services</=
|
||||
span></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - In conjunction w=
|
||||
ith
|
||||
Covance, Inc., we provide High Titer Antiserum at an Excellent
|
||||
Price! <o:p></o:p></span></li>
|
||||
</ul>
|
||||
<p class=3DMsoNormal><strong><span style=3D'font-size:7.0pt;font-famil=
|
||||
y:Verdana;
|
||||
color:black'>nSpec</span></strong><span style=3D'font-size:7.0pt;
|
||||
font-family:Verdana;color:black'> is a privately held company establis=
|
||||
hed
|
||||
in 1993. nSpecis located in San Jose, California and occupies a 18,0=
|
||||
00
|
||||
sq. ft facility for our laboratories and administrative offices.<br>
|
||||
<br>
|
||||
For a FREE catalog and more information about <strong>nSpec</strong>=
|
||||
,
|
||||
please visit us on the Internet at <a href=3D"http://www.nspc.com/"=
|
||||
>http://www.nspc.com/</a>.<br>
|
||||
<br>
|
||||
Reply via Fax, Phone, or <a
|
||||
href=3D"mailto:nspc@rthlnk.net?subject=3DREF.CODE:SeptemberSpeci=
|
||||
al">email</a>
|
||||
with <strong>REF. CODE: September Special</strong> to see how you can
|
||||
start your savings today with <strong>nSpec</strong>! <o:p></o:p></s=
|
||||
pan></p>
|
||||
<pre><span style=3D'font-size:7.0pt;font-family:Verdana;color:black'><=
|
||||
![if !supportEmptyParas]> <![endif]><o:p></o:p></span></pre><pre><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'><![if !suppo=
|
||||
rtEmptyParas]> <![endif]><o:p></o:p></span></pre><pre><b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'>US PHONE</sp=
|
||||
an></b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'>:<span
|
||||
style=3D'mso-tab-count:1'> &n=
|
||||
bsp; </span>408 =
|
||||
517 4223<o:p></o:p></span></pre><pre><b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'>EMAIL</span>=
|
||||
</b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'>:<span
|
||||
style=3D'mso-tab-count:2'> &n=
|
||||
bsp; =
|
||||
</span><a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DREF.CODE:SeptemberSpeci=
|
||||
al">nspec@rthlnk.net</a></span></pre>
|
||||
<p class=3DMsoNormal><img border=3D0 width=3D1 height=3D1 id=3D"_x0000=
|
||||
_i1028"
|
||||
src=3D"http://www.bpfrntln.com/sals/rddot.gif"></p>
|
||||
<p class=3DMsoNormal align=3Dcenter style=3D'text-align:center'><span
|
||||
style=3D'font-size:5.0pt;font-family:Verdana;color:black'>If this emai=
|
||||
l
|
||||
reach you in error, please click here to <a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DRemove"><span
|
||||
style=3D'color:red'>remove</span></a>. If this link is not working, pl=
|
||||
ease
|
||||
reply to this email with "Remove" in the subject line.<o:p><=
|
||||
/o:p></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- Content ends here -->
|
||||
<p class=3DMsoNormal><o:p></o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<p class=3DMsoNormal><o:p></o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<p class=3DMsoNormal><span style=3D'color:windowtext'><![if !supportEmptyPar=
|
||||
as]> <![endif]><o:p></o:p></span></p>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
From dkt@kdku.net Sat May 8 21:00:39 2004
|
||||
Return-Path: <dkt@kdku.net>
|
||||
Received: from kaduku.net ([218.72.106.135])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i495Fd3B021341;
|
||||
Sat, 8 May 2004 22:15:41 -0700
|
||||
Message-ID: <EB4E9B11.9430CE4@kaduku.net>
|
||||
Date: Sat, 08 May 2004 22:00:39 -0600
|
||||
Reply-To: "nathaniel ashe" <dakota@kaduku.net>
|
||||
From: "nathaniel ashe" <dakota@kaduku.net>
|
||||
User-Agent: 8.0 for Windows sub 6014
|
||||
MIME-Version: 1.0
|
||||
To: "wes estvz" <will@example.com>,
|
||||
"jamey koontz" <hb@example.com>
|
||||
Subject: Jsevrgtl bvy V~i_c_o`din 0n1ine For Less
|
||||
Content-Type: text/plain;
|
||||
charset="us-ascii"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Status: RO
|
||||
|
||||
prcc pneumocystis racepoint
|
||||
|
||||
|
||||
And to give you a general idea of what we specialize in:
|
||||
|
||||
Help relieve your pain V~ico.din
|
||||
|
||||
every0ne is app.roved
|
||||
|
||||
L H http://nds.idswthmr.com/wdj/
|
||||
|
||||
|
||||
Give up: http://nds.idswthmr.com/wdj/rm.html
|
||||
In England nobody under the age of 18 is allowed to drink in a public
|
||||
bar.Mr. Thompson used to go to a bar near his house quite often, but he
|
||||
never took his son, Tom, because he was too young. Then when Tom had his
|
||||
eighteenth birthday, Mr. Thompson took him to his usual bar for the first
|
||||
time. They drank for half an hour, and then Mr. Thompson said to his son,
|
||||
"Now, Tom, I want to teach you a useful lesson. You must always be careful
|
||||
not to drink too much. And how you know when you've had enough? Well, I'll
|
||||
tell you. Do you see those two lights at the end of the bar? When they seem
|
||||
to have become four, you've had enough and should go home.""But , Dad," said
|
||||
Tom, " I can only see one light at the end of the bar".
|
||||
The wedding date was set and the groom's three pals, a carpenter, an
|
||||
electrician, and a dentist, were deciding what pranks to play on the couple
|
||||
on their wedding night.The carpenter decided that he would saw the slats off
|
||||
their bed. The electrician figured that wiring the bed with alternating
|
||||
current would give them a few chuckles. The dentist would not tell the
|
||||
others what he had done, and wore a sly grin, simply suggesting that his gag
|
||||
would be a memorable one. The wedding and reception went as planned. A few
|
||||
days later, each of the groom's three friends received a letter which read
|
||||
as follows. Dear friends, We didn't mind the bed slats being sawed. The
|
||||
electric shock was only a minor setback. But, I swear to God Almighty, I'm
|
||||
going to kill the idiot who put Novocain in the K-Y Jelly.
|
||||
dnrre9htmim05kobore,boyaboya aseton.
|
||||
|
||||
|
||||
@@ -1,666 +0,0 @@
|
||||
From wfskr@fstml.us Wed Sep 1 17:37:30 2004
|
||||
Return-Path: <wfskr@fstml.us>
|
||||
Received: from 63.194.242.243 (adsl-63-194-242-243.dsl.lsan03.pacbell.net [63.194.242.243])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i820cVCv002160
|
||||
for <exp@example.com>; Wed, 1 Sep 2004 17:38:33 -0700
|
||||
Message-Id: <200409020038.i820cVCv002160@leggite.example.com>
|
||||
From: "wf skr" <wfskr@fstml.us>
|
||||
To: <exp@example.com>
|
||||
Subject: The wf skr...
|
||||
Sender: "wf skr" <wfskr@fstml.us>
|
||||
Mime-Version: 1.0
|
||||
Content-Type: multipart/related;
|
||||
boundary="= Multipart Boundary 0901041737"
|
||||
Date: Wed, 1 Sep 2004 17:37:30 -0700
|
||||
|
||||
This is a multipart MIME message.
|
||||
|
||||
--= Multipart Boundary 0901041737
|
||||
Content-Type: multipart/alternative;
|
||||
boundary="= Multipart Boundary _EXTRA_0901041737"
|
||||
|
||||
--= Multipart Boundary _EXTRA_0901041737
|
||||
Content-Type: text/plain;
|
||||
charset="ISO-8859-1"
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
X-MIME-Autoconverted: from 8bit to quoted-printable by leggite.example.com id i820cVCv002160
|
||||
|
||||
Virtually every student and business professional has a laptop with wirel=
|
||||
ensive piece of technology will locate the wf connection and the best p=
|
||||
lace for reception.
|
||||
|
||||
Where to buy (eB): http://cgi.eb.com/ws/eBISAPI.dll?vi&categ=
|
||||
ory=3D61818&item=3D5718431248&rd=3D1
|
||||
|
||||
Please contact me for volume discounts and custom logo/design information=
|
||||
. We can do clamshell, bulk or custom packaging. Colors, school logos, =
|
||||
etc. are not a problem and at minor additional cost or free if the quanti=
|
||||
ty is large enough!!
|
||||
|
||||
Thank you, and reply with REMOVE to opt-out...
|
||||
|
||||
-Brian
|
||||
|
||||
reply to wfskr@fstml.us I will not be sending you multiple messag=
|
||||
es on this.... Thanks again...
|
||||
Tuesday, April 27, 2004 | by Eamon Hickey
|
||||
=20
|
||||
keychain-sized device that scans for active wf (802.11b) networks. It's=
|
||||
also handy for measuring signal strength within a given coverage area.
|
||||
=20
|
||||
Gizmodo.com: Best Wi-Fi Signal Finder Yet, 04/22/2004 05:19
|
||||
=20
|
||||
stargeek: Best Wi-Fi Signal Finder Yet, 04/22/2004 05:19
|
||||
=20
|
||||
wf skr, which they designed to differentiate 80211b/g networks from=
|
||||
other devices. Two previous Wi-Fi signal finders fell short in ways the =
|
||||
active scan--but it can tell Wi-Fi from junk.
|
||||
=20
|
||||
ngdgt.com: The wf skr Apr 23, 2004
|
||||
|
||||
ll use ours fairly often). Anyway, Glenn Fleishman checks out a brand new=
|
||||
He says it=92s the best of the bunch and that it should be on sale by Ju=
|
||||
ne.=20
|
||||
=20
|
||||
Wi-Fi skr: Hotspot seeking keychain
|
||||
=20
|
||||
earth, finding wireless access points with the equivalent of a tiny divin=
|
||||
g hotspots and junk interference, something this latest version is appare=
|
||||
ntly much better at.
|
||||
|
||||
--= Multipart Boundary _EXTRA_0901041737
|
||||
Content-Type: text/html;
|
||||
charset="ISO-8859-1"
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
X-MIME-Autoconverted: from 8bit to quoted-printable by leggite.example.com id i820cVCv002160
|
||||
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML><HEAD>
|
||||
<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dwindows-1=
|
||||
252">
|
||||
<META content=3D"MSHTML 6.00.2800.1458" name=3DGENERATOR>
|
||||
<STYLE>BODY {
|
||||
FONT-FAMILY: arial
|
||||
}
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<DIV>
|
||||
<DIV>
|
||||
<DIV><SPAN class=3d3-4><SPAN class=3d7-0><F=
|
||||
ONT=20
|
||||
face=3DArial size=3D2>Virtually every student<SPAN class=3D458063818-1905=
|
||||
2004>=20
|
||||
and <SPAN class=3D450083818-19052004>b</SPAN></SPAN><SPAN=20
|
||||
class=3D101323200-04052004>usiness <SPAN=20
|
||||
class=3D450083818-19052004>p</SPAN>rofessional</SPAN> has a laptop=20
|
||||
with wireless LAN capability, and wants to log anywhere and=20
|
||||
everywhere. This inexpensive piece of technology will locate the Wi=
|
||||
Fi=20
|
||||
connection and the best place for reception.</FONT></SPAN></SPAN></DIV>
|
||||
<DIV><SPAN class=3d3-4><SPAN class=3d7-0><F=
|
||||
ONT=20
|
||||
face=3DArial size=3D2></FONT></SPAN></SPAN> </DIV>
|
||||
<DIV><SPAN class=3d3-4><SPAN=20
|
||||
class=3d7-0><STRONG><U><FONT face=3DArial size=3D2>What it=
|
||||
=20
|
||||
is:</FONT></U></STRONG></SPAN></SPAN></DIV>
|
||||
<DIV><FONT size=3D2><FONT face=3DArial><SPAN class=3d3-4><=
|
||||
SPAN=20
|
||||
class=3d7-0><SPAN class=3d3-4><SPAN=20
|
||||
class=3d7-0>T</SPAN>he wf skr</SPAN></SPAN> find=
|
||||
<SPAN=20
|
||||
class=3d7-0>s</SPAN> wireless hot spot<SPAN=20
|
||||
class=3d7-0>s</SPAN> (<SPAN class=3d3-4>w</=
|
||||
SPAN><SPAN=20
|
||||
class=3d3-4>ithout having to boot-up your computer)=20
|
||||
and </SPAN>finds the strongest wireless (802.11 b/g)=20
|
||||
signal. W</SPAN>hether you're in an airport, <SPAN=20
|
||||
class=3d7-0>coffee shop, classroom</SPAN> or at home,=
|
||||
the wf=20
|
||||
skr will zero-in on the best access point. <SPAN=20
|
||||
class=3d3-4> </SPAN><BR></FONT></FONT></DIV>
|
||||
<DIV><FONT size=3D2><FONT face=3DArial><SPAN=20
|
||||
class=3d7-0></SPAN><STRONG><U></U></STRONG></FONT></FONT>&=
|
||||
nbsp;</DIV>
|
||||
<DIV><FONT size=3D2><FONT face=3DArial><STRONG><U>H<SPAN class=3D72630411=
|
||||
5-06052004>ow=20
|
||||
it works:</SPAN></U></STRONG><BR>Simply point the wf skr in any=20
|
||||
direction<SPAN class=3d3-4>, p</SPAN>ush the button and ho=
|
||||
ld it=20
|
||||
down.<SPAN class=3d3-4> </SPAN> The red lights sweep =
|
||||
back and=20
|
||||
forth<SPAN class=3d3-4>, i</SPAN>f there is a wireless acc=
|
||||
ess point=20
|
||||
within 300 feet, the wf skr will find it<SPAN class=3D331482323-0305=
|
||||
2004>.=20
|
||||
</SPAN> When the red lights stop sweeping and remain lit, you've loc=
|
||||
ated an=20
|
||||
(802.11 b/g) access point<SPAN class=3d3-4>, t</SPAN>he mo=
|
||||
re red=20
|
||||
lights that stay lit, the stronger the signal. <BR><BR></FONT></FONT=
|
||||
><SPAN=20
|
||||
class=3d3-4><SPAN class=3d3-4><SPAN=20
|
||||
class=3d7-0><FONT size=3D2><FONT face=3DArial><STRONG><SPA=
|
||||
N><U>Where to=20
|
||||
buy<SPAN class=3D717052920-06082004> (eB)</SPAN>:</U><SPAN=20
|
||||
class=3D717052920-06082004> <U><A=20
|
||||
href=3D"http://cgi.eb.com/ws/eBISAPI.dll?vi&ctg=3D6181=
|
||||
8&item=3D5718431248&rd=3D1">http://cgi.eb.com/ws/eBISAPI.dll?=
|
||||
vi&ctg=3D61818&item=3D5718431248&rd=3D1</A></U></S=
|
||||
PAN></SPAN></STRONG><BR></FONT></FONT></SPAN></SPAN></SPAN></DIV>
|
||||
<DIV><SPAN class=3d3-4><FONT size=3D2><FONT face=3DArial><=
|
||||
SPAN=20
|
||||
class=3d3-4><SPAN=20
|
||||
class=3d7-0>Please c</SPAN></SPAN>ontact me for volum=
|
||||
e=20
|
||||
discount<SPAN class=3d7-0>s</SPAN> and custom=20
|
||||
logo/design <SPAN class=3d7-0>information</SPAN>.<SPA=
|
||||
N=20
|
||||
class=3d7-0> We can do clamshell, bulk or custom=20
|
||||
packaging. Colors, school logos, etc. are not a problem and at=
|
||||
minor=20
|
||||
additional cost<SPAN class=3D717052920-06082004> or free if the quantity =
|
||||
is large=20
|
||||
enough!!</SPAN></SPAN></FONT></FONT></SPAN></DIV>
|
||||
<DIV><SPAN class=3d3-4><SPAN class=3d7-0><F=
|
||||
ONT=20
|
||||
face=3DArial size=3D2></FONT></SPAN></SPAN> </DIV>
|
||||
<DIV>
|
||||
<DIV><SPAN class=3d3-4><FONT face=3DArial=20
|
||||
size=3D2></FONT></SPAN></DIV><SPAN class=3d3-4></SPAN></DI=
|
||||
V>
|
||||
<DIV><SPAN class=3d3-4><FONT face=3DArial size=3D2>Thank y=
|
||||
ou, and reply=20
|
||||
with REMOVE to opt-out...</FONT></SPAN></DIV>
|
||||
<DIV><SPAN style=3D"FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Arial"><A=20
|
||||
href=3D"http://www.dnncrprtd.com/"><FONT face=3DArial size=3D2></FO=
|
||||
NT></A><FONT=20
|
||||
color=3D#000000></FONT></SPAN> </DIV>
|
||||
<DIV><SPAN style=3D"FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Arial"></S=
|
||||
PAN><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN style=3D"FONT-FAMILY: Arial"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN class=3D717052920-06082004><FONT=20
|
||||
size=3D2>-Brian</FONT></SPAN></SPAN></SPAN></SPAN></DIV>
|
||||
<DIV><SPAN style=3D"FONT-FAMILY: Arial"><SPAN style=3D"FONT-FAMILY: Arial=
|
||||
"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN class=3D717052920-06082004><FONT face=3D=
|
||||
Arial=20
|
||||
size=3D2></FONT></SPAN></SPAN></SPAN></SPAN> </DIV>
|
||||
<DIV><SPAN style=3D"FONT-FAMILY: Arial"><SPAN style=3D"FONT-FAMILY: Arial=
|
||||
"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN class=3D717052920-06082004><FONT size=3D=
|
||||
2>reply to=20
|
||||
</FONT><A href=3D"mailto:wfskr@fstml.us"><FONT=20
|
||||
size=3D2>wfskr@fstml.us</FONT></A><FONT size=3D2> <SPAN=20
|
||||
class=3D072343215-26082004>I will not be sending you multiple messages on=
|
||||
this....=20
|
||||
Thanks again...</SPAN></FONT></SPAN></SPAN></SPAN></SPAN></DIV>
|
||||
<DIV class=3DSection1>
|
||||
<P align=3Dcenter><FONT size=3D3><SPAN style=3D"FONT-FAMILY: Arial"><FONT=
|
||||
size=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><FONT size=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"></SPAN></FONT></SPAN></FONT></SPAN></FONT></=
|
||||
P>
|
||||
<P align=3Dcenter><FONT size=3D3><SPAN style=3D"FONT-FAMILY: Arial"><FONT=
|
||||
size=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><FONT size=3D3><SPAN style=3D"FONT-FAMILY: A=
|
||||
rial"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><STRONG><U></U></STRONG></SPAN></SPAN></SPAN=
|
||||
></FONT></SPAN></FONT></SPAN></FONT></P>
|
||||
<P align=3Dleft><FONT size=3D3><SPAN style=3D"FONT-FAMILY: Arial"><FONT s=
|
||||
ize=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><FONT size=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN><FONT size=3D4><IMG alt=3D"" hspace=3D=
|
||||
0=20
|
||||
src=3D"cid:2183279"=20
|
||||
align=3Dbaseline border=3D0>Wi-Fi Networking News: Crsls wf=20
|
||||
seeker <?xml:namespace prefix =3D o ns =3D=20
|
||||
"urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></SPAN></P>
|
||||
<H1 class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN class=3Dbodytex=
|
||||
tbold1><SPAN=20
|
||||
style=3D"FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">Tuesday, =
|
||||
;April 27, 2004</SPAN></SPAN><SPAN=20
|
||||
style=3D"FONT-SIZE: 9pt; COLOR: black"> | by Eamon Hickey</SPAN=
|
||||
></H1>
|
||||
<H1 class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN style=3D"COLOR:=
|
||||
black"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></SPAN></H1></DIV>
|
||||
<DIV class=3DSection1 style=3D"MARGIN: 0in 0in 0pt"><SPAN=20
|
||||
style=3D"FONT-SIZE: 9pt; COLOR: black"><FONT size=3D2>Wi-Fi Networking Ne=
|
||||
ws has=20
|
||||
this<SPAN class=3d3-4> </SPAN><SPAN class=3D331482323-0305=
|
||||
2004>brief=20
|
||||
report on Crsls Wi Fi skr, </SPAN>a keychain-sized device tha=
|
||||
t scans=20
|
||||
for active wf (802.11b) networks. It's also handy for measuring signal=20
|
||||
strength within a given coverage area.<o:p></o:p></FONT></SPAN></DIV>
|
||||
<H1 class=3DSection1 style=3D"MARGIN: 0in 0in 0pt">
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></P>
|
||||
<H1 style=3D"MARGIN: 0in 0in 0pt"><FONT size=3D4><SPAN>Gizmd.com<SPAN=20
|
||||
class=3D130050304-05052004>:</SPAN></SPAN> Best Wi-Fi Signal Finder=20
|
||||
Yet</FONT><FONT size=3D3>, </FONT><SPAN style=3D"FONT-SIZE: 8.5pt">04/22/=
|
||||
2004=20
|
||||
05:19</SPAN><SPAN=20
|
||||
style=3D"FONT-SIZE: 14pt; COLOR: #666699; FONT-FAMILY: Verdana; mso-bidi-=
|
||||
font-size: 10.0pt"><o:p></o:p></SPAN></H1>
|
||||
<P style=3D"MARGIN: 0in 0in 0pt; LINE-HEIGHT: 12pt"><SPAN=20
|
||||
style=3D"FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: Arial"></SPAN></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN=20
|
||||
style=3D"COLOR: black; FONT-FAMILY: 'Times New Roman'"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></SPAN></P></H1>
|
||||
<H1 class=3DMsoBodyText style=3D"MARGIN: 0in 0in 0pt"><FONT size=3D2>Glen=
|
||||
n Fleishman=20
|
||||
got a hold of the Crsls wf skr, a keychain-sized sniffer to dete=
|
||||
ct=20
|
||||
802.11b/g networks and says it's the best yet:</FONT></H1>
|
||||
<H1 class=3DSection1 style=3D"MARGIN: 0in 0in 0pt">
|
||||
<P class=3DMsoBodyText style=3D"MARGIN: 0in 0in 0pt"><FONT size=3D2>Push =
|
||||
the button on=20
|
||||
signal strength in zero to four LEDs. Keep the button held down and it=92=
|
||||
s a Wi-Fi=20
|
||||
dowser, allowing you to move around and see immediate response to differe=
|
||||
nt=20
|
||||
signal strengths.</FONT></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN style=3D"COLOR: =
|
||||
black"><FONT=20
|
||||
size=3D2><FONT face=3DArial> <o:p></o:p></FONT></FONT></SPAN></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT color=3D#000080>=
|
||||
<SPAN=20
|
||||
style=3D"FONT-SIZE: 14pt; COLOR: #333399; FONT-FAMILY: Verdana; mso-bidi-=
|
||||
font-size: 10.0pt"><FONT=20
|
||||
size=3D4>stargeek<SPAN class=3D130050304-05052004>:</SPAN><SPAN=20
|
||||
class=3D130050304-05052004> </SPAN></FONT></SPAN><SPAN=20
|
||||
style=3D"FONT-FAMILY: Georgia"><FONT size=3D2>Best Wi-Fi Signal Finder Ye=
|
||||
t,=20
|
||||
</FONT></SPAN><SPAN style=3D"FONT-SIZE: 8.5pt; FONT-FAMILY: Georgia">04/2=
|
||||
2/2004=20
|
||||
05:19</SPAN></FONT></P></H1>
|
||||
<DIV class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT color=3D#00008=
|
||||
0><SPAN=20
|
||||
style=3D"FONT-SIZE: 8.5pt; FONT-FAMILY: Georgia"></SPAN><SPAN=20
|
||||
style=3D"FONT-FAMILY: Georgia"><o:p></o:p></SPAN></FONT><FONT=20
|
||||
size=3D2> </FONT></DIV>
|
||||
<DIV class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT color=3D#00008=
|
||||
0><FONT=20
|
||||
size=3D2><SPAN style=3D"FONT-FAMILY: Georgia; LETTER-SPACING: 0.2pt">Chry=
|
||||
salis=20
|
||||
previous Wi-Fi signal finders fell short in ways the skr does not. The=
|
||||
=20
|
||||
displaying the results instant of a constant active scan--but it can tell=
|
||||
Wi-Fi=20
|
||||
from junk.</SPAN><SPAN=20
|
||||
style=3D"COLOR: black"><o:p></o:p></SPAN></FONT></FONT></DIV>
|
||||
<H1 class=3DSection1 style=3D"MARGIN: 0in 0in 0pt">
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN style=3D"COLOR: =
|
||||
black"><FONT=20
|
||||
size=3D2> </FONT></SPAN><SPAN style=3D"COLOR: black"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></SPAN></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN><FONT=20
|
||||
size=3D4>ngdgt.com<SPAN class=3d3-4>: The wf=20
|
||||
skr</SPAN></FONT> </SPAN><FONT size=3D2>Apr 23, 2004</FONT></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT=20
|
||||
size=3D2></FONT> </P></H1>
|
||||
<DIV class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT size=3D2>There=
|
||||
were a=20
|
||||
couple of credit card-sized wf detectors that came out last y=
|
||||
ear,=20
|
||||
signals occupying the 2.4GHz part of the spectrum. He says it=92s the bes=
|
||||
t of the=20
|
||||
bunch and that it should be on sale by June. </FONT></DIV>
|
||||
<H1 class=3DSection1 style=3D"MARGIN: 0in 0in 0pt">
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN=20
|
||||
style=3D"FONT-SIZE: 14pt; COLOR: #333399; FONT-FAMILY: Verdana; mso-bidi-=
|
||||
font-size: 9.5pt"><A=20
|
||||
href=3D"http://www.brdbndrprts.com/shnws/42831"></A><A=20
|
||||
href=3D"http://www.brdbndrprts.com/shnws/42831"><SPAN=20
|
||||
style=3D"COLOR: #333399; TEXT-DECORATION: none; mso-bidi-font-size: 10.0p=
|
||||
t; text-underline: none"><FONT=20
|
||||
color=3D#000000 size=3D4>Wi-Fi skr</FONT></SPAN></A><FONT color=3D#000=
|
||||
000><FONT=20
|
||||
size=3D4><SPAN class=3d3-4></SPAN>: </FONT></FONT><A=20
|
||||
href=3D"http://www.brdbndrprts.com/shnws/42831"><SPAN=20
|
||||
style=3D"COLOR: #333399; TEXT-DECORATION: none; text-underline: none"><FO=
|
||||
NT=20
|
||||
color=3D#000000 size=3D4>Hotspot seeking=20
|
||||
keychain</FONT></SPAN></A><o:p></o:p></SPAN></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN=20
|
||||
style=3D"FONT-SIZE: 9.5pt; COLOR: black; FONT-FAMILY: Verdana"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></SPAN></P></H1>
|
||||
<DIV class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN class=3Dnews1>=
|
||||
<SPAN=20
|
||||
style=3D"FONT-SIZE: 9.5pt; COLOR: black; FONT-FAMILY: Verdana"><A=20
|
||||
href=3D"http://wifntnws.com/archives/003248.html"><SPAN=20
|
||||
style=3D"COLOR: black"><FONT size=3D2>Wi-Fi Networking News</FONT></SPAN>=
|
||||
</A><FONT=20
|
||||
size=3D2> takes a look at the new "</FONT><A=20
|
||||
href=3D"http://wifntnws.com/archives/003248.html"><SPAN=20
|
||||
style=3D"COLOR: black"><FONT size=3D2>Wi-Fi skr</FONT></SPAN></A><FONT=
|
||||
size=3D2>"=20
|
||||
and junk interference, something this latest version is apparently much b=
|
||||
etter=20
|
||||
at.</FONT></SPAN></SPAN></DIV></SPAN></FONT></SPAN></FONT></SPAN></FONT><=
|
||||
/DIV></DIV></BODY></HTML>
|
||||
|
||||
--= Multipart Boundary _EXTRA_0901041737--
|
||||
|
||||
--= Multipart Boundary 0901041737
|
||||
Content-Type: application/octet-stream;
|
||||
name="retail.jpg"
|
||||
Content-ID: <2183279>
|
||||
Content-Disposition: attachment;
|
||||
filename="retail.jpg"
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
/9j/6wJgRVBTAHic7ZjJigIxEIbn/Z/EiwfxoHjQgyfB5aKg4oKouIH7goow
|
||||
UPAdDJPpZKxMO0N/l5+mO92V6qSWfHwkJCT8d87ns+hmsxGtVqui5XJZNJVK
|
||||
ic7n8y/HX69X0VarJZrJZJ7G9fv9EGYHYzqdimI/mk6nRYvFomilUhFtNpui
|
||||
+Xxe1Jw/yv16vf40LpvNiv4VP2Hvcrn0GsfzzJvr2+327Tju4793YzabiRYK
|
||||
BdHJZBKLHcPhMJbvDgYDUeZvrnvWC/tFi6h1Y0J8Ox6Pqnas12tR1/nzn06n
|
||||
k6odJp1OR/R+v3uN6/V6Kt/fbreixE3iHvvD9/9pcblcvJ4nv0Gj0VCxI5fL
|
||||
icblh8ViIcq+0IL4/iqs39CMRiNRbT/YiCs//BWIi6vVKsj749pv2lBva8M+
|
||||
IK+Hej/5kvxIXW0qcdK3PqaPCYV2PUrfQJ3gWx9QV+CvKLTitA3sob/05fF4
|
||||
iOJnrXqJ/d9ut799jv7Et37ytaNUKv1oPH7xjWfUM/QttVpNlDxI/WfLU4fD
|
||||
4el6PB57fd8X376Bde26XogTtrrdjEfcJ451u90vvw9a9bQN7HCNj5zr2NYN
|
||||
72OezJv97Lre8D/7iPeZ5wb7/d7pfa/iGq/N8wlgv9DPaNdxvucp2rj2pZyP
|
||||
sU52u50ofvmtOjoufOM1ceS3/ELfHRf0+VHgj9B+0erXtWB/kXdthM4b1Ffk
|
||||
g3eDvGM7T7fZHeXXKDjPe/d4Rh4mX3FeEhW/8aurn+gD+Q/v7pdXwa9mvWdT
|
||||
4jv/4b+cL7jCOqB+QUOfbyckJCTExSfQUQHQ/+AAEEpGSUYAAQIBAGAAYAAA
|
||||
//4AJkNyZWF0ZWQgYnkgSW1hZ2VHZWFyLCBBY2N1U29mdCBDb3JwLv/AABEI
|
||||
ASwBkAMBIgACEQEDEQH/2wCEAAcFBQYFBAcGBgYICAcJCxMMCwoKCxgREg4T
|
||||
HBkeHRwZGxsfIy0mHyErIhsbJzYoKy8wMzMzHiY4PDcxOy0yMzEBCAgICwoL
|
||||
FwwMFzEgGyAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx
|
||||
MTExMTExMTExMTExMf/EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkK
|
||||
CxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
|
||||
wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZ
|
||||
WmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz
|
||||
tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6
|
||||
AQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsRAAIBAgQEAwQHBQQEAAEC
|
||||
dwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEX
|
||||
GBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5
|
||||
eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ
|
||||
ytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+kaK
|
||||
KKACiiigAooooAKKKKACiiigCK6/485v9w/yrnBXR3X/AB5zf7h/lXOVnMaD
|
||||
8KWkpagYopeKaKdTELxRSUtABS0lLQAUtJRQAtFJRRYBaPak7UdqLALxRSUd
|
||||
qACiikpALSUUnSiwBSUZpKACm0uaQ0WASkpaSkMQ11lcma6ytKYmFFFFaCCi
|
||||
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIrr/jzm/3D/Kub
|
||||
rpLr/jzm/wBw/wAq5us5jQUtJUsETTzLGvU96SQDBS9q249Pt40+ZA2OpNRy
|
||||
Q24QlYBgd6pQEZNFaPkRTKoWH7w4ZAf59KQaUrEg+YMd9w5p8gGfS1e/slcZ
|
||||
xLx23jmmnScchZD7eZ0o5AKdFWzpDdAGPuZTxTDo8xGAij3Mzc/pRyAQUVP/
|
||||
AGPOR9yMEdB5zHP6Un9jXGMhYgf7vmtj88UcgXIe1HSpv7FuByPJ56gu3FL/
|
||||
AGHMDjdFj1y2aOQLkGaSrA0OUnBkjA7EbqX+w5T1kjH0Lf40cgXK1HarP9hy
|
||||
7s+an5t/jTToc4PyyRkZ7swxRyBcr0lT/wBh3X3fMjxjht7Z/Kk/sS7wTmIE
|
||||
dAJW5/SjkAgpKlOmXMa72VBjjaJXx+eKng06aIhzbhww6CTO388UuQLlKkq9
|
||||
DFGXnUYDqOQ6/d9OKz53kjbDhAT0wODRyBcWkpiSb1zjFPrNqwxDXW1yVdbV
|
||||
0wYUUUVoIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAiuv
|
||||
+POb/cP8q5uukuv+POb/AHD/ACrm6znuNBV7SB/pZ/3TVA9K0dHH+kufRKI7
|
||||
gaVxJtAUfkKigTzmLEq0GMAddx75pty7CRioY47YqWdSkEcEGELHaMDoO9ao
|
||||
kc9zbwkI0irjoKadQtAB+/U5OOOaWKyt4lwIlJ7lhkmphGigAIoA9BRoBAb6
|
||||
3HHmH/vk0h1G2A++3/fB/wAKsbV/uj8qNq+go0GVTqlqDje2f9w0h1W1UgEv
|
||||
/wB8GppJQnQYqubog9cUWAf/AGnbkZAkI9kNH9pQAgbZef8ApmazJPEunxKz
|
||||
NcsVU4LxozLn6gEVXfxtoUfDaiAfQq3+FAGyNWt2TcEuCB/0xb/Cj+1IdpYQ
|
||||
3OB/0wb/AArnLjxlpclvNNHq8SRRA/u0cebIfQA8gfhXO2njuKK6Lm9vGVj9
|
||||
xyGVfz5/Wk2kI9FGqwn/AJZXI+sDD+lSLfxuuRFPj3jIrnF8f6EgVLi9MUpA
|
||||
yhjc4/EDFO/4Tzw6ScarHx14bj9KYHQHUIwB+6n54/1RpRfIWAEM/wD37NVL
|
||||
LV7W/t1mtLqKaNhkNG4Iq0LjnG6gY77YAceTN/3xS/axj/Uzf981JHIHFPpA
|
||||
VJNQjRfmt7gj0ERNRLf2pP8AqbiMHuY2UVo0nanoBUktoLy1xFKwydyyK2SD
|
||||
WDPH5hmjkXDRkjPv/wDXH862Zs2eqwOjBYrjKOv+11BH60moQM9xvUgDaM0C
|
||||
ObgY5Ix1qyOlReUI55FHQGpV6VjNDQlddXImuup0xsKKKK0EFFFFABRRRQAU
|
||||
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUARXX/AB5zf7h/lXNV0t1/x5zf
|
||||
7jfyrmqznuNAa09FH7yU+wrL71q6L/y2/D+tEQLMob7TlMDkZ5qWYgXduvqW
|
||||
/lUMwH2jO4/fXiluJQmpWqkgZz/KtUSSXMhjdMNjrQLtAPmIrH1vUbaJwJJ1
|
||||
QgEjnk1xeoeJQVPlXQZR2AppaAehza3aQttMgB9Cay7vxbaxcBhn2NeX3evS
|
||||
OMqzM2P73WsefXGOV38n3/pRZAemX/jmKH7vI9+K56/8bSTpIkcgG8bMHPQ9
|
||||
a88m1VlYneP+AjFZdxqjY+WRs9aAOk1GW8vr5jcEtsOxRyQoHYe1ReRMo+RG
|
||||
qhaeN7y0Zf8AR7aRAgXDJ6Drmr0fxQu1BH9l6ecDrsbP86jlAv6bptxdyASo
|
||||
wWtxvCmI98bPn0rlU+KupbsLY6cgH/TNv/iqX/hbWthfltbAfSNv/iqXKM07
|
||||
zSrq3ztDHHtWNLNdwtgpIMfWnN8WNcY/8e1gR7wn/wCKprfE7UpIyr6dprZ/
|
||||
i8o8f+PUcoHXeCvEGyC4tLyNtpZTFKo+dHPHBrdtfHyBzDLIC6naTngkV5PN
|
||||
451KeNkihtbbd1aCPDD6Ek4/CqdtqcqoPnyPfmrWwrH0Ba+NrX+PKmtyw8S2
|
||||
d2PlnX8a+fLHWpNoBIx6HofyrZtbyZ+Vl8v2BosB7/HeRSAFSCPWpldWHFeS
|
||||
aL4gubRsPMGQ8ZY13mk6yt5GoLLux0FFhlnXiqfYZT1S4BWrN+sZkUsVzt7j
|
||||
ms/xFMv2G24588D6cGruqCMPE7A5wQMH6UCM1442huHRNpGO+e4qqtWZJT++
|
||||
QgAFRj3FVV61lMaFNddXImuuogNhRRRWggooooAKKKKACiiigAooooAKKKKA
|
||||
CiiigAooooAKKKKACiiigCK6/wCPOb/cb+VczXTXX/HlN/1zb+Vcx2rOY0Fa
|
||||
2ifdn+o/rWRWvof3JvqKIiH3UqpOp2jd5i8Z9xWXqN+rapbyKeF64/Grmpys
|
||||
nRekg5x2rm55AViOex/rWyJZxvjy9m+327CZR8r9T15FcVNqDLnc4zn+E1t/
|
||||
EmbyruxYKCdrdfwrhpboMuWUhqFsM1JL7cAMkLjjmqktzu6ufzptoqyvFLIR
|
||||
5WcYIPzeo61o3Ediuwx2ygd8MT/OqUbptB5GFJM23apOPrVUyE+9duttZLaI
|
||||
psrRmZc7nXnn8azYNNsZZmMlshVQMknaCScDAyO/cnFP2ctPMLo5RpB0IqPc
|
||||
A3cD1rqrvSCLeWXToINqbmMbqCcDhsFhnI7g4x15FZsIjTTY3+xxS7VJdiCT
|
||||
1PvWkcPzaJkOdtzIRv3mMblBp24EnHA7c9Knl1GBGZFsIVbpkKeP1pdQN35C
|
||||
maCKNM8bNmf05qXRSV7jUr9CqXx6cd6A47HFQjJU4IxUeXXkZxWBZdD89TU6
|
||||
OVHUcVUtAk1xHHNL5aM2C4XO0fSu+b4W6hKJF069guniuGglVh5e0jbyM9R8
|
||||
4ppAcpFckY2gAita11B2wueB2yRVvSfAeo397cRebAq21wLeUo285PcDpjkc
|
||||
kitSL4a658rGayIxniQkqME88eimnYQWN6q7QxY+x/8A112OgaqLeRGVlxnH
|
||||
DVhH4f6tbmLZdWg4VXLORhycEDrke/6VFeaRe6MYDKVdW+86IxCtuYYJOOfl
|
||||
NMD1fVLpbnRbeQDP79efwNdDqRxFEQoY5wPUcV5VoOqvcW5tHkyA6uF/Tj86
|
||||
9Uv2P2aHacEkfyqWBz9ywF22DjK5x6UgpL1sXmNv8PJoHSspjQ8111ch2rr6
|
||||
KY2FFFFaCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIrv
|
||||
/jym/wCubfyrmK6e7/48pv8Arm38q5es57jQnatfRGCwzE8fMKyDTo7qSAAJ
|
||||
naWyQO9EBMs6y7iAFXGN+evXrXOSOMIcdj/WtnWpI/ssRJbJfgAdPlNYEr5C
|
||||
jFaks83+J74ubDB52OP1FcCzgnmu0+KUh+3aeOmEc/qK4oCOOLzJF3ZxW1Cj
|
||||
Kpe2yBtI2dO1G0FrHbXSKpQOA5ztZWGCDjkeoIzg9QR01mjguYVKqjI2NxyA
|
||||
Om0nI45HUDPtiuU+02skaq0O0AdagtZZ+Vh3kg8FTirhGMXZy0aKlBtLlV2d
|
||||
fc29vLfCUbD6EtUEloBbSqH/AHTHJwc8DB59Og/KsCSTVYx5rSz7Qc8SE4/W
|
||||
q7vd6lmKMSyt3y2cVSrxs5SltsEsPVUlDkd2acl6sNrKyz+ZKzS/dORlxhiT
|
||||
06dhms1J3itInU5AU8HoeTTn069srFjJbsVySWUg44p8enXM+h/alCCONDnJ
|
||||
54Jp0sbh4QUnJbNfPohzy/FObjyPv8u5BLrLSxMhhgGRjiJBj6cVHfscD60a
|
||||
foeo6lE0lrb+ZGvBYsAB+dadt4a1nXkLWtniMHHmO4AP09fwrmeY0Iwn7WaW
|
||||
nkL6pVbi4xZz6thTzjigOe546Vr6n4R1rR2iW7tCqysER1YFST0GR0/Grkvw
|
||||
88TW93BbPpjtLPnYEdW6YySQcDqOtcP17DWT9otdtV0LdOa0aMrRVsn1+xj1
|
||||
Bitk06CdgcYTIzz9K7+ax8KyCS5h8Tyw+Yskgt0mJCsCCoJI3cgeh5AriTp9
|
||||
34Z8X29vqNks01vNG8ltw+8cHbxkHI/nXWya/pi63YXOm+Ep4JrG6Mk4WPBI
|
||||
wTtIA49eemOOK6ac4zjzRd0yGrF99O8Gec5i8V3ex5GJzJ0wPlJOM+nOD1x2
|
||||
qKybw6uuTp/wkN5aWhtk8qZGLbmZcOp+XPUn8AfWpZL7T4WiRfAM8ZAjZmiR
|
||||
ZNy43FfukdCCT97jBqxqmoQmC4sE8AukjRukUiRh/LLDcCCq8kBvXjA96uwi
|
||||
vJZeFF06a6tNevJJY4TIULYywICryo5O7tnG01zdrqchi8oOxQncVDHGf8k1
|
||||
kz2l3ZGMXNvLAZFDp5iFdy+oz1FPt5xG38J+tIZ6L4Mu1k1qOHaOcD6c17JP
|
||||
qHmyLbnG0Pw3fp/+uvCPAN35niy0jOAWzwB7GvXo5WXUiM5j3kOufrj9aGLq
|
||||
WL0sbxQoG3bxmlXpUN8f9JQg4G3pnpUq9KymUh/auwrjweK7CiAMKKKK0EFF
|
||||
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQ3f/HlP/1zb+Vc
|
||||
vmuou/8Ajxn/AOubfyrlqznuNB2qN2IAx68U/tVebqADRETJtYlP2a3AjUkv
|
||||
ySP9k1hSEnb06Vs6x532O3AYhA3r1G01hvuCDJzWhLPMPikA17Yf7j/zFcTD
|
||||
P5ahXUkCu1+KKFr6x29o2/mK4iO5jKgSRZx3FdmEny3alb9RS9C2Ire4iBVc
|
||||
EcEgYIqWJI4tNZRIY8/eYD3qobtY4tsCYz3NR2941upjlUPG1TiJRltv5HpY
|
||||
StThL3uxoWFxaWquDdtIrdip4q1bxwx6M7LMYkc5MijJHNZ8NzYIdy2rMfTP
|
||||
FSWmpfZDLbzxB4jk7TxtryK9GUlePc9jD46jTahUa2aVr6X7vf7i3p99p9gr
|
||||
q+oNKr/wsh4rQ02OGbw5NHv2QMXG49lz/hVOws4r+XfYaFNLg4Mj/LGp92Jw
|
||||
K6ODw/PFpM1ndzWdsZA3HmZxn8MfrXHVwtSavBO91vY6qePo07RnKLSjK1r9
|
||||
baXfco6mksPh62i07aLN2VZHXrtJH862PEsOmQafaW19qM9jbDIUQxkhsAdc
|
||||
DtTdFt9L0vTnsbvVBPEeNuxeAeo+8a1oH0OawFnqd0t5CvCF4QDjtk7uvuMV
|
||||
w1MsxUZJqN1GTd01d3669UcNTHUKkW07XitNdLdPQy4vEnhweFTo66pNdyDA
|
||||
iaWF87t2VGcdjitX4n+JtW8OW2nHSrnyDOzh22Kx4xjqDjrSXFjpCadLb6Ba
|
||||
6aJJxgs8uHxntgN/MVg/EeXWNehtFbQZoBalmLRyCbg46henTvXNSyeTxdOT
|
||||
pvku2+ble67LzPLrVk4tX18jhotV1bWfGFrfPItzqTzxhC8YIZgQFyoGCOB2
|
||||
r0T7N4+0rXL/AFIzafBcXUYabjcrJEqjcBg9mA9eTx1ryoHZeOULhgwKsowR
|
||||
/hUx1jU2JJv7rAOcmVs5xj+VfXwhGEVGKskcG56sbf4i2k8e7UtPV4FWIjeD
|
||||
gPtXLYHGNi8nHt1qPTbj4h6tcXkEWoWYfT5/JdJU2gttPYrgjGT839a8rXUL
|
||||
47Qb2fAxgeaeMdKDqN8lpLbLdTeRK4kkQMcMwyMn35NUFj07VfAfibW4bVr6
|
||||
/smmt0MS5XYNg27cELkn58YIGK5fxP4Z/wCEXuLaF7xbh5kLErGVA54wT14r
|
||||
kftU5JJlkz1J3GnCeRsFizY45PSi4Hd/DyVR43sAOnz/APoDV7KCE1ncG+YS
|
||||
tx69a8K+HU23x5YAjnLjj/cavcXKjWnHIPnNt+uTSewupdvyDOhc/Nt5qaP7
|
||||
oxVW+G2VASD8vBFWIsbBj0rOZSJhXY1xorsqKYMKKKK0EFFFFABRRRQAUUUU
|
||||
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQ3f/HjP/wBc2/lXK11V5/x4z/8A
|
||||
XNv5VylZzGg7VXmIDj6VY7VVuMbqIiYurRoYLbMgzvyBj/ZNZEigADPatbVG
|
||||
iCW4wxbd36D5TWU+DJWhLPLPikxW/slH/PM/zrhFQkHOK774mqG1az4yoiPf
|
||||
3rhN4LEKOKa2GQtgLxURYmvSofh5pOoaVpaQaq8OrXtutwIpCGUrhy2FAyMB
|
||||
eOec4pH+E7JYfvL+OOQO7mc7ivlCJZBlMZDYPr+HenYDzmCXY55A4ru/CGk2
|
||||
EttPrepBXiQsI4nOQSo689eSAB069cYrN8VeA/8AhFtOgnfUBNO91JbsoTai
|
||||
7QCDuPqCOP8ACqlitybGNftMJhg6ASeuT/jV0VGVRQb3CakocyR1l1qWoXOF
|
||||
MpgjI+WOLjavpnrVUQ+pLE9yetdD4Z0i21/TmurrUIraOAhXXGZH/wB0Vu/Z
|
||||
vDOnKRFYyXjBM77iU8n02rjFfSxVCi+WELteX6s8tupPWUtDhxCiIWIGAM8i
|
||||
mxbJoydoBHY1vXHiaQ/Jb6Rp8KdAPskbf+h0638UlFbz9D0yQ+v2VAf/AB2u
|
||||
jmqW+H8TK0e5zUsC5xgCmpdXdowMNzImP4c8flXWSaz4XvP3eoaQbNjwJ7Vy
|
||||
uPwbg1n6z4bji006npl+l5YhgG3DZImTgZXuMkcis3GjUfLVhZ+a/VFXnFXh
|
||||
Izp7PT/FWnXRdUg1uBd6yjjzh7nvzjOegORgAg+cFNiASqeCeM13NxaCGO7K
|
||||
sRJFCpyP9p1Qj8mritWPlahcRMRuSVgT7g187jaUaVVxhsejQm5wTkUecnFG
|
||||
T70xQSetTKVGBjNchuIqkngCnhSOODSlgVGBj2FCYz1waAOj+HpKeP8ASsDr
|
||||
KR/46a94nYjWpBj/AJbnn8a8F8Ckp480j3uVH58V7vcE/wBsyHt5p/nUvYXU
|
||||
v3xBaIqpC4IGanhP7tfpUF6xJjLLg4IxipYWBjXjtUTKROK7OuLFdpRTBhRR
|
||||
RWggooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCG8/48Z/+
|
||||
ubfyrk66y8/48J/+ubfyrk6znuNAelVZz89WTVSc/vDilETDVZQVgURrwTyP
|
||||
pWVIRn04rV1VpykOQdnP8qx5mwDxWhLPJvitPs1ayUf88j/OuFjuOeOK7T4q
|
||||
Ef2xZggf6k/zrgx7ULYZqrf3HmROJ5A8QAjbecoB2HpSy6jeuHY3k53Elv3h
|
||||
5JGDn8KzBJjGalWQMKYxZ726uFZJrmV0LbyrOSC2MZ+tXNNkZdsYJCtyR64q
|
||||
iVBOas2BxdovoP611YP+NFea/MyrfA/Q7nwreGG8mj5IYAYrqdQMn2UZljQf
|
||||
3VOD9K47wwXXUJmQDhRnP1rT1G6k87DYUei/419XWpOckoyseRTmox1VzRiX
|
||||
ThCxkf8AeEcDBqSzNiyMJnAOMAEVzyTCRsHJ/wCBH+lK52Dcpb/vo1yyy2lJ
|
||||
NOT1ZssVJWslodHZWNtdyFM457c8VJo2nQ2/iy3syQ0E0gUx4wp5A6VzttdO
|
||||
HBWU5B79fzFdJpEs7+LdIlfBQ3EYz/wICk8POlzPnvHl28xe0jO2lnc5iY7r
|
||||
bU2PU26E/wDf+OuD8QEjxLqa+l1KP/HjXoMrQxRaoJo2YCAcK2P+W8ftXHeI
|
||||
5tOPijUsWcxb7XJuYTjBO9skfL9PyPrx4WZSarPS/wDwyO/CK8bXH+FvCU/i
|
||||
WG/kguUj+xxiQxhGeRwT/CqjJA7+laUPww8WStAF0sjzk3qWlQADj73Pyn5h
|
||||
wfWrPw0sNXv9auBok1vZSRQ+Y1zPAspQ9PlJB2k5P4Dvit7Q7zxlqmoajbz6
|
||||
qIZtNgAlDWKSPKhIABG3LcYPNcSd0dLVnY5TxD4F1Dw3plnf3JBinQbwwCmO
|
||||
QlspjPONvX3Fc6ABxivTdY0LxrrOmrZJdJeaf5UcypIkMOCVZwFA5zjd0wex
|
||||
GK5bxB4Ju/DnhmDUr+VFuJLnyGtlIYoNgcEkHg4PSmIreDm2+NtH4/5e4/8A
|
||||
0IV7vcAjVXYHjzOlfPvhKfHjTSCP+fuL/wBCFe/znOosQcHfUvYXU0r4uPL3
|
||||
nJwe9S25zCnHGBVe8GFiw4brzU1sT5CZ9KzmUi0DxXa1xI6V21OmDCiiitBB
|
||||
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAEN5/x4T/9c2/l
|
||||
XJV1t7/x4XH/AFzb+VciKzmNC9qpTn96QKuE1QnP75h70oiYupKQYiXU8HgH
|
||||
6VlTd61NRMe+EKW3YPXp2rLmyWYVbJPIPisf+JxZf9cT/OuCzxgV3vxYGNas
|
||||
h/0xP864HpQthjgfloDEd677RPAmj6n4O0+9uNVe11K/laG3RiCjOHVQNuM9
|
||||
GyTnjFOm+EuoQPNE2oW5nSAzpAqnfIAzKQoOM/cz9COKqwzghI2Kuaad10P9
|
||||
0/zrpPG/gaHw3YW+o2V35lrK0cTRPnejtErnnABHJ/SsDSLYmJrjIwhCY+uT
|
||||
/SurBfx4+q/Mxr/w36HT6A2Lqc89B061Y1i5eJkEURZmYIqk4yar6A22edgO
|
||||
cCjVnP2i3LEZMw4/CvsZfGeKvhK//EyDHD2kZ9Pmb+lDPqSj/XWbj0O8f0qX
|
||||
zeTSq/qCa05BXEs7qYzGKaEIwXcCrbgwrr9KfbrGksCxP2iM4J6fMK5O2wdR
|
||||
QKmf3RP6iur05wb/AE9+AFmjzxjowrmrr3X6GlMyPEP+j3evR4+6pXH0uI64
|
||||
jX8f8JJqRIHN1L/6Ea7bxgANV8RY9X/9KY64PxJIB4m1MZ6XUn/oRr5fHu9T
|
||||
7vyR6uGXulvQ/Feq+G3lfS7oQmXbvBjVwSpyDhgeQehqGTxVqjzalIbn59SB
|
||||
F0di/vMtu9OOfTFYfmjbt6VGzH0rhOg6yP4heJII4o49UZUiVVQCNOAqlR2/
|
||||
usR+NVda8X63rthDaajqD3EEbBlRlX7wG0EkDJOOOa5sORTw3HUj2poDc8LO
|
||||
R4t0gg9LuP8A9CFfQs5H9ptk4O4Zr5z8OyBPE2mNj7tzGf8Ax4V9FXGP7SYn
|
||||
++KmQupqXYAjiCsSMnqKmtMi3T6VBeMHjjwoUAkcVLaf8e6c1nIpFxTXb1wy
|
||||
13NOmDCiiitBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
|
||||
EF7/AMeFx/1zb+VcjXXXv/IPuP8Arm38q5AVnMEKelUZhulJzyDV09KoyY81
|
||||
ue9KIMTUXRpYVWMKcNzn6Vmy/eNamptOZIBICEw2OPpWVL95qtiPIviyD/bV
|
||||
l/1xP86XwZ8O4vFHhm/1CaeWOZCUtFRlAdgMtnPYZXPTgk9sUfFUj+3LMf8A
|
||||
TA/zNcpaatqGnwNHZ39zbxtyyQysoY+4Boi9BpHZeEvBsHiPS7OefV5rfZqn
|
||||
2REWX5QCm4mPg/NkD24rZsPh9rT3kb6h4iu5bWeI+ckU7htrI7oNx4bocj3r
|
||||
y+2vb2GJBb3M0aK/mBUcgBumeO+O9K2q6kqRIL66CR5Ma+a2Fzwcc8VWgM7H
|
||||
xf4UuPDXhC2ur3UJ7u8a8EbK5JhAMIYYB6kA4yPp2rndMaSfTXlwiosioVRQ
|
||||
MnDYP6frWZd315cWccNxdTypGRtR5CQvHGB9KfpUsiv5QYhDyV7Ejp/M104K
|
||||
KeIi/NfmZ15NUmvI6rRJNkkoGByDUmsqJJbd17SjI/CodDIE0h9xzWnqNr9o
|
||||
t8RvskVtwOM9q+yk7TPEirxMgHnpzU8ZBIBNRLY3m4k3MBwO8R/xqT7HeqoI
|
||||
ubcg8f6o/wCNbOSISHLIiaqgCn/UnnPvXRWM4Q2zFflEinBPXkVgWFlI12ZZ
|
||||
5Fd8bRtXAArUysBUHsQcVzVUmrGkdNRfHimLXfEakfxSEf8AgRGa8z8SuT4q
|
||||
1Qg8fapP/QjXp3xMkUeJNbK8Bx/7UjNeW+ITnxNqRz1uZP8A0I18ljHefyX5
|
||||
I9ehsZ+c0ozjFIBg0/FchuAA9KCM9KVR6U/bjGRSHYs6S5TWbNv7syH9RX0n
|
||||
M2b9iB/EK+bbVwlzBgDiRT+tfR5YGZiB3HNJi6mxebjDEXGDnjjHFPs8eQuD
|
||||
61HdZWGPcwY57HOKdZkeQPqf51MxouCu7rgx0rvKKYMKKKK0EFFFFABRRRQA
|
||||
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQXv/IPuP+ubfyrjxXYX3/IO
|
||||
uP8Ark38q44Gs5ghSeKoSEea3+9V09KoO375hj+KkgYaigWeE+ajHa3Cn/dr
|
||||
Nl6tWhqBiFxDs37tjdcY6rWdIRlqsR5H8Vv+Q3Z/9cP/AGY1wRcgc9K7z4q/
|
||||
8hqz/wCuJ/nXAP0pIuOxPDcmNBipBdbiQVBqipwo/lSgkGqGWxIHd81Pph/0
|
||||
v2waz1fBIzV/S/8AX5x2rswC/wBoj6o58T/DfodRpEvltKfcVsedGyt1OR1H
|
||||
auesWwZB712Oh6RqFnfwS3lg/wBkmwjF8DhuBn05I619diZqnHmZ49CHO+Uw
|
||||
d7FXI6Y61JHI/wC7jxjnNdf9jtLW1d1sgJNOQwyszqwaRgoUkfUmtTVfsWmv
|
||||
bRzJH9onneNXFpG5YjaBknGMZ6gVw08w59OQ6auEVPaVzzm1uMXJ3cDnvUrX
|
||||
I3sgOQDwaseJbT7P4tv4lOESUgHAHb0AArLZgZRtHOMfWvRVpx5u6ON3TsXf
|
||||
iTceZrd5IMYdQePqleea3h/EF847zuf1rsvHTk3QJ6lFP/oNcTqB36nct6yH
|
||||
+dfH45WqNen5I9nD6xIZVVXwOmBSdqV23NnPYU30riOglQc4BzUj/dXgcVCh
|
||||
xTmdcYFAyaEgSxn0Yfzr6PVskntkV82Rtgr9RX0fC52ZxxgH9Kl7Evc3LnYL
|
||||
ZAhLfNzke1SWZHkDjuainZGt02JtAPPOc8U+0P7r8TUyGi4CMV31efrXoFOm
|
||||
DCiiitBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAEF9/y
|
||||
Drj/AK5N/KuNHSuyvv8AkHXP/XJv5VxYrOYCk8VnOf37f71aB6Vmyf69uf4q
|
||||
SAW/eNriERxBSEbJyT3Ws6Q/e4rT1FpzPD5iFV2Nj5cf3azJM5arYjyP4rkD
|
||||
WbL/AK4n+dcAzfLXoHxWQtrNmR/zxP8AM150+4DFJFrYcn3BS55qJX2qKTzO
|
||||
aqwXJB1NaWk/8fH/AAGssHitTSR+9J/2P6iu3L/94j6nPif4bOi08gM+SRzX
|
||||
oqeJ9CM0U1+Bfzq6bZRa+W4Udd/OG7ce1eb2iusbMY2COflbHBxVjkkEA/lX
|
||||
11ahGra72PFhUcFoeijxPpW9t9xE1x5e2O6EMmVG7OGOd3Pt0qQeKdBbykl8
|
||||
ssDIxkjhYKuWUkBT/eAPPUV52OnINIwHoa5/qFPuzT28ux6LdeJ9H8i8dJbS
|
||||
WQxP9mDW7Myk4wp3LjHH0rzue4aa8eZwNzks20ADJPYDpTQh7Bqjm/dLuYHL
|
||||
cCt6OHhSTUepE5ue5V8Wz+d5L9flA/lXKS/PO7dyxroNecPHCoPRa50/fP1z
|
||||
XyuYq1eXr+iPXwr9xDcCk9qcVxzSY9BXn2OkTNJnilpCeMUAPQ8gD1r6PtiT
|
||||
AjZ6qD+lfOETsj5VipPHB7V9G2hJtIiDyY1PH0qXsJ7nQXMjNaIQioA2OBjP
|
||||
FPssiE59TTbsTi2TzifvcAnpxS2nEZwf4qmQ0XAa9BrzwGvQ6dMGFFFFaCCi
|
||||
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAK9/wD8g25/65N/
|
||||
KuLB4rtL/wD5Btz/ANcm/lXFdqzmAE8VnSf69v8Aeq+TxWfKR57D3pIBdQRl
|
||||
uIS0qv8AI3Rs/wB2s9+rc1dvhEs8OyQsdrfw4xytZ7nlvrViPKfis5XWLID/
|
||||
AJ4n+dcA4V4zxzXd/Fk/8Tmy/wCuJ/nXAbuKSNFsRCImMMKhPBq2pxGB7VFJ
|
||||
HxlRzVJktDA3y1qaRIPM+dtiDqxBx9KyCPlFWbK5ktZN0YUgjDIwyGHoa2o1
|
||||
XSmpx6GdSCnHlZ2a6hG1vEjXW+JB+7TJwgPJGO3NPinimbbG+4+grlJ9RkvS
|
||||
MwxReWMDylxn61WRZ5plhRmy5C4B616LzafY5Vg49zu4Skyjy5N3uOR+lOmZ
|
||||
II2d2OFGTkEVnWMP2CNrRZg7wnaxHY9cU3UrtrXT3mkRZRkDY/RvY170ZRdD
|
||||
23TlucDTU+TzLUOp2sqbkmU46ru5FSi9tHT52XHuc1zt7p9jcaMmsaRugZGC
|
||||
XFvuJ2H1B9DVWzKT27/a5pFAjYgqAfmAO3Oe2a8JZs7/AA/id/1RdyxrlzDN
|
||||
dH7OQURQOBgVkZ5HrROZEEYLfKVDAVGGIxXn4iu60+ZnTSpqEbImJ5xSZAqN
|
||||
mO7igNWBqOYg8YpuR3pM80vGaQDkI3CvomwIOnQnpmFT/wCOivnQcMK+iNPY
|
||||
f2VATwPIU/8AjopMXU6WaMRwKPMRzn+E9KfaY8s4/vVFOIVhUI7Oc85XFPtD
|
||||
8hx61EhourXolecqa9Gp0wYUUUVoIKKKKACiiigAooooAKKKKACiiigAoooo
|
||||
AKKKKACiiigAooooAr3/APyDbn/rk38jXEdq7fUP+QZc/wDXJv5GuHrOYAel
|
||||
UJ8ecfrV09KoTn98aEA2+eNpYQkQQ7Wyck56VnueWrSvzcFoDLnZtOOntWY/
|
||||
3mqhHlHxZ/5Clif+mTfzrz7PFeg/Fj/kKWH/AFyb+dedk4ojsWth4+6MUmeK
|
||||
aGwKYW5pgKU6U5AQRQMECgYB4pkksP3HPvitfwreQ2PiuwuJ4leNZMENjGSC
|
||||
AfwJB/CsZDiL6mu0+GngOXxvrUqOzR2duuZZV4IJB24/EUpbCbsYsF2+n6zd
|
||||
W92rKzykkkdDmk1u7F3AFjJMYPJxXaeObbw63iGDRZbgx6hYxCKa+jTKyHnh
|
||||
gO4GOfXI6AAUz4d8O29mfP8AEiTgjiO3t2LH2OcAfrXZHMav1f2HQx+rwc/a
|
||||
HN6DEq+F9enlbCeWiIp7sW/pj9ay4WBgdParmtX6eXHpllE0NjC24Bj80jf3
|
||||
mrMhf5setcS7m45mE0cYYY2Jt+vJpjRDbkelLGMZFPb7hpgivINrkdqTbxwK
|
||||
dLy+fbtTOQKBi0CmjOaeM4wO9IYDqK+htNIOiwE5x9mXP/fIr58TaFIK5J6H
|
||||
0r6C0vA0G3JXI+zLx/wEUmSzpJ/I8lRFvznndipbXHl/jUM8kbKoSIJz6k1N
|
||||
a8R/jUyGiyK9IrzcYr0inTBhRRRWggooooAKKKKACiiigAooooAKKKKACiii
|
||||
gAooooAKKKKACiiigCvqH/IMuv8Ark38jXC9q7nUf+QXdf8AXFv5GuFzUSAD
|
||||
0qhcH9+1XSaoXP8Arj9BSQmNvFjDQFZdzYPG3HaqTfeb61au5I/9GCxYOSN2
|
||||
f9mqjnDNVMDyb4tNjVbAf9Mm/nXnh5FegfFw/wDE2sP+uJ/nXnobihbFIMn0
|
||||
pMUuaWmMUdKUUoXjpRiglirxHj3Ne7fBqXT9K8HXrzXyw3M7+bgngKBgZ/HP
|
||||
5ivGLawa70yaWHDSQnLJ3x6/59/Smx6pfWoZY7qVMpsbDHlcYx9MUOzJauX3
|
||||
mk1DVbrUZvv3ErSc+5zU4GAcVVsMi0QH649K0VjBQNkD1oKMzVbR5lSSNMkc
|
||||
HFZ01nNaeQ0q4E0YkT6ZI/pXSBgxCIQaj1y48/SbKGSGJBa7kSRR8zgnOD7A
|
||||
k0COcTuak6jFNXhcCtzw5ZSXzXkUVrBO5iwPNONpz1Bxj88fUUxnPONuPpUZ
|
||||
r0iDTbg2wUeHNNkZcBd8yEtjHPH59f65qWugXdrHJDLodlKMsSJLlMrkjHPX
|
||||
j69O1Kw0cEOtOrv7TToWmu4l0GwRocKxlnOMYJJHHI9/pWUvgvUL5pLuBLaG
|
||||
BzuRDMMLk8L+AP6UrDOXA5r6E0fI8O2hwD/oqcH/AHRXhF5YyWNw8EwAkQDO
|
||||
DkcjNe9aGG/4R6yK/e+zR4x/uihiZ0E0pk2gxov+6uKmtxiP8ahnMx8vzSxG
|
||||
Plz6VPAP3QqJAiYCvSa83Ar0inTBhRRRWggooooAKKKKACiiigAooooAKKKK
|
||||
ACiiigAooooAKKKKACiiigCtqP8AyC7r/ri/8jXB54rvNR/5BV3/ANcX/ka4
|
||||
AGokA4niqN1/rPwq2TxVK5+/+FJALdtOIYA64jPT5cdqosOScVaulASAiVW/
|
||||
2Rn0psVlc3EMrQoWC4zg9Pw79KqxJ4z8XB/xN7ADOPJP8688A5r33xh4Oi8S
|
||||
6aF81YruLJibqM+h9q8qm+H3iGGQobEtjujAihO25SOZCjPJI+lKBiuh/wCE
|
||||
G8QDk6dJ+lA8Ea//ANA6X8qLjuYSnAprEiuhHgvXgOdNm/Km/wDCFa9/0Dpf
|
||||
youDMS1vJ7O5WeByrD071pWq2mqTnzWELnoBgAmrY8Fa7j/kHSflTv8AhCtc
|
||||
J40+QU7oRL9jlgXJhcqOhXlfzFEcm7gRMXJxtAzmli8L+J7cjybedSPQ1K+h
|
||||
+MZUKsk5U9RupAJLdi0T/SFSP/Y/i/8ArVgX1+97NuIwg4Va1D4L8RO257CR
|
||||
j7kU4eCde/6B7/mKLoDABwMVe0y8s7SSRrywF2rLhVMjJtPrxWj/AMITr3T+
|
||||
z3/MUh8E6/njT3/MUXKTF/tzRBMrL4eAUZOPtT/z/wA9vxRdf0wXMztoiNDI
|
||||
EHlmU5XaD0bGeTgn6Un/AAhOv/8AQPf8xTv+EI1/H/IPf8xRzDuhW8QaRuLR
|
||||
eH4o23qwJmZuAQSMHjnGPxqxH4m0zB3eH4TnkqszBc4wSF5A/pVf/hCdeA50
|
||||
9/zFC+DNf6DT3p3C6K+rXunXcEIstPNrKM+ZiQsp9Ote2aArf2Bp6N8rfZ4x
|
||||
zxj5RXnnhr4dXsl7HcasixwociEHJc++Ogr1BIxbpmTCKMDjtSZLfY0Jl2eW
|
||||
d6tkdj0q1Af3QqpKqAoEfd+GKswnES1EgRYB4r0mvNAeK9Lp0wYUUUVoIKKK
|
||||
KACiikJxQAtFNLhRkkCq4vDKWEERk2nBI4H60AWqKqfarnfs+xvnGeox+ecV
|
||||
JFcF3KPGUcDO00AT0UUUAFFFFABRRRQAUUUUAFFFFAFbUv8AkFXf/XF/5GvP
|
||||
s16DqX/IJu/+uL/yNeeZqJAKTxUW2KSUq23IGfmJFPNRsaSYD3jjaNUaRdi9
|
||||
BuOB+lS297b2lrLCI1bzBgtlsiqTHioHbjinzAOlW2Lkgj/gRP8AQVWkWD/n
|
||||
pCPxb/CmyNxVSU1PMIc6Wv8AFcR/QBv8KryR2x+7cQge+7/CoZKgYUcwE/l2
|
||||
4/5eof8AvljTCLMHm7X8ImP9arstRlaXMBcBsO9y/wCEB/8Aiqd5mnD/AJby
|
||||
f+A//wBlWfto49KOYZoiXTx/y3f8bb/7KgPp+f8Aj4f/AMBv/sqztwHalDj0
|
||||
o5gNPdp+eJ2+n2c//FU4tppHDtn/AK5N/wDFVliQelOEg9KOYDSAsT0mI/4A
|
||||
f/iqeEsu0+Pqp/xrMDinBhRzAaQjtz0uox9Vb/CnrHFji8t/xD//ABNZysKe
|
||||
CKOYRoiKM9bq3P4sP5rUq28R6TQH/toBWauM1OmOKOZDN/TjZ2brK8cMzD+F
|
||||
pV20kyR3M7uFQBmyVEi4rJjIzVqMinzBY0DBE2N3BHpIo/pSRY2DHT3OagQi
|
||||
plOBxSbuOxMDxXp1eXg16hVUwYUUUVoIKKKKACqmpXDWti0qjkVbqG7hE9s0
|
||||
ZHBFAFZ7W1ji33dwWBx8zvtH4Yps7s9gh0to0Qv8zjACjv1/Cq9u3m6cYpBm
|
||||
Wzbv3X/9WfyqNI4JC9w8BlPmeXFCvRmxnJ/D+VAD/t8kVg0S3iz3Och0XIA+
|
||||
vQ1bjlMotLjAzIm1iPX0/nTRGQqpd/YokPSILyB7HI5/CgW/2Oz2MQVSbMXP
|
||||
UH/9ZoA0aKKKACiiigAooooAKKKKACiiigCtqX/IJu/+uL/yNefY4r0HUv8A
|
||||
kE3f/XF/5GvPe1TJANYVC2fSrIAIpNoPapsIoPn0qB8+lahiU9qaYUI6UrDM
|
||||
ZgfSoHQntW4bePH3aabaL+7SsI55oSR0qI27eldIbaL+7QLaLH3aVgOXNo56
|
||||
Cm/YpMdDXV/Zov7tKLaL+7TsByX2GT0o+wS+ldeLaL+7S/Zov7tKwzj/ALBL
|
||||
/dpPsMv92uyFtF/dFH2WL+7RYDjfsUv92k+xyf3a7T7LD/cpPskP9yiwWON+
|
||||
yyf3aBbOP4a7D7HD/cpps4f7tFgOTELgfdNOETD+GunNnD/dpptIc/dpWA5x
|
||||
VYdqeu4djW8bSHP3aT7LEB92iwGOrsD0q1FKeOKu/ZYs/dpRBGOgp2GMjk4q
|
||||
wj8UwRKBwKeFAoAkDV6pXlIAFerVcAYUUUVoIKKKKACkNLSGgDKuAbHU47oc
|
||||
RP8AJJ7D1qe2ihsd9uLtd0rEopIyOOMetXGVWGGAIqA2FqUKiCMA9QFxQBQG
|
||||
lTNEUkSEMfvysSxPvU1uiTzRrFlra3XahP8AEfX/AD71N/Z1uQAwd1H8LuWH
|
||||
5E4q0qhVAUAAdhQB/9k=
|
||||
|
||||
--= Multipart Boundary 0901041737--
|
||||
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
From bownrdstrm@attb.com Sun Jun 6 07:52:37 2004
|
||||
Return-Path: <purgcrw@attb.com>
|
||||
Received: from leggite.example.com ([207.111.254.118]) by snacker.example.com
|
||||
(Netscape Messaging Server 4.15) with ESMTP id HYW65I00.GCU for
|
||||
<exp@example.com>; Sun, 6 Jun 2004 07:41:42 -0700
|
||||
Received: from accfd8ce.ipt.aol.com (ACCFD8CE.ipt.aol.com [172.207.216.206])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i56EpkRt007759
|
||||
for <exp@example.com>; Sun, 6 Jun 2004 07:52:03 -0700
|
||||
Received: from [220.15.207.252] by 172.207.216.206 with dazzle SMTP;
|
||||
Sun, 06 Jun 2004 08:52:37 -0600
|
||||
X-Authentication-Warning: ryder ancestral
|
||||
Date: Sun, 06 Jun 2004 08:52:37 -0600
|
||||
From: "Stphn Hand" <bownrdstrm@attb.com>
|
||||
Reply-To: "Stphn Hand" <resceflblb@attb.com>
|
||||
Message-ID: <3749823059370.835538001008932913@chckwll>
|
||||
To: exp@example.com
|
||||
Subject:
|
||||
References: <168425683841079245159@duke>
|
||||
In-Reply-To: <7406146144666267721836@prevalent>
|
||||
X-Mailer: silicic leafy
|
||||
Content-Type: text/html;
|
||||
charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
<html>
|
||||
|
||||
|
||||
|
||||
<body>
|
||||
|
||||
<p><br>
|
||||
</p>
|
||||
|
||||
<p align="center"><a href="http://www.cFZ.phrnw.com/tp/indx.asp?ID=w"> </p>
|
||||
|
||||
<p align="center"><img src="http://www.zP6.qwmeds.com/wlt.gif" border="0"></a></p>
|
||||
<p><br>
|
||||
<br>
|
||||
<br><br><br><br>
|
||||
<br><br><br><br>
|
||||
|
||||
To say adios muchachos head on over to go to: pharmnw.com/host/emlremve.asp<br>
|
||||
|
||||
|
||||
<br><br><br><br>
|
||||
broach glutamine gurkha disciplinarian brawl atypic ridicule dandy hereof difficulty yourself satellite courtney alicia elude mcleod consist dunedin charlotte shoe bequest aluminate handlebar nebular bent booty shutout concision algonquin more connector tuple barge downriver denebola urgent caleb gordon shield prima perhaps dar dreg weir ecuador edible broke compactify circuitry forsook fiske moscow tall influence alterman mountain such excuse railbird caw
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
<br><br>
|
||||
ghana managua ptolemaic ritter tina aden travel wang morn someone cocoon apparatus manchester crime daniel florin aile handicapped effort hairy poodle allegation doubloon basis fantasia windward chisel brink bibb fashion aspire farcical sorority eastward callahan cyrillic thoroughgoing awoke thyrotoxic adopt dial simultaneous zeiss partisan elm commission eat ornately drumlin grandeur shields awaken meningitis aren't equipped intractable dwarf behest featherbrain
|
||||
shell vacationland disseminate regurgitate decolonize jules methodology beverly drowse cried earl applied storeroom cattle revved kim sharp frizzle bevel continua hangable rhodonite carcinogen bodybuild dusenbury acapulco pine stormbound ark suspension katz fabulous lend lilly matthews firewood groggy gallop
|
||||
apocalypse break valois emporium flown cookbook jeff fanout nathaniel mollify royalty twirl whittle amethystine ladylike plywood terpsichorean analyses avocate basis hemingway aluminate gladiolus levin polymer arkansan diagnostician danielson augustus deplore rachmaninoff assyriology model alexander importune civic sprite concise haughty wean peripatetic shove booky sonny book lyric presence cruz boisterous buttercup sidelong breed distributor
|
||||
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
From ladymrs@hotmail.com Wed Feb 4 15:18:52 2004
|
||||
Return-Path: <ladymrs@htmal.com>
|
||||
Received: from psszone01 ([220.85.210.40])
|
||||
by seagrss.example.com (8.12.8/8.12.8) with SMTP id i1501w8m026266
|
||||
for <exp@example.com>; Wed, 4 Feb 2004 19:01:59 -0500
|
||||
Message-Id: <200402050001.i1501w8m026266@seagrss.example.com>
|
||||
From: ladymore <ladymrs@htmal.com>
|
||||
To: exp@example.com
|
||||
Subject: =?euc-kr?q?(=B1=A4=B0=ED)=B9=CC=B1=B9=C1=F7=B9=E8=BC=DB...=B0=C7=B0=AD=BD=C4=C7=B0=B0=FA_=B4=D9=C0=CC=BE=EE=C6=AE_=C1=A6=C7=B0=B8=A6_=BC=D2=B0=B3=C7=D5=B4=CF=B4=D9._@?=
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/related;
|
||||
boundary="def67978-b4e7-4853-987a-b20e2bc5050e"
|
||||
Reply-To: ladymr <ladymrs@htmal.com>
|
||||
Date: Thu, 05 Feb 2004 08:18:52 +0900
|
||||
|
||||
This is a multi-part message in MIME format
|
||||
--def67978-b4e7-4853-987a-b20e2bc5050e
|
||||
Content-Type: text/html; charset=euc-kr
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>spam_mail6</TITLE>
|
||||
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; charset=3Deuc-kr">
|
||||
</HEAD>
|
||||
<BODY BGCOLOR=3D#FFFFFF LEFTMARGIN=3D0 TOPMARGIN=3D0 MARGINWIDTH=3D0 =
|
||||
MARGINHEIGHT=3D0>
|
||||
<TABLE WIDTH=3D595 BORDER=3D0 align=3D"center" CELLPADDING=3D0 CELLSPACING=3D=
|
||||
0>
|
||||
<TR>
|
||||
<TD COLSPAN=3D2>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_01.jpg" ALT=3D"" WIDTH=3D595 =
|
||||
HEIGHT=3D24 border=3D"0"></a></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD COLSPAN=3D2>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_02.jpg" ALT=3D"" WIDTH=3D595 =
|
||||
HEIGHT=3D51 border=3D"0"></a></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD COLSPAN=3D2>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_03.jpg" ALT=3D"" WIDTH=3D595 =
|
||||
HEIGHT=3D161 border=3D"0"></a></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_04.jpg" ALT=3D"" WIDTH=3D173 =
|
||||
HEIGHT=3D166 border=3D"0"></a></TD>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_05.jpg" ALT=3D"" WIDTH=3D422 =
|
||||
HEIGHT=3D166 border=3D"0"></a></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_06.jpg" ALT=3D"" WIDTH=3D173 =
|
||||
HEIGHT=3D163 border=3D"0"></a></TD>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_07.jpg" ALT=3D"" WIDTH=3D422 =
|
||||
HEIGHT=3D163 border=3D"0"></a></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_08.jpg" ALT=3D"" WIDTH=3D173 =
|
||||
HEIGHT=3D163 border=3D"0"></a></TD>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_09.jpg" ALT=3D"" WIDTH=3D422 =
|
||||
HEIGHT=3D163 border=3D"0"></a></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_10.jpg" ALT=3D"" WIDTH=3D173 =
|
||||
HEIGHT=3D170 border=3D"0"></a></TD>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_11.jpg" ALT=3D"" WIDTH=3D422 =
|
||||
HEIGHT=3D170 border=3D"0"></a></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_12.jpg" ALT=3D"" WIDTH=3D173 =
|
||||
HEIGHT=3D170 border=3D"0"></a></TD>
|
||||
<TD>
|
||||
<a href=3D"http://www.ldymr.com" target=3D"_blank"><IMG SRC=3D=
|
||||
"http://www.ldymr.com/ad_mail07/imgs/mail7_13.jpg" ALT=3D"" WIDTH=3D422 =
|
||||
HEIGHT=3D170 border=3D"0"></a></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD COLSPAN=3D2>
|
||||
<IMG SRC=3D"http://www.ldymr.com/ad_mail07/imgs/mail7_14.jpg" WIDTH=3D=
|
||||
595 HEIGHT=3D114 ALT=3D""></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD COLSPAN=3D2>
|
||||
<IMG SRC=3D"http://www.ldymr.com/ad_mail07/imgs/mail7_15.jpg" WIDTH=3D=
|
||||
595 HEIGHT=3D113 ALT=3D""></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD COLSPAN=3D2>
|
||||
<IMG SRC=3D"http://www.ldymr.com/ad_mail07/imgs/mail7_16.jpg" WIDTH=3D=
|
||||
595 HEIGHT=3D115 ALT=3D""></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
<table border=3D0 cellpadding=3D0 cellspacing=3D0 width=3D595 align=3D=
|
||||
"center" style=3D"font-size: 9pt; line-height: 150%">
|
||||
<tr>
|
||||
<td>=B1=CD=C7=CF=C0=C7 =C0=CC=B8=DE=C0=CF=C1=D6=BC=D2=B4=C2 =C0=CE=C5=CD=B3=
|
||||
=DD=BC=AD=C7=CE=C1=DF=BE=CB=B0=D4=B5=C7=BE=FA=C0=B8=B8=E7, =B8=DE=C0=CF=C1=D6=
|
||||
=BC=D2=C0=CC=BF=DC=C0=C7 =BE=EE=B6=B0=C7=D1 =C1=A4=BA=B8=B5=B5 =B0=A1=C1=F6=B0=
|
||||
=ED =C0=D6=C1=F6 =BE=CA=BD=C0=B4=CF=B4=D9.<br> =B8=DE=C0=CF=BC=F6=BD=C5=C0=BB =
|
||||
=BF=F8=C7=CF=C1=F6 =BE=CA=C0=BB=B0=E6=BF=EC <a href=3D=
|
||||
"mailto:ldymr@nvr.com">[=BC=F6=BD=C5=B0=C5=BA=CE]</a>=B8=A6 =B4=AD=B7=AF=
|
||||
=C1=D6=BD=CA=BD=C3=BF=E4.. =B0=A8=BB=E7 =C7=D5=B4=CF=B4=D9. If you feel that =
|
||||
this information is not what you want, please click [HERE] requesting to be =
|
||||
removed. Thank you, and we apologize for any inconvenience.</td>
|
||||
</tr>
|
||||
<tr><td> </td></tr>
|
||||
</table>
|
||||
</BODY>
|
||||
</HTML>
|
||||
--def67978-b4e7-4853-987a-b20e2bc5050e--
|
||||
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
From tiffany21action@hotmail.com Mon Feb 23 06:25:12 2004
|
||||
Return-Path: <mmimcha@hotmail.com>
|
||||
Received: from e.com (ns.lefco.co.jp [210.162.221.66])
|
||||
by leggite.e.com (8.12.8/8.12.8) with SMTP id i1NETCVg022171
|
||||
for <en1k@example.com>; Mon, 23 Feb 2004 06:29:12 -0800
|
||||
To: <en1k@example.com>
|
||||
From: "jesph" <tffn21ctn@htmal.com>
|
||||
Date: Mon, 23 Feb 2004 14:25:12 GMT
|
||||
Message-Id: <1077546312-23378@excite.com>
|
||||
Sender: krn1crrll@htmal.com
|
||||
Subject: Super Cheap V-!-A-G-R-A!!
|
||||
Content-Type: text/plain;
|
||||
Status: RO
|
||||
|
||||
Starting at $2.50 a dose!!
|
||||
|
||||
http://prescrbdmds.com/gv/indx.php?pid=eph9106
|
||||
|
||||
Isn't $2.50 worth it for you and your lady?!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
rufus bobcatelliot jared amanda1 nautica sarah1 japan
|
||||
metallic metallicgray chance wolfMan
|
||||
oranges young philip
|
||||
|
||||
|
||||
@@ -1,239 +0,0 @@
|
||||
From ycruhaztbxo@yh.com Mon Aug 30 20:22:16 2004
|
||||
Return-Path: <ycruhaztbx@yh.com>
|
||||
Received: from localhost (localhost [127.0.0.1])
|
||||
by smtp.example.com (8.12.11/8.12.5) with ESMTP id i7V4RAvY010450
|
||||
for <exp@localhost>; Mon, 30 Aug 2004 21:27:10 -0700
|
||||
Received: from snacker.example.com [207.111.254.120]
|
||||
by localhost with IMAP (fetchmail-6.2.5)
|
||||
for exp@localhost (single-drop); Mon, 30 Aug 2004 21:27:10 -0700 (PDT)
|
||||
Received: from leggte.example.com ([207.111.254.118]) by snacker.example.com
|
||||
(Netscape Messaging Server 4.15) with ESMTP id I3AH9K00.F2I for
|
||||
<exp@example.com>; Mon, 30 Aug 2004 19:22:32 -0700
|
||||
Received: from 207.111.254.118 ([211.53.120.209])
|
||||
by leggte.example.com (8.12.8/8.12.8) with SMTP id i7V2THZe005873
|
||||
for <exp@example.com>; Mon, 30 Aug 2004 19:29:20 -0700
|
||||
Message-Id: <200408310229.i7V2THZe005873@leggte.example.com>
|
||||
X-Mozilla-Status: 0001
|
||||
X-Mozilla-Status2: 00000000
|
||||
FCC: mailbox://ycruhaztbx@yh.com/Sent
|
||||
X-Identity-Key: id1
|
||||
Date: Mon, 30 Aug 2004 23:22:16 -0400
|
||||
From: Kimberly Murdock <ycruhaztbx@yh.com>
|
||||
X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; uuencode=0
|
||||
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)
|
||||
X-Accept-Language: en-us, en
|
||||
MIME-Version: 1.0
|
||||
To: exp@example.com
|
||||
Subject: re[15]
|
||||
Content-Type: multipart/related;
|
||||
boundary="------------040805020002040802060003"
|
||||
|
||||
This is a multi-part message in MIME format.
|
||||
--------------040805020002040802060003
|
||||
Content-Type: text/html; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
<html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body bgcolor="#FFFFFE" text="#1BDDE2"><p><IMG SRC="cid:part1.04080303.03020805@vmcva@html.com" border="0" ALT=""></p><p><font color="#FFFFF0">aren't you? Jessica Alba Nostradamus in 1851</font></p><p><font color="#FFFFF7">Stephen King Easter</font></p></body></html>
|
||||
|
||||
--------------040805020002040802060003
|
||||
Content-Type: image/gif;
|
||||
name="radon.GIF"
|
||||
Content-Transfer-Encoding: base64
|
||||
Content-ID: <part1.04080303.03020805@vmcva@html.com>
|
||||
Content-Disposition: inline;
|
||||
filename="radon.GIF"
|
||||
|
||||
R0lGODlh4wGPAfY9AAABAICAAMDAwMDcwKbK8EAgAGAgAKAgAABAACBAAGBAAIBAAKBAAMBAACBgAGBg
|
||||
AIBgAMBgAOBgAOCAACCgAMCgAMDAAAAgQCAgQEAgQKAgQMAgQCBAQEBAQGBAQIBAQKBAQMBAQOBAQEBg
|
||||
QGBgQIBgQKBgQMBgQOBgQCCAQECAQGCAQKCAQMCAQOCAQACgQCCgQECgQGCgQICgQKCgQMCgQOCgQEDA
|
||||
QGDAQIDAQODAQCBAgEBAgGBggGCAgICAgKCAgMCAgOCAgGCggICggKCggMCggOCggEDAgGDAgIDAgKDA
|
||||
gMDAgODAgIDggKDggMDggODggGBgwECAwGCAwGCgwICgwKCgwMCgwOCgwGDAwIDAwKDAwP/78KCgpP8A
|
||||
AP//AAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAQAAAAALAAAAADbAYoBAAf/gGKC
|
||||
g4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusiF9fna+trq+whLW2s7q7vL2+
|
||||
prjBwpy4sbm7smK1gsnLlcm/0dLT1KXQhdea2dWUx823x5Lb3OTl5ueD48ye6uiK4+2T8e709fbW4bfs
|
||||
+feH8PzPAPYbSLCgPIGf5g38RwyhwYcQIyrj5zCgRHD+KkJSeLGjx3LwwDmbmC2YoWYjSXpbFg7lyGLp
|
||||
YDYyKRKmsJUpJzK7xvGjz5+9tglteTJXyZVF02HcCS0nUaaMeOZjiC2mrWFSgWrdKu1mzp1KseFcClZs
|
||||
2LIxya47i5ZWUrVp//WpbaeRq927oYZmhDW171y/bVsilatT5Lu9cAMLNiqwLt7HkC+FRPz23WCyX+Nq
|
||||
xnkzkbqslVUOa1s1sunTmyZnXL0I9N+vR9n21GyWNu15dFHr3n0wEuyKrm2rrB1XsG+AwW87zM27uXPP
|
||||
CJ/GPvk3tGHhsoxTd8uatGJ/wtk+H++crjer15Unbkq8MMbF2ymXDi91anjy+MkzX2s7pXbvTV3mXmIk
|
||||
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
|
||||
aC7Nar7m0Nzmbu7McB7nzDzndK7Mdn7ner7nfN7nfv7ngK4WA4CuMfCoge7MBcWth57MBcWl0Oqni54p
|
||||
yWBJLCgDbdqtSUBBkX4Xk06Q4bqsy6Or1OdDZrjpMvGurVlHXACt03d5SlDqph4OqG6tp6RgvMetrU7q
|
||||
7frnAeMNhAnqOvSPS1BQSYDrt67rsc4u8Ipgq059rUfsxq56rg7rhx6n4opjtp56SaAeqlXsrD7qr77r
|
||||
vm3td2Ltm6qbhv5zKxHt4E7tLE7uW+AkKFlvzY6sm7Hu3255yN7n8L4e8x6Y0J7v77fvaN7vOIKS4m5v
|
||||
AZ/vl4eC0v6E6ntt8I2AksA+sAsv8M6+0RKvCQqT8Jp38d+e7tm88UXdBexOAdpM8pM9AI7Oe296zSpf
|
||||
3qqlSvb+yzGf7P168zifrzq/85nZ8z5/lkAf9N34nPFO9DwPrkt59Ehvr7Dq8U0vau9a8VGPi1Nf9Zlp
|
||||
9Fjv9EwJ9VvPZgXi9V8/9mRfG4EAACH+dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
|
||||
bGdsemJvd2xucnVhbndidXlpdWdxdmF0eGd1cmhqd3FueWpnZm5mZWZkADt=
|
||||
|
||||
--------------040805020002040802060003--
|
||||
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
From mri-srvce@fstmal.gr Mon Aug 2 08:53:44 2004
|
||||
Return-Path: <root@77qq.net>
|
||||
Received: from 77qq.net (S0106000f662071da.vc.shawcable.net [24.81.14.82])
|
||||
by leggite.example.com (8.12.8/8.12.8) with ESMTP id i72Ft8gE010695
|
||||
for <exp@example.com>; Mon, 2 Aug 2004 08:55:21 -0700
|
||||
Received: from 77qq.net (77qq.net [127.0.0.1])
|
||||
by 77qq.net (8.12.10/8.12.10) with ESMTP id i72FrjjM013257
|
||||
for <exp@example.com>; Mon, 2 Aug 2004 08:53:45 -0700
|
||||
Received: (from root@localhost)
|
||||
by 77qq.net (8.12.10/8.12.10/Submit) id i72Frib7013231;
|
||||
Mon, 2 Aug 2004 08:53:44 -0700
|
||||
Date: Mon, 2 Aug 2004 08:53:44 -0700
|
||||
Message-Id: <200408021553.i72Frib7013231@77qq.net>
|
||||
To: dcl@example.com
|
||||
Subject: =?ISO-2022-JP?B?TVJJGyRCRDQ6OiVsJV0hPCVIGyhCIHZvbC4zOBskQiEhKCFGQ0pMSEco?=
|
||||
=?ISO-2022-JP?B?IRsoQg==?=
|
||||
MIME-Version: 1.0
|
||||
From: mri-srvce@fstmal.gr
|
||||
Reply-To: mri-srvce@fstmal.gr
|
||||
Content-type: text/plain;
|
||||
charset=JIS
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
|
||||
$B(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(B 4,313,786$BItH/9T(B $B(,(B
|
||||
|
||||
MRI$BD4::%l%]!<%H(B vol.38$B!!(!FCJLHG(!(B
|
||||
|
||||
$B(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(B
|
||||
$B"":#2s$N$b$/$8(B
|
||||
$B"#IW!"?M:J$G$"$k$3$H$rK:$l$?$$%*%H%J5^A}Cf!*(B
|
||||
$B!!!|%5%$%H2q0w$XEEOC<h:`!*!!40A4F?L>$G8l$i$l$?%*%H%J$N%[%s%M(B
|
||||
|
||||
$B"#:G8e$K$O$d$C$Q$j!"%^%a$JCK$,%H%/$r$9$k(B
|
||||
$B!!!|=P2q$$%3%_%e%K%F%#%5%$%H4IM}?M$@$+$i$o$+$k!":#$N%[%s%H(B
|
||||
|
||||
$B!&!&!#!&!,!z!&!#!&!&!#!&!,!z!&!#!&!&!#!&!,!z!&!#!&!#!&!,!z!&!#!&!&!#!&!,(B
|
||||
|
||||
$B(.(,(,(,(,(B $BIW!"?M:J$G$"$k$3$H$rK:$l$?$$%*%H%J5^A}Cf!*(B $B(,(,(,(,(/(B
|
||||
$B!!!!!!!!!!!!!!!!!!!!(Bhttp://7qq.net/mrs/1/
|
||||
$B(1(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(0(B
|
||||
$B%5%$%H4IM}<T$N6(NO$G!"F?L>$r>r7o$K8==w@-2q0w$X$NEEOC<h:`$N5v2D$rF@$F(B
|
||||
$BD>@\<h:`$7$^$7$?!#$*$H$J$N=w@-$,<g:E$9$k=P2q$$%5%$%HN";v>p$D$-$G$9!#(B
|
||||
$B!!(B $BFbMF$O%3%A%i(B-----------http://7qq.net/mrs/1/
|
||||
|
||||
|
||||
$B(.(,(,(,(,(,(B $B:G8e$K$O$d$C$Q$j!"%^%a$JCK$,%H%/$r$9$k(B $B(,(,(,(,(,(/(B
|
||||
$B!!!!!!!!!!!!!!!!!!!!(Bhttp://77qq.net/mrs/2/
|
||||
$B(1(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(0(B
|
||||
$B!!%5%$%H4IM}<T$H$N!"%a!<%k$G$N#Q!u#A$G8=:_$N=P2q$$%3%_%e%K%F%#>u67(B
|
||||
$B96N,K!$J$I$rD4::$7$^$7$?!#<c<T$N=P2q$$;v>p$rLVMe$7$F$$$^$9!#(B
|
||||
$B!!!!FbMF$O%3%A%i(B-----------http://7qq.net/mrs/2/
|
||||
|
||||
$B"#(B------------------------------------------------------------------$B"#(B
|
||||
$B!!!!;d$I$b!JM-!K=P2q$$D4::%7%9%F%`$G$O!"J@<RFH<+$N%3%M%/%7%g%s$d(B
|
||||
$B!!!!@:1T<h:`?X$K$h$kD>@\$N<h:`$K$h$C$F!"3'$5$^$K$*4+$a$G$-$k=P2q$$(B
|
||||
$B!!!!%3%_%e%K%F%#$N>R2p$r$7$F$*$j$^$9!#(B
|
||||
$B"#(B------------------------------------------------------------------$B"#(B
|
||||
$B!!!!J@<R$G$OK\%[!<%`%Z!<%8$N@.$jN)$A!"J@<R$N9M$(J}$K$4;?F1$$$?$@$1$k(B
|
||||
$B!!!!9-9p<gMM$rJg=8$$$?$7$F$*$j$^$9!#$*5$7Z$K$*Ld$$9g$o$;$/$@$5$$!#(B
|
||||
|
||||
$B!!!!!!!!!!!JM-!K=P2q$$D4::%7%9%F%`!!(B
|
||||
|
||||
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
From dlvry@hosy-r.mn.nu Mon Apr 12 00:25:51 2004
|
||||
Return-Path: <dlvry@hosy-r.mn.nu>
|
||||
Received: from leggite.example.com ([207.111.254.118]) by snacker.example.com
|
||||
(Netscape Messaging Server 4.15) with ESMTP id HW1R7A00.G23 for
|
||||
<exp@example.com>; Mon, 12 Apr 2004 00:23:34 -0700
|
||||
Received: from hosyou-r.mine.nu (p1061-ipad402marunouchi.tokyo.ocn.ne.jp [222.146.113.61])
|
||||
by leggite.example.com (8.12.8/8.12.8) with ESMTP id i3C7QYBl032246
|
||||
for <exp@example.com>; Mon, 12 Apr 2004 00:26:34 -0700
|
||||
Received: from hosy-r.mn.nu (unknown [192.168.3.80])
|
||||
by hosy-r.mn.nu (Postfix) with ESMTP id 2F2BA5540B7
|
||||
for <exp@example.com>; Mon, 12 Apr 2004 16:25:51 +0900 (JST)
|
||||
Message-ID: <12845318.1081754751281.JavaMail.postgres@hosyou-r.mine.nu>
|
||||
Date: Mon, 12 Apr 2004 16:25:51 +0900 (JST)
|
||||
From: =?iso-2022-jp?Q?=1B=24B=22!3Z!9=25H=25/=25H=25/=25S=258=25M=1B=28B?= =?iso-2022-jp?Q?=1B=24B=259=3EpJs=24H=24*E75=24=3EpJs=3CR=1B=28B?= <delivery@hosyou-r.mine.nu>
|
||||
To: exp@example.com
|
||||
Subject: =?iso-2022-jp?Q?=1B$B!Z$*E75$%a%k%^%,![#52/#9=1B(B?=
|
||||
=?iso-2022-jp?Q?=1B$B@iK|1=5F>Z5r!&=3DPMh$k:=5FBp%S%8=1B(B?=
|
||||
=?iso-2022-jp?Q?=1B$B%M%9$HA49q$*E75$>pJs!!Bh=1B(B4?=
|
||||
=?iso-2022-jp?Q?10=1B$B9f!J=1B(B8,000=1B$BItG[=3F.=1B(B)?=
|
||||
Mime-Version: 1.0
|
||||
Content-Type: text/plain
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
exp@example.com$BMM!"(B
|
||||
$B$*FI$_D:$-!"$"$j$,$H$&$4$6$$$^$9!#(B
|
||||
|
||||
$B!~K\%a%k%^%,$NG[?.ITMW!"$^$?$OEPO?$7$?3P$($N$J$$>l9g$O(B
|
||||
$B!!0lHV2<$N!z!z!z!!:#F|$NE75$M=Js!!!z!z!z(B
|
||||
$B!!!!!!!!$H(,KhD+8+$l$k!*!!A49q$N$*E75$(,!!(B
|
||||
$B!!!!!!$N4V$K$"$k%"%I%l%9$G2r=|$5$;$FD:$-$^$9!#!!(B
|
||||
|
||||
$B!!!!(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(B
|
||||
$B!!!!!~#52/#9@iK|1_>Z5rM-%S%8%M%9!*9b3[6b3[$O4X?4$,9b$$!~(B
|
||||
$B!!!!(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(B
|
||||
$B!y#5@iK|1_Cy6b$,M_$7$$!*(B
|
||||
$B!y#32/1_$N;v6H;q6b$,M_$7$$!*(B
|
||||
$B!yO78e$N$?$a$K#4@iK|1_M_$7$$(B
|
||||
$B!y0B?4$N0Y$KJ]>Z$,M_$7$$(B
|
||||
$B!y%M%C%H$G#7@iK|1_0J>e<}F~$,M_$7$$(B
|
||||
|
||||
$B$=$s$J5.J}$K:GE,$J4JC1:_Bp%S%8%M%9$G$9!#(B
|
||||
$B4{$K#32/!"#52/#9@iK|1_$N<}F~<TB3=P$7$F$$$^$9!#(B
|
||||
$B$^$:$O!">Z5r$r8+$F$/$@$5$$!"$=$l$+$i$G$9!*(B
|
||||
$B!z>Z5r$OEl5~9b:[$K$FH=7h!z(B
|
||||
$B"!9b3[<}F~$N>Z5r%"%j!*"!(B
|
||||
$B>\$7$/$O(BHP$B$K$F$43NG'$/$@$5$$!#(B
|
||||
|
||||
$B!!(Bhttp://brk.at/hosy
|
||||
|
||||
$B2?;v$bO@$h$j>Z5r!&:[H=41$NL\$G$*3N$+$a?d>)!*!*(B
|
||||
$B!!!!!!!!!!!!(B
|
||||
$B!!!!!!!!!!!!(,(,(,(,(,(,(,(,(,(,(,(,(,(B
|
||||
$B!!!!!!!!!!(B $B5.J}MM$O!*$4B8$8$G$9$+!*(B
|
||||
$B!!!!!!!!!!!!(,(,(,(,(,(,(,(,(,(,(,(,(,(B
|
||||
$B!!$D$$$K%0%i%s%I%*!<%W%s$NF|Dx$,7h$^$j$^$7$?!*(B
|
||||
$B!!$=$l$^$G$K5.J}$N%]%8%7%g%s$r3NJ]$7$FCV$$$F2<$5$$!*(B
|
||||
$B!!"-!!!!"-!!(B
|
||||
http://fortn.lv-jpn.com/indx.cgi?id=world
|
||||
$B!!!!!!(B
|
||||
$B!!!!!!!!!!!!!!(,(,(,(,(,(,(,(,(,(,(,(,(,(,(B
|
||||
$B!!!!!!!!!!!!!!F/$/%^%^$N!*;d$K$b=PMh$k;v!*(B
|
||||
$B!!!!!!!!!!!!!!(,(,(,(,(,(,(,(,(,(,(,(,(,(,(B
|
||||
$B:_8K$J$7!&%;%_%J!<;22C$J$7!&=i?4<T$K$b4JC1!*!&%5%]!<%H(B
|
||||
$BBN@)%P%C%A%j(B
|
||||
$B;22C<T$N(B8$B3d$,=w@-$NJ}$H$$$&$N$bG<F@$G$9(B
|
||||
|
||||
http://stag-n.jp/jc/mo/
|
||||
|
||||
$B!!!!!!!!!!!!(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(,(B
|
||||
$B!Z9-9pEj9F?o;~Jg=8Cf(B !!$B![(B
|
||||
$B9-9p!!#52s7G:\#3#0F|$G#3#0#0#01_(B
|
||||
$B9-9p!!#72s7G:\#5F|$G#4#0#0#01_(B
|
||||
$B9-9p#1#02s7G:\#6#0F|$G#5#0#0#01_(B
|
||||
$B!!!!!!!!(B
|
||||
$B!}!!K\F|$bEj9F!*$"$j$,$H$&$4$6$$$^$7$?"v!}(B
|
||||
<<$B%a%k%^%,H/9T<T!d!d3Z!9%H%/%H%/>pJs<R(B
|
||||
yazawa@easy.to
|
||||
|
||||
$B"#LH@U;v9`(B
|
||||
$BEv%a!<%k%^%,%8%s$K7G:\$7$F$$$k>pJs$K4X$7$FH/9T<T$G$O0l@Z$N(B
|
||||
$B@UG$$rIi$$$^$;$s!#(B
|
||||
$B0l@Z$N@UG$$rIi$$$+$M$^$9$N$G$4N;>5$/$@$5$$!#7G:\5-;v$K4X$9(B
|
||||
$B$k$*Ld$$9g$o$;$OD>@\Ej9F<T$X$*4j$$$$$?$7$^$9!#(B
|
||||
|
||||
$B!!!!!!!!!!!z!z!z!!:#F|$NE75$M=Js!!!z!z!z(B
|
||||
|
||||
$B"#!!%"%I%l%9$GG[?.2r=|!!"#(B
|
||||
$B!~K\%a%k%^%,$NG[?.ITMW!"$^$?$OEPO?$7$?3P$($N$J$$>l9g$O(B
|
||||
$B!!<!$N%"%I%l%9$+$i$NEPO?$K$h$j2r=|$5$;$FD:$-$^$9!#!!!!!!!!!!!!!!(B
|
||||
http://bck.t/mlstp
|
||||
|
||||
$B!!!!!!(,(,(,KhD+8+$l$k!*!!A49q$N$*E75$(,(,!!(B
|
||||
|
||||
-------------------------------------------
|
||||
4$B7n(B12$BF|(B11$B;~H/I=(B
|
||||
|
||||
$B<gMWET;T(B $B:#Lk(B $BL@F|(B
|
||||
$B;%KZ(B $BF^$j$N$A;~!9@2$l(B $B@2$l(B
|
||||
$B@gBf(B $B@2$l(B $BF^$j;~!9@2$l(B
|
||||
$BEl5~(B $B@2$l(B $B@2$l$N$A;~!9F^$j(B
|
||||
$BD9Ln(B $B@2$l(B $B@2$l(B
|
||||
$B@E2,(B $B@2$l(B $B@2$l$N$A;~!9F^$j(B
|
||||
$BL>8E20(B $B@2$l(B $B@2$l$N$A;~!9F^$j(B
|
||||
$B?73c(B $B@2$l(B $B@2$l(B
|
||||
$B6bBt(B $B@2$l(B $B@2$l(B
|
||||
$BBg:e(B $B@2$l(B $B@2$l$N$A;~!9F^$j(B
|
||||
$B2,;3(B $B@2$l(B $B@2$l$N$A;~!9F^$j(B
|
||||
$B9-Eg(B $B@2$l(B $B@2$l$N$A0l;~1+(B
|
||||
$B9b>>(B $B@2$l(B $BF^$j(B
|
||||
$BJ!2,(B $B@2$l$N$A;~!9F^$j(B $BF^$j0l;~1+(B
|
||||
$B</;yEg(B $B@2$l$N$A;~!9F^$j(B $B1+(B
|
||||
$BFaGF(B $B@2$l(B $B@2$l(B
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 90 B |
|
Before Width: | Height: | Size: 90 B |
161923
mozilla/mstone/doc/stone.mif
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 61 B |
|
Before Width: | Height: | Size: 125 B |
@@ -1,64 +0,0 @@
|
||||
# optional component libgd
|
||||
# This should be run using 'gmake'
|
||||
########################################################################
|
||||
|
||||
topsrcdir = .
|
||||
|
||||
ifndef INCLUDED_CONFIG_MK
|
||||
include $(topsrcdir)/config/config.mk
|
||||
endif
|
||||
|
||||
ifneq ("$(LIBGD_DIR)", "")
|
||||
LIBGD_OBJDIR = $(OBJDIR)/gd
|
||||
LIBGD = $(LIBGD_OBJDIR)/libgd.$(LIB_SUFFIX)
|
||||
GDDEMO = $(LIBGD_OBJDIR)/gddemo$(EXE_SUFFIX)
|
||||
GIFTOGD = $(LIBGD_OBJDIR)/giftogd$(EXE_SUFFIX)
|
||||
WEBGIF = $(LIBGD_OBJDIR)/webgif$(EXE_SUFFIX)
|
||||
|
||||
#LIBPATH += -L$(LIBGD_OBJDIR)
|
||||
#INCLUDES += -I./$(LIBGD_DIR)
|
||||
|
||||
LIBGD_SRCS = gd.c gdfontt.c gdfonts.c gdfontmb.c gdfontl.c gdfontg.c
|
||||
LIBGD_SRCS2 = $(addprefix $(LIBGD_DIR)/, $(LIBGD_SRCS))
|
||||
|
||||
LIBGD_OBJS = $(addprefix $(LIBGD_OBJDIR)/, $(LIBGD_SRCS:.c=.$(OBJ_SUFFIX)))
|
||||
|
||||
LIBGD_ALL = $(LIBGD_OBJDIR) $(LIBGD) $(GDDEMO) $(GIFTOGD) $(WEBGIF)
|
||||
|
||||
libgd:: $(LIBGD_ALL)
|
||||
|
||||
$(LIBGD_OBJDIR):
|
||||
ifeq ($(ARCH), WINNT)
|
||||
mkdir $(LIBGD_OBJDIR)
|
||||
else
|
||||
[ -d $(LIBGD_OBJDIR) ] || mkdir -p $(LIBGD_OBJDIR)
|
||||
endif
|
||||
|
||||
$(LIBGD): $(LIBGD_OBJS)
|
||||
@$(ECHO) "\n===== [`date`] making libgd...\n"
|
||||
$(AR) rc $(LIBGD) $(LIBGD_OBJS)
|
||||
cp $(LIBGD_DIR)/gd.h $(LIBGD_OBJDIR)
|
||||
cp $(LIBGD_DIR)/demoin.gif $(LIBGD_OBJDIR)
|
||||
cp $(LIBGD_DIR)/readme.txt $(LIBGD_OBJDIR)/gd.txt
|
||||
cp $(LIBGD_DIR)/index.html $(LIBGD_OBJDIR)/gd.html
|
||||
|
||||
$(GDDEMO): $(LIBGD) $(LIBGD_OBJDIR)/gddemo.$(OBJ_SUFFIX)
|
||||
$(COMPILE) $(LIBGD_OBJDIR)/gddemo.$(OBJ_SUFFIX) $(LIBPATH) $(LIBGD) $(LIBS) $(OS_LINKFLAGS) -o $(GDDEMO)
|
||||
|
||||
$(GIFTOGD): $(LIBGD) $(LIBGD_OBJDIR)/giftogd.$(OBJ_SUFFIX)
|
||||
$(COMPILE) $(LIBGD_OBJDIR)/giftogd.$(OBJ_SUFFIX) $(LIBPATH) $(LIBGD) $(LIBS) $(OS_LINKFLAGS) -o $(GIFTOGD)
|
||||
|
||||
$(WEBGIF): $(LIBGD) $(LIBGD_OBJDIR)/webgif.$(OBJ_SUFFIX)
|
||||
$(COMPILE) $(LIBGD_OBJDIR)/webgif.$(OBJ_SUFFIX) $(LIBPATH) $(LIBGD) $(LIBS) $(OS_LINKFLAGS) -o $(WEBGIF)
|
||||
|
||||
distclean::
|
||||
$(RM) $(LIBGD) $(LIBGD_OBJS)
|
||||
|
||||
$(LIBGD_OBJDIR)/%.$(OBJ_SUFFIX): $(LIBGD_DIR)/%.c
|
||||
ifeq ($(ARCH), WINNT)
|
||||
$(COMPILE) -c -MT $< -Fo$(LIBGD_OBJDIR)/$*.$(OBJ_SUFFIX)
|
||||
else
|
||||
$(COMPILE) -c $< -o $(LIBGD_OBJDIR)/$*.$(OBJ_SUFFIX)
|
||||
endif
|
||||
|
||||
endif
|
||||
@@ -1,57 +0,0 @@
|
||||
# optional component gnuplot (can use libgd)
|
||||
# This should be run using 'gmake'
|
||||
########################################################################
|
||||
|
||||
topsrcdir = .
|
||||
|
||||
ifndef INCLUDED_CONFIG_MK
|
||||
include $(topsrcdir)/config/config.mk
|
||||
endif
|
||||
|
||||
ifneq ("$(GNUPLOT_DIR)", "")
|
||||
GNUPLOT = gnuplot$(EXESUFFIX)
|
||||
GNUPLOT_OBJDIR = $(OBJDIR)/gnuplot
|
||||
GNUPLOT_TARGET = $(GNUPLOT_OBJDIR)/$(GNUPLOT)
|
||||
GNUPLOT_HELP = $(GNUPLOT_OBJDIR)/gnuplot.gih
|
||||
GNUPLOT_CONFIG_H = $(GNUPLOT_OBJDIR)/config.h
|
||||
ifneq ("$(LIBGD_DIR)", "")
|
||||
GNUPLOT_CONFIG_OPTS = --prefix=/opt/mailstone --with-gd=../$(OBJDIR)/gd --with-png=no --without-linux-vga
|
||||
endif
|
||||
|
||||
GNUPLOT_ALL = $(GNUPLOT_OBJDIR) $(GNUPLOT_TARGET) $(GNUPLOT_HELP)
|
||||
|
||||
gnuplot:: $(GNUPLOT_ALL)
|
||||
|
||||
$(GNUPLOT_OBJDIR):
|
||||
ifeq ($(ARCH), WINNT)
|
||||
mkdir $(GNUPLOT_OBJDIR)
|
||||
else
|
||||
[ -d $(GNUPLOT_OBJDIR) ] || mkdir -p $(GNUPLOT_OBJDIR)
|
||||
endif
|
||||
|
||||
$(GNUPLOT_TARGET): $(GNUPLOT_CONFIG_H)
|
||||
@$(ECHO) "\n===== [`date`] making gnuplot...\n"
|
||||
(cd $(GNUPLOT_OBJDIR); $(MAKE) MAKE=$(MAKE) all)
|
||||
|
||||
$(GNUPLOT_HELP):
|
||||
cp $(GNUPLOT_DIR)/docs/gnuplot.1 $(GNUPLOT_OBJDIR)
|
||||
cp $(GNUPLOT_DIR)/Copyright $(GNUPLOT_OBJDIR)
|
||||
cp $(GNUPLOT_OBJDIR)/docs/gnuplot.gih $(GNUPLOT_HELP)
|
||||
|
||||
$(GNUPLOT_CONFIG_H):
|
||||
@$(ECHO) "\n===== [`date`] making gnuplot config.h...\n"
|
||||
(cd $(GNUPLOT_OBJDIR); CC="$(CC) $(CFLAGS)" ../../../$(GNUPLOT_DIR)/configure $(GNUPLOT_CONFIG_OPTS))
|
||||
|
||||
distclean::
|
||||
[ ! -f $(GNUPLOT_OBJDIR)/Makefile ] || \
|
||||
(cd $(GNUPLOT_OBJDIR); $(MAKE) MAKE=$(MAKE) distclean)
|
||||
$(RM) $(GNUPLOT_TARGET) $(GNUPLOT_CONFIG_H)
|
||||
|
||||
$(GNUPLOT_OBJDIR)/%.$(OBJ_SUFFIX): $(GNUPLOT_DIR)/%.c
|
||||
ifeq ($(ARCH), WINNT)
|
||||
$(COMPILE) -c -MT $< -Fo$(GNUPLOT_OBJDIR)/$*.$(OBJ_SUFFIX)
|
||||
else
|
||||
$(COMPILE) -c $< -o $(GNUPLOT_OBJDIR)/$*.$(OBJ_SUFFIX)
|
||||
endif
|
||||
|
||||
endif
|
||||
@@ -1,97 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="mailstone" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=mailstone - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mailstone.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mailstone.mak" CFG="mailstone - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "mailstone - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "mailstone - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "mailstone - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "built\WINNT4.0_OPT.OBJ"
|
||||
# PROP Intermediate_Dir "built\WINNT4.0_OPT.OBJ"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D VERSION="4.1" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# Begin Special Build Tool
|
||||
OutDir=.\built\WINNT4.0_OPT.OBJ
|
||||
SOURCE="$(InputPath)"
|
||||
PostBuild_Cmds=if not exist built\package\WINNT4.0_OPT.OBJ\nul mkdir built\package\WINNT4.0_OPT.OBJ copy $(OutDir)\mailclient.exe built\package\WINNT4.0_OPT.OBJ
|
||||
# End Special Build Tool
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailstone - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "built\WINNT4.0_DBG.OBJ"
|
||||
# PROP Intermediate_Dir "built\WINNT4.0_DBG.OBJ"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D VERSION="4.1" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /FR /FD /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# Begin Special Build Tool
|
||||
OutDir=.\built\WINNT4.0_DBG.OBJ
|
||||
SOURCE="$(InputPath)"
|
||||
PostBuild_Cmds=if not exist built\package\WINNT4.0_DBG.OBJ\nul mkdir built\package\WINNT4.0_DBG.OBJ copy $(OutDir)\mailclient.exe built\package\WINNT4.0_DBG.OBJ
|
||||
# End Special Build Tool
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "mailstone - Win32 Release"
|
||||
# Name "mailstone - Win32 Debug"
|
||||
# End Target
|
||||
# End Project
|
||||
@@ -1,74 +0,0 @@
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "gnuplot"=".\src\gnuplot-3.7\gnuplot.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name libgd
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "libgd"=.\src\gd1.3\libgd.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "mailclient"=.\src\mailclient.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "mailstone"=.\mailstone.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name mailclient
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name gnuplot
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -1,221 +0,0 @@
|
||||
# Microsoft Developer Studio Generated NMAKE File, Based on mailstone.dsp
|
||||
!IF "$(CFG)" == ""
|
||||
CFG=mailstone - Win32 Debug
|
||||
!MESSAGE No configuration specified. Defaulting to mailstone - Win32 Debug.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" != "mailstone - Win32 Release" && "$(CFG)" != "mailstone - Win32 Debug"
|
||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mailstone.mak" CFG="mailstone - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "mailstone - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "mailstone - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
!ERROR An invalid configuration is specified.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(OS)" == "Windows_NT"
|
||||
NULL=
|
||||
!ELSE
|
||||
NULL=nul
|
||||
!ENDIF
|
||||
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "mailstone - Win32 Release"
|
||||
|
||||
OUTDIR=.\built\WINNT4.0_OPT.OBJ
|
||||
INTDIR=.\built\WINNT4.0_OPT.OBJ
|
||||
|
||||
!IF "$(RECURSE)" == "0"
|
||||
|
||||
ALL :
|
||||
|
||||
!ELSE
|
||||
|
||||
ALL : "gnuplot - Win32 Release" "mailclient - Win32 Release"
|
||||
|
||||
!ENDIF
|
||||
|
||||
!IF "$(RECURSE)" == "1"
|
||||
CLEAN :"mailclient - Win32 ReleaseCLEAN" "gnuplot - Win32 ReleaseCLEAN"
|
||||
!ELSE
|
||||
CLEAN :
|
||||
!ENDIF
|
||||
-@if exist $(INTDIR)\postbld.dep erase $(INTDIR)\postbld.dep
|
||||
-@if exist built\package\WINNT4.0_OPT.OBJ\mailclient.exe erase built\package\WINNT4.0_OPT.OBJ\mailclient.exe
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mailstone.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LINK32=link.exe
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\mailstone.pdb" /machine:I386 /out:"$(OUTDIR)\mailstone.exe"
|
||||
LINK32_OBJS= \
|
||||
|
||||
OutDir=.\built\WINNT4.0_OPT.OBJ
|
||||
SOURCE="$(InputPath)"
|
||||
DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
|
||||
|
||||
ALL : $(DS_POSTBUILD_DEP)
|
||||
|
||||
$(DS_POSTBUILD_DEP) : "gnuplot - Win32 Release" "mailclient - Win32 Release"
|
||||
if not exist built\package\WINNT4.0_OPT.OBJ\nul mkdir built\package\WINNT4.0_OPT.OBJ
|
||||
copy .\built\WINNT4.0_OPT.OBJ\mailclient.exe built\package\WINNT4.0_OPT.OBJ
|
||||
echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)"
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailstone - Win32 Debug"
|
||||
|
||||
OUTDIR=.\built\WINNT4.0_DBG.OBJ
|
||||
INTDIR=.\built\WINNT4.0_DBG.OBJ
|
||||
|
||||
!IF "$(RECURSE)" == "0"
|
||||
|
||||
ALL :
|
||||
|
||||
!ELSE
|
||||
|
||||
ALL : "gnuplot - Win32 Debug" "mailclient - Win32 Debug"
|
||||
|
||||
!ENDIF
|
||||
|
||||
!IF "$(RECURSE)" == "1"
|
||||
CLEAN :"mailclient - Win32 DebugCLEAN" "gnuplot - Win32 DebugCLEAN"
|
||||
!ELSE
|
||||
CLEAN :
|
||||
!ENDIF
|
||||
-@if exist $(INTDIR)\postbld.dep erase /q $(INTDIR)\postbld.dep
|
||||
-@if exist built\package\WINNT4.0_DBG.OBJ\mailclient.exe erase /q built\package\WINNT4.0_DBG.OBJ\mailclient.exe
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mailstone.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LINK32=link.exe
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\mailstone.pdb" /debug /machine:I386 /out:"$(OUTDIR)\mailstone.exe" /pdbtype:sept
|
||||
LINK32_OBJS= \
|
||||
|
||||
OutDir=.\built\WINNT4.0_DBG.OBJ
|
||||
SOURCE="$(InputPath)"
|
||||
DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep
|
||||
|
||||
ALL : $(DS_POSTBUILD_DEP)
|
||||
|
||||
$(DS_POSTBUILD_DEP) : "gnuplot - Win32 Debug" "mailclient - Win32 Debug"
|
||||
if not exist built\package\WINNT4.0_DBG.OBJ\nul mkdir built\package\WINNT4.0_DBG.OBJ
|
||||
copy .\built\WINNT4.0_DBG.OBJ\mailclient.exe built\package\WINNT4.0_DBG.OBJ
|
||||
echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)"
|
||||
|
||||
!ENDIF
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
|
||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
||||
!IF EXISTS("mailstone.dep")
|
||||
!INCLUDE "mailstone.dep"
|
||||
!ELSE
|
||||
!MESSAGE Warning: cannot find "mailstone.dep"
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(CFG)" == "mailstone - Win32 Release" || "$(CFG)" == "mailstone - Win32 Debug"
|
||||
|
||||
!IF "$(CFG)" == "mailstone - Win32 Release"
|
||||
|
||||
"mailclient - Win32 Release" :
|
||||
cd ".\src"
|
||||
$(MAKE) /$(MAKEFLAGS) /F .\mailclient.mak CFG="mailclient - Win32 Release"
|
||||
cd ".."
|
||||
|
||||
"mailclient - Win32 ReleaseCLEAN" :
|
||||
cd ".\src"
|
||||
$(MAKE) /$(MAKEFLAGS) /F .\mailclient.mak CFG="mailclient - Win32 Release" RECURSE=1 CLEAN
|
||||
cd ".."
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailstone - Win32 Debug"
|
||||
|
||||
"mailclient - Win32 Debug" :
|
||||
cd ".\src"
|
||||
$(MAKE) /$(MAKEFLAGS) /F .\mailclient.mak CFG="mailclient - Win32 Debug"
|
||||
cd ".."
|
||||
|
||||
"mailclient - Win32 DebugCLEAN" :
|
||||
cd ".\src"
|
||||
$(MAKE) /$(MAKEFLAGS) /F .\mailclient.mak CFG="mailclient - Win32 Debug" RECURSE=1 CLEAN
|
||||
cd ".."
|
||||
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" == "mailstone - Win32 Release"
|
||||
|
||||
"gnuplot - Win32 Release" :
|
||||
cd ".\src\gnuplot-3.7"
|
||||
$(MAKE) /$(MAKEFLAGS) /F ".\gnuplot.mak" CFG="gnuplot - Win32 Release"
|
||||
cd "..\.."
|
||||
|
||||
"gnuplot - Win32 ReleaseCLEAN" :
|
||||
cd ".\src\gnuplot-3.7"
|
||||
$(MAKE) /$(MAKEFLAGS) /F ".\gnuplot.mak" CFG="gnuplot - Win32 Release" RECURSE=1 CLEAN
|
||||
cd "..\.."
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailstone - Win32 Debug"
|
||||
|
||||
"gnuplot - Win32 Debug" :
|
||||
cd ".\src\gnuplot-3.7"
|
||||
$(MAKE) /$(MAKEFLAGS) /F ".\gnuplot.mak" CFG="gnuplot - Win32 Debug"
|
||||
cd "..\.."
|
||||
|
||||
"gnuplot - Win32 DebugCLEAN" :
|
||||
cd ".\src\gnuplot-3.7"
|
||||
$(MAKE) /$(MAKEFLAGS) /F ".\gnuplot.mak" CFG="gnuplot - Win32 Debug" RECURSE=1 CLEAN
|
||||
cd "..\.."
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
.\" @(#)template.1 1.2 10/22/96 template.1 "
|
||||
.TH setup 1 "5 Nov 1999" "iPlanet" "Mailstone"
|
||||
.SH NAME
|
||||
setup \- Configure Mailstone and copy bits to client machines
|
||||
.SH SYNOPSIS
|
||||
.B setup
|
||||
[
|
||||
.B \-w workload_file
|
||||
]
|
||||
.SH FILES
|
||||
Workload file are store in the
|
||||
.BR conf/
|
||||
directory and have the extension
|
||||
.BR .wld.
|
||||
|
||||
|
||||
.SH DESCRIPTION
|
||||
.B Setup
|
||||
will ask you to accept the licensing terms and ask for an initial
|
||||
configuration (if these steps have never been performed). The test
|
||||
system configuration is stored in
|
||||
.BR conf/general.wld.
|
||||
.PP
|
||||
Once there is a valid configuration
|
||||
.B setup
|
||||
will copy the appropriate
|
||||
.B bin/mailclient
|
||||
and
|
||||
.B data/*.msg
|
||||
files to each client machine.
|
||||
.PP
|
||||
.B Setup
|
||||
should be run whenever a new client machine is added, the message file change,
|
||||
or files are missing on the client machine (due to a clean up of
|
||||
.B /var/tmp.
|
||||
.SH OPTIONS
|
||||
.TP 12
|
||||
.B \-w workload_file
|
||||
Specify a workload other than conf/general.wld. This file must define
|
||||
(or include)
|
||||
.B CLIENT
|
||||
sections that list the client machines to use.
|
||||
.SH EXAMPLES
|
||||
.IP
|
||||
.BR example% " setup"
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
.BR mailstone (1)
|
||||
.BR checktime (1)
|
||||
.BR timesync (1)
|
||||
.BR mstone (1)
|
||||
.BR workloads (5)
|
||||
.SH DIAGNOSTICS
|
||||
The most common problem is insufficient rsh permissions.
|
||||
|
||||
Most errors should be self explanitory.
|
||||
@@ -1,188 +0,0 @@
|
||||
#!/bin/sh
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# push or clean up mailclient and message files to client hosts
|
||||
# Usage: setup|cleanup|timesync|checktime|config [mode] [-w workload_file]
|
||||
#
|
||||
# Setup (or cleanup) OS specific versions of mailclient and utilities
|
||||
|
||||
gconf=conf/general.wld # default file for machines info
|
||||
|
||||
# figure out the host arch
|
||||
run_nsarch() {
|
||||
if [ ! -x bin/nsarch ] ; then
|
||||
echo "Installation error! Cannot locate $1 or nsarch.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
OUROS=`bin/nsarch`
|
||||
# deal with new versions of OS falling back to versions we have
|
||||
if [ ! -d bin/$OUROS ] ; then
|
||||
shortos=`echo $OUROS | sed -e 's/[0-9].*//'`
|
||||
near=`ls -d bin/*/bin | grep $shortos`
|
||||
if [ -n "$near" ] ; then
|
||||
near=`echo $near | cut -f2 -d'/'`
|
||||
echo "No support for $OUROS, using $near"
|
||||
OUROS=$near
|
||||
else
|
||||
echo "No support for $OUROS and nothing similar"
|
||||
fi
|
||||
fi
|
||||
export OUROS
|
||||
}
|
||||
|
||||
# Setup perl to work from perl/bin/perl
|
||||
setup_perl() {
|
||||
[ -n "$OUROS" ] || run_nsarch $1
|
||||
if [ -d perl ] ; then # found it in our distribution
|
||||
(cd perl; ln -s arch/$OUROS bin)
|
||||
else
|
||||
local=`which perl | wc -w`
|
||||
if [ 1 -eq "$local" ] ; then
|
||||
[ -d perl/bin ] || mkdir -p perl/bin
|
||||
(cd perl/bin; ln -s `which perl` perl)
|
||||
else
|
||||
echo "No packaged version of perl and no local version"
|
||||
exit 1;
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# we always need this
|
||||
[ -d perl/bin ] || setup_perl # need perl, even for cleanup mode
|
||||
|
||||
# Get the default version of mailclient
|
||||
setup_mailclient() {
|
||||
[ -n "$OUROS" ] || run_nsarch $1
|
||||
(cd bin; ln -s $OUROS/bin/mailclient ./ )
|
||||
}
|
||||
|
||||
# setup_file source_dir directory filename
|
||||
# usually link in a directory.
|
||||
# if needed, make the directory and link a local executable.
|
||||
setup_dir_file() {
|
||||
[ -n "$OUROS" ] || run_nsarch $1
|
||||
if [ -d $1/$OUROS/$2 ] ; then # found it in our distribution
|
||||
ln -s $1/$OUROS/$2 $2
|
||||
else # look for a system copy
|
||||
local=`which $3 | wc -w`
|
||||
if [ 1 -eq "$local" ] ; then
|
||||
[ -d $2 ] || mkdir -p $2
|
||||
(cd $2; ln -s `which $3` $3)
|
||||
else
|
||||
echo "WARNING: No packaged version of $3 and no local version"
|
||||
echo " Operation may be severely limited"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Pick up mode as an argument
|
||||
if [ $# -gt 0 -a \( "$1" = timesync -o "$1" = checktime \
|
||||
-o "$1" = setup -o "$1" = cleanup -o "$1" = config \
|
||||
-o "$1" = mstone \) ] ; then
|
||||
mode=$1
|
||||
shift
|
||||
else # or the name we were called
|
||||
mode=$0
|
||||
sm=`echo $mode | cut -f2 -d/` # strip ./ from name
|
||||
if [ -n "$sm" ] ; then
|
||||
mode=$sm
|
||||
fi
|
||||
fi
|
||||
|
||||
# see if setup was ever run
|
||||
if [ "$mode" != setup -a "$mode" != cleanup \
|
||||
-a \( ! -x perl/bin/perl -o ! -f .license \) ] ; then
|
||||
echo "mstone setup was never run. Running setup."
|
||||
mode=setup
|
||||
fi
|
||||
|
||||
if [ "$mode" = setup ] ; then # setup mode
|
||||
# check to see if our binaries are configured right
|
||||
#echo "Checking links"
|
||||
[ -x gnuplot/gnuplot ] || setup_dir_file bin gnuplot gnuplot
|
||||
[ -x bin/mailclient ] || setup_mailclient
|
||||
|
||||
# copy in an initial conf/general.wld, if needed
|
||||
[ ! -f $gconf -a -f ${gconf}.in ] && cp ${gconf}.in $gconf
|
||||
fi
|
||||
|
||||
# figure out an OS specific flags
|
||||
extra=""
|
||||
if [ `uname -s` = HP-UX ] ; then # HP uses remsh for remote exec
|
||||
extra="RSH=/usr/bin/remsh $extra"
|
||||
fi
|
||||
|
||||
if [ "$mode" != mstone ] ; then # other setup modes
|
||||
perl/bin/perl -Ibin -- bin/setup.pl $mode -w $gconf $extra "$@"
|
||||
else # run a mstone test
|
||||
# This just runs the test with the right path to perl
|
||||
# Usage: mstone testname
|
||||
if [ -z "$1" -o "$1" = "-h" -o "$1" = "--help" ] ; then
|
||||
echo "Usage: $0 testname [arguments]"
|
||||
echo "Common arguments:"
|
||||
echo " -t time Test time. s=seconds, m=minutes, h=hours"
|
||||
echo " -r ramp_time Connection ramp up time. s=seconds, m=..."
|
||||
echo " -l load Number of test clients to use."
|
||||
echo " -b 'banner' Test description banner."
|
||||
echo " -n 'notes' Test notes."
|
||||
echo "Example:"
|
||||
echo " ./mstone pop -t 10m -r 90s -l 24 -b 'Pop reads (full store)'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
testcase=$1 # get testname
|
||||
shift
|
||||
|
||||
if [ -f $testcase ] ; then # if they gave us the full path
|
||||
testfile=$testcase
|
||||
elif [ -f conf/$testcase.wld ] ; then
|
||||
testfile="conf/$testcase.wld"
|
||||
else
|
||||
echo "Cannot find test: $testcase"
|
||||
fi
|
||||
|
||||
exec perl/bin/perl -Ibin -- bin/mailmaster.pl $extra -w $testfile "$@"
|
||||
# no need to return
|
||||
fi
|
||||
|
||||
if [ "$mode" = cleanup ] ; then # cleanup mode
|
||||
#echo "Check for old links"
|
||||
# remove any configured links. if these are directories, it will fail
|
||||
rm -f perl/bin gd gnuplot 2> /dev/null
|
||||
|
||||
# the built in [ on Solaris does not have -L
|
||||
/usr/bin/test -L bin/mailclient && rm -f bin/mailclient
|
||||
fi
|
||||
@@ -1,31 +0,0 @@
|
||||
@if not "%echo%" == "on" echo off
|
||||
|
||||
setlocal
|
||||
|
||||
REM
|
||||
REM This runs the specified test with the correct path to perl.
|
||||
REM Fills in the TEMP variable
|
||||
REM
|
||||
REM Usage: mstone testname [arguments]
|
||||
REM
|
||||
|
||||
if "%1" == "" goto Usage
|
||||
|
||||
perl\bin\perl -Ibin -- bin\mailmaster.pl -w conf\%1.wld TEMPDIR=%TEMP% -z %2 %3 %4 %5 %6 %7 %8 %9
|
||||
|
||||
goto end
|
||||
|
||||
:Usage
|
||||
|
||||
echo.
|
||||
echo Usage: %0 testname [arguments]
|
||||
echo.
|
||||
echo where testname is one of the .wld files in the conf\ subdirectory
|
||||
goto end
|
||||
|
||||
:end
|
||||
|
||||
echo.
|
||||
|
||||
endlocal
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
#!/bin/sh
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# Figure out standard system names
|
||||
|
||||
UNAME_REPORTS=`uname`
|
||||
UNAME_OS_SYSTEM=`uname -s`
|
||||
UNAME_OS_RELEASE=`uname -r`
|
||||
|
||||
OS_SYSTEM=${UNAME_OS_SYSTEM}
|
||||
OS_RELEASE=${UNAME_OS_RELEASE}
|
||||
OS_CONFIG=${OS_SYSTEM}${OS_RELEASE}
|
||||
|
||||
if [ "$UNAME_OS_SYSTEM" = "SunOS" ]; then
|
||||
PROCESSOR=`uname -p`
|
||||
if [ "$PROCESSOR" = "i386" ]; then
|
||||
BUILD_ARCH=x86
|
||||
else
|
||||
BUILD_ARCH=sparc
|
||||
fi
|
||||
BUILD_OS=Solaris
|
||||
if [ "$UNAME_OS_RELEASE" = "5.5" ]; then
|
||||
BUILD_VER=2.5
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.5.1" ]; then
|
||||
BUILD_VER=2.5
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.6" ]; then
|
||||
BUILD_VER=2.6
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.7" ]; then
|
||||
BUILD_VER=7
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.8" ]; then
|
||||
BUILD_VER=8
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.9" ]; then
|
||||
BUILD_VER=9
|
||||
fi
|
||||
OS_CONFIG=${OS_SYSTEM}${OS_RELEASE}_${BUILD_ARCH}
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "HP-UX" ]; then
|
||||
BUILD_ARCH=HPPA
|
||||
BUILD_OS=$UNAME_OS_SYSTEM
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "AIX" ]; then
|
||||
BUILD_ARCH=POWER
|
||||
BUILD_OS=$UNAME_OS_SYSTEM
|
||||
BUILD_VER=`uname -v`.`uname -r`
|
||||
OS_CONFIG=${BUILD_OS}${BUILD_VER}
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "OSF1" ]; then
|
||||
BUILD_ARCH=ALPHA
|
||||
BUILD_OS=$UNAME_OS_SYSTEM
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "IRIX64" -o "$UNAME_OS_SYSTEM" = "IRIX" ]; then
|
||||
BUILD_ARCH=MIPS
|
||||
BUILD_OS=IRIX
|
||||
BUILD_VER=$OS_RELEASE
|
||||
OS_CONFIG=${BUILD_OS}${OS_RELEASE}
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "BSD/386" ]; then
|
||||
BUILD_ARCH=x86
|
||||
BUILD_OS=BSDI
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "SCO_SV" ]; then
|
||||
BUILD_ARCH=x86
|
||||
BUILD_OS=SCO
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "UNIX_SV" ]; then
|
||||
# Check for braindamage
|
||||
grep NCR /etc/bcheckrc > /dev/null 2>&1
|
||||
BUILD_ARCH=x86
|
||||
if [ $? = 0 ]; then
|
||||
BUILD_OS=NCR
|
||||
else
|
||||
BUILD_OS=UNIXWARE
|
||||
fi
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "NEWS-OS" ]; then
|
||||
BUILD_ARCH=`uname -p`
|
||||
BUILD_OS=SONY
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_SYSTEM" = "UNIX_System_V" ]; then
|
||||
BUILD_ARCH=`uname -p`
|
||||
BUILD_OS=NEC
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ $UNAME_OS_SYSTEM = Linux ]; then
|
||||
BUILD_ARCH=`uname -m`
|
||||
if [ -n "`echo $BUILD_ARCH | grep -e '86$'`" ] ; then
|
||||
BUILD_ARCH=x86
|
||||
fi
|
||||
BUILD_OS=$UNAME_OS_SYSTEM
|
||||
BUILD_VER=`echo $OS_RELEASE | cut -f1,2 -d.`
|
||||
OS_CONFIG=${BUILD_OS}${BUILD_VER}_${BUILD_ARCH}
|
||||
fi
|
||||
|
||||
case "$UNAME_OS_SYSTEM" in
|
||||
SINIX*|ReliantUNIX*)
|
||||
BUILD_ARCH=`uname -p`
|
||||
BUILD_OS="ReliantUNIX"
|
||||
BUILD_VER=$OS_RELEASE
|
||||
;;
|
||||
esac
|
||||
|
||||
#PLATFORM=${BUILD_ARCH}_${BUILD_OS}_${BUILD_VER}
|
||||
#echo $PLATFORM
|
||||
echo $OS_CONFIG
|
||||
@@ -1,72 +0,0 @@
|
||||
#!/bin/sh
|
||||
# package an OS into a multi-OS tree
|
||||
# usage ospkg.sh targetOS os...
|
||||
|
||||
target=$1; shift
|
||||
pkgdir=./build/package/$target/mstone
|
||||
|
||||
errors=0
|
||||
|
||||
for obj
|
||||
do
|
||||
srcdir=./build/package/$obj/mstone
|
||||
if [ ! -d $srcdir ] ; then
|
||||
echo "Error! Source directory $srcdir is missing."
|
||||
errors=1
|
||||
continue;
|
||||
fi
|
||||
arch=`echo $obj | sed -e 's/_OPT.OBJ//' | sed -e 's/_DBG.OBJ//'`
|
||||
|
||||
echo "===== adding $arch packaging to $pkgdir"
|
||||
|
||||
echo "Installing mailclient"
|
||||
[ -d $pkgdir/bin/$arch/bin ] || mkdir -p $pkgdir/bin/$arch/bin
|
||||
cp -p $srcdir/bin/mailclient $pkgdir/bin/$arch/bin/
|
||||
|
||||
if [ -d $srcdir/gd ] ; then
|
||||
echo "Installing gd"
|
||||
[ -d $pkgdir/bin/$arch/gd ] || mkdir -p $pkgdir/bin/$arch/gd
|
||||
cp -p $srcdir/gd/* $pkgdir/bin/$arch/gd/
|
||||
fi
|
||||
|
||||
if [ -d $srcdir/gnuplot ] ; then
|
||||
echo "Installing gnuplot"
|
||||
[ -d $pkgdir/bin/$arch/gnuplot ] || mkdir -p $pkgdir/bin/$arch/gnuplot
|
||||
cp -p $srcdir/gnuplot/* $pkgdir/bin/$arch/gnuplot/
|
||||
fi
|
||||
|
||||
if [ -d $srcdir/perl ] ; then
|
||||
perlver=`cd $srcdir/perl/lib; ls -d 5.* | head -1`
|
||||
perlarch=`cd $srcdir/perl/lib/$perlver; ls -d */Config.pm | cut -f1 -d/`
|
||||
echo "Installing perl $perlver for $perlarch"
|
||||
[ -d $pkgdir/perl ] || mkdir -p $pkgdir/perl
|
||||
cp -pf $srcdir/perl/Artistic $pkgdir/perl/
|
||||
|
||||
# we dont pull everything in, just the potentially useful parts
|
||||
for subdir in man/man1 \
|
||||
lib/$perlver lib/$perlver/$perlarch \
|
||||
lib/$perlver/Time lib/$perlver/Term lib/$perlver/Class \
|
||||
lib/$perlver/Sys lib/$perlver/Data lib/$perlver/Getopt \
|
||||
lib/$perlver/Test lib/$perlver/Text \
|
||||
lib/$perlver/File lib/$perlver/File/Spec \
|
||||
lib/$perlver/CGI lib/$perlver/Net \
|
||||
lib/$perlver/$perlarch/auto/DynaLoader \
|
||||
lib/$perlver/$perlarch/auto/Socket \
|
||||
lib/$perlver/$perlarch/auto/re \
|
||||
lib/$perlver/$perlarch/auto/attrs
|
||||
do
|
||||
[ -d $srcdir/perl/$subdir ] || continue;
|
||||
[ -d $pkgdir/perl/$subdir ] || mkdir -p $pkgdir/perl/$subdir
|
||||
# HACK: all the files have dots in them, directories dont
|
||||
cp -pf $srcdir/perl/$subdir/*.* $pkgdir/perl/$subdir
|
||||
done
|
||||
|
||||
# where we put multi-os perl binaries
|
||||
perlbin=$pkgdir/perl/arch/$arch
|
||||
[ -d $perlbin ] || mkdir -p $perlbin
|
||||
cp -p $srcdir/perl/bin/* $perlbin/
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
exit $errors
|
||||
@@ -1,143 +0,0 @@
|
||||
# optional component perl
|
||||
# This should be run using 'gmake'
|
||||
########################################################################
|
||||
|
||||
topsrcdir = .
|
||||
|
||||
ifndef INCLUDED_CONFIG_MK
|
||||
include $(topsrcdir)/config/config.mk
|
||||
endif
|
||||
|
||||
PERL_OBJDIR = $(OBJDIR)/perl
|
||||
PERL_PKGDIR = $(PKGDIR)/perl
|
||||
|
||||
# HACK, should figure out dynamically from PERL_DIR
|
||||
PERL_REV = 5.00503
|
||||
|
||||
###package:: $(PERL_PKGDIR) package-perl
|
||||
|
||||
$(PERL_PKGDIR):
|
||||
ifeq ($(ARCH), WINNT)
|
||||
mkdir $(PERL_PKGDIR)
|
||||
mkdir $(PERL_PKGDIR)/bin
|
||||
mkdir $(PERL_PKGDIR)/lib
|
||||
mkdir $(PERL_PKGDIR)/lib/$(PERL_REV)
|
||||
mkdir $(PERL_PKGDIR)/lib/$(PERL_REV)/$(PERL_OS)
|
||||
else
|
||||
[ -d $(PERL_PKGDIR)/bin ] || mkdir -p $(PERL_PKGDIR)/bin
|
||||
[ -d $(PERL_PKGDIR)/lib ] || mkdir -p $(PERL_PKGDIR)/lib
|
||||
# subdirs created by perl install
|
||||
endif
|
||||
|
||||
ifeq ("$(PERL_FILES)", "")
|
||||
|
||||
# building our own perl
|
||||
###all:: perl
|
||||
all::
|
||||
|
||||
PERL_TARGET = $(PERL_OBJDIR)/perl
|
||||
PERL_SRCSTAMP = $(PERL_OBJDIR)/perl_src.stamp
|
||||
PERL_TESTSTAMP = $(PERL_OBJDIR)/perl_test.stamp
|
||||
PERL_CONFIG_H = $(PERL_OBJDIR)/config.h
|
||||
PERL_FINAL_PKGDIR = /opt/mstone/perl
|
||||
PERL_ADMIN = mailstone+perl@netscape.com
|
||||
PERL_PAGER = /bin/more
|
||||
|
||||
perl:: $(PERL_OBJDIR) $(PERL_TARGET) $(PERL_TESTSTAMP)
|
||||
|
||||
$(PERL_OBJDIR):
|
||||
ifeq ($(ARCH), WINNT)
|
||||
mkdir $(PERL_OBJDIR)
|
||||
else
|
||||
[ -d $(PERL_OBJDIR) ] || mkdir -p $(PERL_OBJDIR)
|
||||
endif
|
||||
|
||||
$(PERL_TARGET): $(PERL_CONFIG_H)
|
||||
@$(ECHO) "\n===== [`date`] making perl...\n"
|
||||
( cd $(PERL_OBJDIR); $(MAKE) MAKE=$(MAKE) )
|
||||
@$(ECHO) "\n===== [`date`] making perl done.\n"
|
||||
|
||||
$(PERL_CONFIG_H): $(PERL_OBJDIR)/config.over
|
||||
@$(ECHO) "\n===== [`date`] making perl config.h...\n"
|
||||
(\
|
||||
cd $(PERL_OBJDIR); \
|
||||
rm -f config.sh makedir makedepend makeaperl config.h cflags \
|
||||
Policy.sh Makefile writemain perl.exp perlmain.c makefile; \
|
||||
$(ECHO) MAKE=$(MAKE) MAKEFLAGS=$(MAKEFLAGS); \
|
||||
MAKEFLAGS= ; export MAKEFLAGS; \
|
||||
sh Configure -Dprefix=$(PERL_FINAL_PKGDIR) \
|
||||
-Uinstallusrbinperl -Uusethreads -Uusedl \
|
||||
-Dcc="$(CC)" -Dmake=$(MAKE) \
|
||||
-Dcf_email=$(PERL_ADMIN) \
|
||||
-Dperladmin=$(PERL_ADMIN) -Dpager=$(PERL_PAGER) $(PERL_OS_CONFIGURE) -de ; \
|
||||
)
|
||||
|
||||
$(PERL_OBJDIR)/config.over: $(PERL_SRCSTAMP)
|
||||
@$(ECHO) "\n===== [`date`] making perl config.over...\n"
|
||||
(\
|
||||
perl_pkgdir=`pwd`/$(PERL_PKGDIR); \
|
||||
cd $(PERL_OBJDIR); \
|
||||
$(ECHO) "\
|
||||
installprefix=$${perl_pkgdir}\n\
|
||||
$(ECHO) \"overriding tmp install dir from \$$prefix to \$$installprefix\"\n\
|
||||
test -d \$$installprefix || mkdir \$$installprefix\n\
|
||||
test -d \$$installprefix/bin || mkdir \$$installprefix/bin\n\
|
||||
installarchlib=\`$(ECHO) \$$installarchlib | sed \"s!\$$prefix!\$$installprefix!\"\`\n\
|
||||
installbin=\`$(ECHO) \$$installbin | sed \"s!\$$prefix!\$$installprefix!\"\`\n\
|
||||
installman1dir=\`$(ECHO) \$$installman1dir | sed \"s!\$$prefix!\$$installprefix!\"\`\n\
|
||||
installman3dir=\`$(ECHO) \$$installman3dir | sed \"s!\$$prefix!\$$installprefix!\"\`\n\
|
||||
installprivlib=\`$(ECHO) \$$installprivlib | sed \"s!\$$prefix!\$$installprefix!\"\`\n\
|
||||
installscript=\`$(ECHO) \$$installscript | sed \"s!\$$prefix!\$$installprefix!\"\`\n\
|
||||
installsitelib=\`$(ECHO) \$$installsitelib | sed \"s!\$$prefix!\$$installprefix!\"\`\n\
|
||||
installsitearch=\`$(ECHO) \$$installsitearch | sed \"s!\$$prefix!\$$installprefix!\"\`" \
|
||||
> config.over;\
|
||||
)
|
||||
|
||||
$(PERL_SRCSTAMP): $(PERL_DIR)
|
||||
@$(ECHO) "\n===== [`date`] making perl src links from $(PERL_DIR) to $(PERL_OBJDIR)...\n"
|
||||
-rm -f $(PERL_SRCSTAMP)
|
||||
[ -d $(PERL_OBJDIR) ] || mkdir -p $(PERL_OBJDIR)
|
||||
-(\
|
||||
perl_dir=`pwd`/$(PERL_DIR); \
|
||||
cd $(PERL_OBJDIR); \
|
||||
for i in `(cd $${perl_dir} && find . -type d -print)` ; do \
|
||||
$(ECHO) "linking dir $$i ..."; \
|
||||
[ -d $$i ] || mkdir $$i; \
|
||||
for j in `(cd $${perl_dir}/$$i; echo *)` ; do \
|
||||
[ -f $${perl_dir}/$$i/$$j -o -h $${perl_dir}/$$i/$$j ] && ( \
|
||||
/bin/true || $(ECHO) " $$i/$$j"; \
|
||||
ln -s $${perl_dir}/$$i/$$j $$i/$$j); \
|
||||
done; \
|
||||
done; \
|
||||
)
|
||||
touch $(PERL_SRCSTAMP)
|
||||
@$(ECHO) "\n===== [`date`] making perl src links done...\n"
|
||||
|
||||
$(PERL_TESTSTAMP): $(PERL_TARGET)
|
||||
@$(ECHO) "\n===== [`date`] making perl test-notty...\n"
|
||||
-rm -f $(PERL_TESTSTAMP)
|
||||
-( cd $(PERL_OBJDIR); $(MAKE) MAKE=$(MAKE) test-notty )
|
||||
touch $(PERL_TESTSTAMP)
|
||||
@$(ECHO) "\n===== [`date`] making perl test-notty done.\n"
|
||||
|
||||
package-perl:: $(PERL_PKGDIR)/Artistic
|
||||
@$(ECHO) "\n===== [`date`] making perl package done.\n"
|
||||
|
||||
$(PERL_PKGDIR)/Artistic:
|
||||
@$(ECHO) "\n===== [`date`] making perl package ...\n"
|
||||
( cd $(PERL_OBJDIR); $(MAKE) MAKE=$(MAKE) install )
|
||||
-rm -rf $(PERL_PKGDIR)/lib/$(PERL_REV)/*/CORE/
|
||||
cp $(PERL_OBJDIR)/Artistic $(PERL_PKGDIR)
|
||||
|
||||
else # PERL_FILES
|
||||
|
||||
# importing a perl
|
||||
package-perl:: $(PERL_PKGDIR) $(PERL_TARGET)
|
||||
|
||||
$(PERL_TARGET): $(PERL_FILES) $(PERL_BIN_FILES) $(PERL_LIB_FILES)
|
||||
cp $(PERL_FILES) $(PERL_PKGDIR)/
|
||||
cp $(PERL_BIN_FILES) $(PERL_PKGDIR)/bin/
|
||||
cp $(PERL_LIB_FILES) $(PERL_PKGDIR)/lib/$(PERL_REV)/
|
||||
cp $(PERL_LIB_OS_FILES) $(PERL_PKGDIR)/lib/$(PERL_REV)/$(PERL_OS)/
|
||||
|
||||
endif # PERL_FILES
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/bin/sh
|
||||
# The conZtents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# re-process a data run
|
||||
# by default, use the most recent one
|
||||
# Usage: process
|
||||
# or
|
||||
# Usage: process TIMESTAMP [args...]
|
||||
# or
|
||||
# Usage: process results/TIMESTAMP [args...]
|
||||
|
||||
if [ ! -x perl/bin/perl -o ! -f .license ] ; then # see if setup was ever run
|
||||
echo "Critical files are missing. Run setup."
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
if [ $# -lt 1 ] ; then # do most recent run
|
||||
# since the directories are time stamps with fixed fields,
|
||||
# alphabetical order is also time order
|
||||
dir=`ls -d results/[0-9]*.[0-9]* | tail -1`
|
||||
else # use specified run
|
||||
if [ -d results/$1 ] ; then # timestamp
|
||||
dir=results/$1
|
||||
shift
|
||||
elif [ -d $1 ] ; then # results/timestamp
|
||||
dir=$1
|
||||
shift
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$dir" ] ; then
|
||||
if [ -f $dir/all.wld ] ; then # unified workload file
|
||||
perl/bin/perl -Ibin -- bin/process.pl -w $dir/all.wld "$@"
|
||||
else # BACK COMPATIBILITY form
|
||||
perl/bin/perl -Ibin -- bin/process.pl -c $dir/config.cfg "$@"
|
||||
fi
|
||||
else # pass in whatever they gave us
|
||||
perl/bin/perl -Ibin -- bin/process.pl "$@"
|
||||
fi
|
||||
@@ -1,30 +0,0 @@
|
||||
@if not "%echo%" == "on" echo off
|
||||
|
||||
setlocal
|
||||
|
||||
REM
|
||||
REM This a processes a previous test with the correct path to perl.
|
||||
REM
|
||||
REM Usage: process TIMESTAMP [arguments]
|
||||
REM
|
||||
|
||||
if "%1" == "" goto Usage
|
||||
|
||||
perl\bin\perl -Ibin -- bin/process.pl -c results\%1\config.cfg %2 %3 %4 %5 %6 %7 %8 %9
|
||||
|
||||
goto end
|
||||
|
||||
:Usage
|
||||
|
||||
echo.
|
||||
echo Usage: %0 TIMESTAMP [arguments]
|
||||
echo.
|
||||
echo where TIMESTAMP is one of the directories in the results\ subdirectory
|
||||
goto end
|
||||
|
||||
:end
|
||||
|
||||
echo.
|
||||
|
||||
endlocal
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
@if not "%echo%" == "on" echo off
|
||||
REM
|
||||
REM copy program and messages to temp directory
|
||||
REM
|
||||
|
||||
setlocal
|
||||
|
||||
set OS_ARCH=WINNT
|
||||
set OS_RELEASE=4.0
|
||||
set OS_CONFIG=%OS_ARCH%%OS_RELEASE%
|
||||
|
||||
if not exist perl\nul mkdir perl
|
||||
if not exist perl\bin\nul mkdir perl\bin
|
||||
if exist perl\bin\perl.exe goto PerlExists
|
||||
|
||||
if not exist perl\arch\%OS_CONFIG%\perl.exe goto NoPerl
|
||||
|
||||
copy perl\arch\%OS_CONFIG%\*.* perl\bin > nul
|
||||
|
||||
if not exist perl\bin\perl.exe goto NoPerl
|
||||
|
||||
:PerlExists
|
||||
|
||||
if not exist gd\nul mkdir gd
|
||||
if exist gd\gd.html goto GDExists
|
||||
|
||||
if not exist bin\%OS_CONFIG%\gd\gd.html goto NoGD
|
||||
|
||||
copy bin\%OS_CONFIG%\gd\* gd > nul
|
||||
|
||||
if not exist gd\gd.html goto NoGD
|
||||
|
||||
:GDExists
|
||||
|
||||
if not exist gnuplot\nul mkdir gnuplot
|
||||
if exist gnuplot\gnuplot.exe goto GnuPlotExists
|
||||
|
||||
if not exist bin\%OS_CONFIG%\gnuplot\gnuplot.exe goto NoGnuPlot
|
||||
|
||||
copy bin\%OS_CONFIG%\gnuplot\* gnuplot > nul
|
||||
|
||||
if not exist gnuplot\gnuplot.exe goto NoGnuPlot
|
||||
|
||||
:GnuPlotExists
|
||||
|
||||
if not exist bin\nul mkdir bin
|
||||
if exist bin\mailclient.exe goto MailClientExists
|
||||
|
||||
if not exist bin\%OS_CONFIG%\bin\mailclient.exe goto NoMailClient
|
||||
|
||||
copy bin\%OS_CONFIG%\bin\mailclient.exe bin > nul
|
||||
|
||||
:MailClientExists
|
||||
|
||||
REM Mode is our name unless the first word is a known mode
|
||||
set MODE=%0
|
||||
REM SetMode will jump back to ModeCheckDone
|
||||
if "%1" == "setup" goto SetMode
|
||||
if "%1" == "cleanup" goto SetMode
|
||||
if "%1" == "config" goto SetMode
|
||||
if "%1" == "checktime" goto SetMode
|
||||
|
||||
:ModeCheckDone
|
||||
|
||||
REM All the OS setup is done, now make the copies for test execution
|
||||
|
||||
REM While debugging the perl version, just do the copies
|
||||
copy data\*.msg %TEMP% > nul
|
||||
copy bin\mailclient.exe %TEMP% > nul
|
||||
|
||||
REM Run the perl version of setup to handle license and configuration
|
||||
perl\bin\perl -Ibin -- bin\setup.pl %MODE% TEMPDIR=%TEMP% -w conf\general.wld -z %1 %2 %3 %4 %5 %6 %7 %8
|
||||
|
||||
|
||||
goto end
|
||||
|
||||
:SetMode
|
||||
|
||||
REM set the MODE to be the arg1 instead of arg0. shift remaining args
|
||||
set MODE=%1
|
||||
shift
|
||||
goto ModeCheckDone
|
||||
|
||||
|
||||
:NoPerl
|
||||
|
||||
echo.
|
||||
echo ERROR: Cannot find perl\arch\%OS_CONFIG%\perl.exe nor perl\bin\perl.exe
|
||||
echo.
|
||||
echo Either your mailstone package is incomplete, or you are
|
||||
echo attempting to run setup.bat from the wrong location.
|
||||
goto end
|
||||
|
||||
:NoGD
|
||||
|
||||
echo.
|
||||
echo ERROR: Cannot find bin\%OS_CONFIG%\gd\gd.html nor gd\gd.html
|
||||
echo.
|
||||
echo Either your mailstone package is incomplete, or you are
|
||||
echo attempting to run setup.bat from the wrong location.
|
||||
goto end
|
||||
|
||||
:NoGnuPlot
|
||||
|
||||
echo.
|
||||
echo ERROR: Cannot find bin\%OS_CONFIG%\gnuplot\gnuplot.exe nor gnuplot\gnuplot.exe
|
||||
echo.
|
||||
echo Either your mailstone package is incomplete, or you are
|
||||
echo attempting to run setup.bat from the wrong location.
|
||||
goto end
|
||||
|
||||
:NoMailClient
|
||||
|
||||
echo.
|
||||
echo ERROR: Cannot find bin\%OS_CONFIG%\bin\mailclient.exe nor bin\mailclient.exe
|
||||
echo.
|
||||
echo Either your mailstone package is incomplete, or you are
|
||||
echo attempting to run setup.bat from the wrong location.
|
||||
goto end
|
||||
|
||||
:end
|
||||
|
||||
echo.
|
||||
|
||||
endlocal
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
# Makefile for mailstone
|
||||
# This should be run using 'gmake'
|
||||
########################################################################
|
||||
|
||||
topsrcdir = ..
|
||||
|
||||
ifndef INCLUDED_CONFIG_MK
|
||||
include $(topsrcdir)/config/config.mk
|
||||
endif
|
||||
|
||||
# you may want to force debug on the command line (default is release)
|
||||
# BUILD_VARIANT=debug
|
||||
# pass in extra compile arguments in CPPFLAGS
|
||||
|
||||
BINDIR = ../bin
|
||||
|
||||
########################################################################
|
||||
|
||||
# what are we making
|
||||
|
||||
all:: $(OBJDIR) mailclient
|
||||
|
||||
########################################################################
|
||||
|
||||
.SUFFIXES: .c .$(OBJ_SUFFIX)
|
||||
|
||||
.SUFFIXES: .c .$(OBJ_SUFFIX)
|
||||
|
||||
.c.$(OBJ_SUFFIX):
|
||||
ifeq ($(ARCH), WINNT)
|
||||
$(COMPILE) -c -MT $< -Fo$(OBJDIR)/$@
|
||||
else
|
||||
$(COMPILE) -c $< -o $(OBJDIR)/$@
|
||||
endif
|
||||
|
||||
$(OBJDIR)/%.$(OBJ_SUFFIX): %.c
|
||||
ifeq ($(ARCH), WINNT)
|
||||
$(COMPILE) -c -MT $< -Fo$(OBJDIR)/$*.$(OBJ_SUFFIX)
|
||||
else
|
||||
$(COMPILE) -c $< -o $(OBJDIR)/$*.$(OBJ_SUFFIX)
|
||||
endif
|
||||
|
||||
########################################################################
|
||||
# mailclient itself
|
||||
|
||||
STONE = $(OBJDIR)/mailclient$(EXE_SUFFIX)
|
||||
|
||||
STONESRCS = bench.c client.c errexit.c main.c \
|
||||
parse.c sysdep.c timefunc.c \
|
||||
http-util.c http.c imap4.c pop3.c smtp.c wmap.c
|
||||
|
||||
STONEOBJS = $(addprefix $(OBJDIR)/, $(STONESRCS:.c=.$(OBJ_SUFFIX)) )
|
||||
|
||||
|
||||
mailclient:: $(STONE)
|
||||
|
||||
$(OBJDIR):
|
||||
mkdir -p $(OBJDIR)
|
||||
|
||||
$(STONE): $(STONEOBJS) Makefile
|
||||
@$(ECHO) "\n===== [`date`] making $(STONE)...\n"
|
||||
$(COMPILE) $(STONEOBJS) $(LIBPATH) $(LIBS) $(OS_LINKFLAGS) -o $(STONE)
|
||||
|
||||
$(OBJDIR)/bench.$(OBJ_SUFFIX): bench.c bench.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/client.$(OBJ_SUFFIX): client.c bench.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/errexit.$(OBJ_SUFFIX): errexit.c bench.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/http.$(OBJ_SUFFIX): http.c bench.h sysdep.h http-util.h Makefile
|
||||
|
||||
$(OBJDIR)/imap4.$(OBJ_SUFFIX): imap4.c bench.h pish.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/main.$(OBJ_SUFFIX): main.c bench.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/parse.$(OBJ_SUFFIX): parse.c bench.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/pop3.$(OBJ_SUFFIX): pop3.c bench.h pish.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/smtp.$(OBJ_SUFFIX): smtp.c bench.h pish.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/stats.$(OBJ_SUFFIX): stats.c bench.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/sysdep.$(OBJ_SUFFIX): sysdep.c bench.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/timefunc.$(OBJ_SUFFIX): timefunc.c bench.h sysdep.h Makefile
|
||||
|
||||
$(OBJDIR)/wmap.$(OBJ_SUFFIX): wmap.c bench.h sysdep.h Makefile http-util.h
|
||||
|
||||
$(OBJDIR)/http-util.$(OBJ_SUFFIX): http-util.c bench.h sysdep.h Makefile http-util.h
|
||||
|
||||
# currently broken. See ../Makefile for packaging
|
||||
install: all
|
||||
$(CP) $(STONE) $(BINDIR)
|
||||
|
||||
# clean out everything that we created.
|
||||
distclean:: clean
|
||||
$(RM) -rf $(OBJDIR)
|
||||
|
||||
# clean out the intermediate files, keep the executable
|
||||
clean::
|
||||
$(RM) $(STONEOBJS)
|
||||
|
||||
debug::
|
||||
@$(ECHO) "\n===== [`date`] making debug...\n"
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG
|
||||
|
||||
release::
|
||||
@$(ECHO) "\n===== [`date`] making release...\n"
|
||||
$(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT
|
||||
|
||||
########################################################################
|
||||
@@ -1,61 +0,0 @@
|
||||
|
||||
To build on a new OS, simply edit the Makefile to reflect your
|
||||
compilers and options.
|
||||
|
||||
Everything currently builds on Linux-2.1/2.2, Solaris-2.5.1/2.6, HPUX-11
|
||||
IRIX-6.5, AIX-4.2, OSF1-4.0 and NT-4. Operating systems without
|
||||
POSIX threads (or NT threads) will be limited.
|
||||
|
||||
NT uses ../autobuild.bat, *.dsw, and *.mak.
|
||||
|
||||
Perl is imported from a common build area.
|
||||
|
||||
Notes on protocol plug in API:
|
||||
|
||||
|
||||
Fundamental data structures:
|
||||
|
||||
event_timer_t
|
||||
Holds the critical results information. This gets added up
|
||||
over all the block in all the threads periodically during the test.
|
||||
|
||||
cmd_stats_t
|
||||
This holds all the dynamic information including event timers,
|
||||
and state for sequencing the command block (like next login).
|
||||
|
||||
mail_command_t
|
||||
This hold all the read only information about a command block.
|
||||
|
||||
thread_context_t
|
||||
All the information about each thread. There is one thread
|
||||
per server connection.
|
||||
|
||||
range_t
|
||||
Integer range based on a starting number and a length. This
|
||||
can be sequentially or randomly returned. This needs to be adjusted
|
||||
for each command thread.
|
||||
|
||||
protocol_t
|
||||
This defines the callbacks and shared information for each protocol.
|
||||
|
||||
|
||||
|
||||
Adding a new protocol:
|
||||
Create all the handler functions. Look at smtp.c for an example
|
||||
|
||||
Add the entry to g_protocols in main.c
|
||||
|
||||
Add it to the makefiles
|
||||
|
||||
|
||||
Design issues:
|
||||
Timing accuracy
|
||||
|
||||
Scalability (current limit is 26000 clients/machine)
|
||||
|
||||
Extendibility
|
||||
|
||||
Memory use (limits scalability)
|
||||
|
||||
Result data efficiency
|
||||
|
||||
@@ -1,841 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
* Mike Blakely
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/*
|
||||
bench.c has all the OS independent utilities.
|
||||
*/
|
||||
#include "bench.h"
|
||||
|
||||
/* allocate memory and exit if out of memory */
|
||||
void *
|
||||
mymalloc(size_t size)
|
||||
{
|
||||
void *ptr;
|
||||
|
||||
ptr = malloc(size);
|
||||
if (ptr == NULL)
|
||||
errexit(stderr, "Call to malloc(%d) failed\n", size);
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
void *
|
||||
mycalloc(size_t size)
|
||||
{
|
||||
void *retp;
|
||||
|
||||
if ((retp = mymalloc(size)) == NULL)
|
||||
return NULL;
|
||||
memset(retp, 0, size);
|
||||
return(retp);
|
||||
}
|
||||
|
||||
/* allocate memory and exit if out of memory */
|
||||
void *
|
||||
myrealloc(void *ptr, size_t size)
|
||||
{
|
||||
ptr = realloc(ptr, size);
|
||||
if (ptr == NULL)
|
||||
errexit(stderr, "Call to realloc(%d, %d) failed\n", ptr, size);
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
void
|
||||
myfree(void *ptr)
|
||||
{
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
char *
|
||||
mystrdup(const char *cp)
|
||||
{
|
||||
char *retcp;
|
||||
|
||||
if ((retcp = (char *)mymalloc(strlen(cp)+1)) == NULL)
|
||||
return NULL;
|
||||
strcpy(retcp, cp);
|
||||
|
||||
return retcp;
|
||||
}
|
||||
|
||||
/*
|
||||
* waitReadWrite(int fd, int flags)
|
||||
* parameter: fd: file descriptor
|
||||
* read_write: 0 --> read
|
||||
* 1 --> write
|
||||
* 2 --> read & write
|
||||
* return: NON-Zero something is read
|
||||
* 0 sth is wrong
|
||||
*/
|
||||
|
||||
#define CHECK_READ 0x0
|
||||
#define CHECK_WRITE 0x1
|
||||
#define CHECK_RW 0x2
|
||||
#define CHECK_ALL 0x3
|
||||
#define CHECK_FOREVER 0x4
|
||||
|
||||
#define waitReadable(fd) waitReadWrite((fd),CHECK_READ)
|
||||
#define waitWriteable(fd) waitReadWrite((fd),CHECK_WRITE)
|
||||
#define waitWriteableForever(fd) waitReadWrite((fd),CHECK_WRITE | CHECK_FOREVER)
|
||||
|
||||
/* Return 1 if bytes readable; 0 if error or time up */
|
||||
int
|
||||
waitReadWrite(int fd, int flags)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return 0;
|
||||
#else
|
||||
struct pollfd pfd;
|
||||
int timeleft;
|
||||
int ret;
|
||||
int timeouts = 0;
|
||||
|
||||
pfd.fd = fd;
|
||||
pfd.events = POLLHUP;
|
||||
|
||||
if ((flags & CHECK_ALL) == CHECK_READ) {
|
||||
pfd.events |= POLLIN;
|
||||
} else if ((flags & CHECK_ALL) == CHECK_WRITE) {
|
||||
pfd.events |= POLLOUT;
|
||||
} else if ((flags & CHECK_ALL) == CHECK_RW) {
|
||||
pfd.events |= (POLLIN | POLLOUT);
|
||||
}
|
||||
for (;;) {
|
||||
if (flags & CHECK_FOREVER) { /* for writing status out */
|
||||
timeleft = 60;
|
||||
} else {
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
D_PRINTF(stderr, "waitReadWrite gf_timeexpired=%d\n",
|
||||
gf_timeexpired);
|
||||
return 0;
|
||||
}
|
||||
timeleft = 5;
|
||||
}
|
||||
|
||||
/*fprintf(stderr, "poll(%d,%d)\n", fd, timeleft*1000);*/
|
||||
ret = poll(&pfd, 1, timeleft*1000);
|
||||
/*fprintf(stderr, "poll(%d,%d)=%d\n", fd, timeleft*1000, ret);*/
|
||||
|
||||
if (ret == 0) {
|
||||
if (!(flags & CHECK_FOREVER) && (++timeouts >= 12)) {
|
||||
return 0; /* time out after 60sec total */
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
if (errno == EAGAIN || errno == EINTR)
|
||||
continue;
|
||||
D_PRINTF(stderr, "waitReadWrite error ret=%d\n", ret);
|
||||
break;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* error */
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
retryRead(ptcx_t ptcx, SOCKET sock, char *buf, int count)
|
||||
{
|
||||
int ret;
|
||||
int bytesread = 0;
|
||||
|
||||
D_PRINTF(debugfile, "retryRead(%d, %d (gf_timeexpired=%d))\n",
|
||||
sock, count, gf_timeexpired);
|
||||
while (count) {
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
D_PRINTF (debugfile, "retryRead gf_timeexpired\n");
|
||||
strcpy (ptcx->errMsg, "retryRead:TIMEOUT");
|
||||
break;
|
||||
}
|
||||
if (0 == waitReadable (sock)) {
|
||||
D_PRINTF (debugfile, "retryRead waitReadable time/error\n");
|
||||
strcpy (ptcx->errMsg, "waitReadable TIMEOUT<retryRead");
|
||||
break;
|
||||
}
|
||||
ret = NETREAD(sock, buf, count);
|
||||
if (ret < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
if (errno == EAGAIN) {
|
||||
if (bytesread > 0)
|
||||
break; /* return what we got so far */
|
||||
if (waitReadable(sock)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (bytesread == 0) {
|
||||
bytesread = -1;
|
||||
}
|
||||
sprintf (ptcx->errMsg, "retryRead(sock=%d) IO error", sock);
|
||||
break;
|
||||
}
|
||||
bytesread += ret;
|
||||
buf += ret;
|
||||
count -= ret;
|
||||
break; /* return any good bytes */
|
||||
}
|
||||
D_PRINTF(debugfile, "retryRead(%d, %d)=%d\n", sock, count, bytesread);
|
||||
return bytesread;
|
||||
}
|
||||
|
||||
int
|
||||
retryWrite(ptcx_t ptcx, SOCKET sock, char *buf, int count)
|
||||
{
|
||||
int ret;
|
||||
int byteswritten = 0;
|
||||
|
||||
D_PRINTF(debugfile, "retryWrite(%d, %d)...\n", sock, count);
|
||||
while (count) {
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
D_PRINTF (debugfile, "retryWrite gf_timeexpired\n");
|
||||
strcpy (ptcx->errMsg, "read:timeout");
|
||||
break;
|
||||
}
|
||||
ret = NETWRITE(sock, buf, count);
|
||||
if (ret < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
if (errno == EAGAIN) {
|
||||
if (waitWriteable(sock)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (byteswritten == 0) {
|
||||
byteswritten = -1;
|
||||
}
|
||||
sprintf (ptcx->errMsg,
|
||||
"retryWrite(sock=%d, n=%d) IO error", sock, count);
|
||||
break;
|
||||
}
|
||||
byteswritten += ret;
|
||||
buf += ret;
|
||||
count -= ret;
|
||||
}
|
||||
D_PRINTF(debugfile, "retryWrite(%d, ?)=%d\n", sock, byteswritten);
|
||||
return byteswritten;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
readResponse(ptcx_t ptcx, SOCKET sock, char *buffer, int buflen)
|
||||
{
|
||||
/* read the server response and do nothing with it */
|
||||
int totalbytesread = 0;
|
||||
int resplen = 0;
|
||||
int bytesread;
|
||||
char *offset;
|
||||
|
||||
memset (buffer, 0, sizeof(buffer));
|
||||
while (totalbytesread < buflen)
|
||||
{
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
D_PRINTF(debugfile,"readResponse() Time expired.\n");
|
||||
break;
|
||||
}
|
||||
if ((bytesread = retryRead(ptcx, sock, buffer+totalbytesread,
|
||||
buflen-totalbytesread)) <= 0) {
|
||||
strcat (ptcx->errMsg, "<ReadResponse");
|
||||
return -1;
|
||||
}
|
||||
totalbytesread += bytesread;
|
||||
|
||||
buffer[totalbytesread] = 0;
|
||||
/* search for end of response (assume single line) */
|
||||
if ((offset = strstr(buffer, "\n"))) {
|
||||
resplen = offset - buffer + 1;
|
||||
break;
|
||||
} else if ((offset = strstr(buffer, "\r\n"))) {
|
||||
resplen = offset - buffer + 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
D_PRINTF(debugfile, "Read from server: %s\n", buffer );
|
||||
|
||||
ptcx->bytesread += resplen;
|
||||
|
||||
return resplen;
|
||||
}
|
||||
|
||||
/* expects pointers to buffers of these sizes */
|
||||
/* char command[MAX_COMMAND_LEN] */
|
||||
/* char response[MAX_RESPONSE_LEN] */
|
||||
|
||||
int
|
||||
doCommandResponse(ptcx_t ptcx, SOCKET sock, char *command, char *response, int resplen)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (response == NULL)
|
||||
return -1;
|
||||
memset(response, 0, resplen);
|
||||
|
||||
/* send the command already formatted */
|
||||
if ((ret = sendCommand(ptcx, sock, command)) == -1) {
|
||||
strcat (ptcx->errMsg, "<doCommandResponse");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* read server response line */
|
||||
if ((ret = readResponse(ptcx, sock, response, resplen)) <= 0) {
|
||||
strcat (ptcx->errMsg, "<doCommandResponse");
|
||||
return -1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
sendCommand(ptcx_t ptcx, SOCKET sock, char *command)
|
||||
{
|
||||
int writelen;
|
||||
int sentbytes = 0;
|
||||
int sent;
|
||||
|
||||
D_PRINTF(debugfile, "sendCommand(%s)\n", command );
|
||||
|
||||
writelen = strlen(command);
|
||||
|
||||
while (sentbytes < writelen) {
|
||||
if ((sent = retryWrite(ptcx, sock, command + sentbytes,
|
||||
writelen - sentbytes)) == -1) {
|
||||
strcat (ptcx->errMsg, "<sendCommand");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sentbytes += sent;
|
||||
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
D_PRINTF(debugfile,"sendCommand() Time expired.\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ptcx->byteswritten += sentbytes;
|
||||
|
||||
return sentbytes;
|
||||
}
|
||||
|
||||
/* This is how status messages are sent */
|
||||
int
|
||||
sendOutput(int fd, char *string)
|
||||
{
|
||||
int writelen;
|
||||
int sentbytes = 0;
|
||||
int sent;
|
||||
|
||||
/*D_PRINTF(stderr, "sendOutput(%d, %s)\n", fd, string );*/
|
||||
|
||||
writelen = strlen(string);
|
||||
|
||||
while (sentbytes < writelen) {
|
||||
sent = OUTPUT_WRITE(fd, string + sentbytes, writelen - sentbytes);
|
||||
|
||||
if (sent == -1) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
if (errno == EAGAIN) {
|
||||
if (waitWriteableForever(fd))
|
||||
continue;
|
||||
else
|
||||
returnerr(stderr,
|
||||
"sendOutput(%d) - Got EAGAIN and fd not ready\n",
|
||||
fd); /* has this ever happened? die??? */
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
sentbytes += sent;
|
||||
|
||||
#if 0
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
D_PRINTF(stderr,"sendOutput() Time expired.\n");
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return sentbytes;
|
||||
}
|
||||
|
||||
/* read from socket until we find <CRLF>.<CRLF> */
|
||||
int
|
||||
retrMsg(ptcx_t ptcx, char *buffer, int maxBytes, SOCKET sock)
|
||||
{
|
||||
int totalbytesread = 0;
|
||||
int bytesread;
|
||||
int sz;
|
||||
char garbage[10000], *sp;
|
||||
|
||||
if (buffer) {
|
||||
sp = buffer;
|
||||
sz = maxBytes-1;
|
||||
} else {
|
||||
sp = garbage;
|
||||
sz = sizeof (garbage)-1;
|
||||
}
|
||||
|
||||
while (!buffer || (totalbytesread < maxBytes)) {
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
D_PRINTF(debugfile,"Time expired while reading messages - in retrMsg\n");
|
||||
break;
|
||||
}
|
||||
|
||||
bytesread = retryRead(ptcx, sock,
|
||||
sp+totalbytesread, sz-totalbytesread);
|
||||
|
||||
/*D_PRINTF (stderr, "retrMsg: got %d bytes\n", bytesread);*/
|
||||
if (bytesread <= 0) {
|
||||
strcat (ptcx->errMsg, "<retrMsg");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ptcx->bytesread += bytesread;
|
||||
totalbytesread += bytesread;
|
||||
|
||||
sp[totalbytesread] = 0; /* terminate string */
|
||||
if (NULL != strstr (sp, "\r\n.\r\n")) {
|
||||
D_PRINTF (stderr, "retrMsg: saw terminating string\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (!strncmp (sp, "-ERR", 4)) { /* watch for error response */
|
||||
trimEndWhite (sp);
|
||||
sprintf (ptcx->errMsg, "retrMsg: ERROR response=[%.40s]", sp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!buffer && (totalbytesread > 5)) { /* reset our scratch buffer */
|
||||
int i;
|
||||
char *from, *to;
|
||||
/* shuffle last 5 bytes to start */
|
||||
from = sp + totalbytesread - 5;
|
||||
to = garbage;
|
||||
for (i=5; i > 0; --i)
|
||||
*to++ = *from++;
|
||||
totalbytesread = 5;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return totalbytesread;
|
||||
}
|
||||
|
||||
/*
|
||||
Record current time
|
||||
*/
|
||||
int
|
||||
timeval_stamp(struct timeval *tv)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = GETTIMEOFDAY(tv, NULL);
|
||||
if (rc != 0) {
|
||||
errexit(stderr, "Error from gettimeofday()\n");
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
This is the main event timing routine. This resets counters
|
||||
Note that event timing cannot be nested.
|
||||
*/
|
||||
void
|
||||
event_start(ptcx_t ptcx, event_timer_t *pevent)
|
||||
{
|
||||
ptcx->bytesread = 0;
|
||||
ptcx->byteswritten = 0;
|
||||
timeval_stamp(&ptcx->starttime);
|
||||
}
|
||||
|
||||
/*
|
||||
This ends an event and increments the counters
|
||||
Multiple stops are no longer allowed. (broke min, max, and sum of t*t)
|
||||
*/
|
||||
void
|
||||
event_stop(ptcx_t ptcx, event_timer_t *pevent)
|
||||
{
|
||||
struct timeval tv;
|
||||
double t;
|
||||
|
||||
timeval_stamp(&tv); /* get the time */
|
||||
|
||||
if (gf_timeexpired >= EXIT_FAST) { /* if aborting run, ignore it */
|
||||
return;
|
||||
}
|
||||
pevent->trys++; /* count try with time */
|
||||
pevent->bytesread += ptcx->bytesread;
|
||||
pevent->byteswritten += ptcx->byteswritten;
|
||||
t = compdifftime_double(&tv, &ptcx->starttime); /* find time span */
|
||||
pevent->elapsedtime += t;
|
||||
pevent->elapsedtimesq += t * t;
|
||||
|
||||
if (t > pevent->maxtime) /* check max time */
|
||||
pevent->maxtime = t;
|
||||
|
||||
/* this gets initialized to 0.0 */
|
||||
if (!pevent->mintime || /* check min time */
|
||||
((t > 0.0) && (t < pevent->mintime))) /* smallest non 0 time */
|
||||
pevent->mintime = t;
|
||||
}
|
||||
|
||||
/*
|
||||
reset the event structure
|
||||
*/
|
||||
void
|
||||
event_reset(event_timer_t *pevent)
|
||||
{
|
||||
memset(pevent, 0, sizeof(event_timer_t));
|
||||
}
|
||||
|
||||
/*
|
||||
Add pincr event into psum event
|
||||
*/
|
||||
void
|
||||
event_sum(event_timer_t *psum, event_timer_t *pincr)
|
||||
{
|
||||
psum->trys += pincr->trys;
|
||||
psum->errs += pincr->errs;
|
||||
psum->bytesread += pincr->bytesread;
|
||||
psum->byteswritten += pincr->byteswritten;
|
||||
psum->elapsedtime += pincr->elapsedtime;
|
||||
psum->elapsedtimesq += pincr->elapsedtimesq;
|
||||
if (pincr->maxtime > psum->maxtime)
|
||||
psum->maxtime = pincr->maxtime;
|
||||
if (!psum->mintime ||
|
||||
((pincr->mintime > 0.0) && (pincr->mintime < psum->mintime)))
|
||||
psum->mintime = pincr->mintime;
|
||||
}
|
||||
|
||||
/* Format string for every timer. Must match event_to_text */
|
||||
const char *gs_eventToTextFormat = "Try+Error/BytesR+BytesW/Time[TimeMin,TimeMax]Time2";
|
||||
|
||||
/*
|
||||
Output event into ebuf.
|
||||
*/
|
||||
char *
|
||||
event_to_text(event_timer_t *pevent, char *ebuf)
|
||||
{
|
||||
/* these have to be sane to avoid overflowing the print buffer */
|
||||
assert (pevent->bytesread < 1.0e20);
|
||||
assert (pevent->byteswritten < 1.0e20);
|
||||
assert (pevent->elapsedtime < 1.0e10);
|
||||
assert (pevent->maxtime < 1.0e10);
|
||||
assert (pevent->elapsedtimesq < 1.0e20);
|
||||
if (pevent->elapsedtime) {
|
||||
sprintf(ebuf, "%ld+%ld/%.0f+%.0f/%.6f[%.6f,%.6f]%.6f",
|
||||
pevent->trys, pevent->errs,
|
||||
pevent->bytesread, pevent->byteswritten,
|
||||
pevent->elapsedtime,
|
||||
pevent->mintime,
|
||||
pevent->maxtime,
|
||||
pevent->elapsedtimesq);
|
||||
} else { /* trim extra 0s for simple case*/
|
||||
sprintf(ebuf, "%ld+%ld/%.0f+%.0f/0.0[0.0,0.0]0.0",
|
||||
pevent->trys, pevent->errs,
|
||||
pevent->bytesread, pevent->byteswritten);
|
||||
}
|
||||
return ebuf;
|
||||
}
|
||||
|
||||
/*
|
||||
Given the last value we returned, return the next sequential or random value
|
||||
If the initial value is out of the range, a valid number will be returned.
|
||||
*/
|
||||
unsigned long
|
||||
rangeNext (range_t *range, unsigned long last)
|
||||
{
|
||||
unsigned long n;
|
||||
|
||||
assert (range != NULL);
|
||||
|
||||
if (range->span == 0) /* empty range (span = 0) */
|
||||
return range->first;
|
||||
|
||||
if (range->sequential > 0) { /* incrementing sequential */
|
||||
n = last + 1;
|
||||
} else if (range->sequential < 0) { /* decrementing sequential */
|
||||
n = last - 1;
|
||||
} else { /* random */
|
||||
n = range->first + (RANDOM() % (range->span+1));
|
||||
assert ((n >= range->first) && (n <= range->last));
|
||||
}
|
||||
/* check range */
|
||||
if (n > range->last) n = range->first;
|
||||
if (n < range->first) n = range->last;
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
Setup range given a first and last valid values (inclusive)
|
||||
Direction: + incrementing, 0 random, - decrementing
|
||||
If first and last are reversed, it will adjust accordingly
|
||||
*/
|
||||
void
|
||||
rangeSetFirstLast (range_t *range,
|
||||
unsigned long first,
|
||||
unsigned long last,
|
||||
int dir)
|
||||
{
|
||||
assert (range != NULL);
|
||||
if (last > first) {
|
||||
range->first = first;
|
||||
range->last = last;
|
||||
range->sequential = dir;
|
||||
} else {
|
||||
range->first = last;
|
||||
range->last = first;
|
||||
range->sequential = -dir;
|
||||
}
|
||||
range->span = range->last - range->first;
|
||||
}
|
||||
|
||||
/*
|
||||
Setup range given a first valid value (inclusive) and number (1..)
|
||||
Direction: + incrementing, 0 random, - decrementing
|
||||
*/
|
||||
void
|
||||
rangeSetFirstCount (range_t *range,
|
||||
unsigned long first,
|
||||
unsigned long num,
|
||||
int dir)
|
||||
{
|
||||
assert (range != NULL);
|
||||
if (num > 0) --num; /* adjust to internal notation */
|
||||
range->first = first;
|
||||
range->span = num;
|
||||
range->last = range->first + range->span;
|
||||
range->sequential = dir;
|
||||
}
|
||||
|
||||
/*
|
||||
Given a specified range, split it based on process and thread
|
||||
*/
|
||||
void
|
||||
rangeSplit (range_t *whole, range_t *sub, int pnum, int tnum)
|
||||
{
|
||||
unsigned long perproc, first, count;
|
||||
|
||||
if (!whole->sequential) { /* just copy it */
|
||||
sub->first = whole->first;
|
||||
sub->last = whole->last;
|
||||
sub->span = whole->span;
|
||||
sub->sequential = whole->sequential;
|
||||
return;
|
||||
}
|
||||
/* To avoid cumulative rounding errors,
|
||||
the 0th process/thread rounds up, all others round down */
|
||||
perproc = (pnum > 0)
|
||||
? (whole->span+1) / gn_numprocs
|
||||
: (whole->span+1 + gn_numprocs - 1) / gn_numprocs;
|
||||
|
||||
if (perproc <= 0) perproc = 1; /* in case logins > processes */
|
||||
|
||||
if (gn_numthreads > 0) {
|
||||
unsigned long perthread;
|
||||
perthread = (tnum > 0)
|
||||
? perproc / gn_numthreads
|
||||
: (perproc + gn_numthreads - 1) / gn_numthreads;
|
||||
|
||||
if (perthread <= 0) perthread = 1; /* in case logins > threads */
|
||||
|
||||
first = whole->first + (perproc * pnum) + (perthread * tnum);
|
||||
count = perthread;
|
||||
} else {
|
||||
first = whole->first + (perproc * pnum);
|
||||
count = perproc;
|
||||
}
|
||||
/* If logins > processes*threads, we have to wrap the space */
|
||||
while (first >= (whole->first + whole->span+1)) {
|
||||
first -= whole->span+1;
|
||||
}
|
||||
assert (first >= whole->first);
|
||||
|
||||
rangeSetFirstCount (sub, first, count, whole->sequential);
|
||||
}
|
||||
|
||||
/*
|
||||
clear protocol independ parts of cmd_stats_t
|
||||
*/
|
||||
void
|
||||
cmdStatsInit (cmd_stats_t *p)
|
||||
{
|
||||
assert (NULL != p);
|
||||
|
||||
p->totalerrs = 0;
|
||||
p->totalcommands = 0;
|
||||
event_reset (&p->combined);
|
||||
event_reset (&p->idle);
|
||||
}
|
||||
|
||||
void
|
||||
stats_init(stats_t *p)
|
||||
{
|
||||
memset(p, 0, sizeof(*p));
|
||||
}
|
||||
|
||||
/*
|
||||
Given a buffer, trim tailing CR-NL and whitespace from it
|
||||
Moves 0 terminator to exclude extra portion.
|
||||
*/
|
||||
void
|
||||
trimEndWhite (char *buff)
|
||||
{
|
||||
char *cp;
|
||||
|
||||
if (!buff) return;
|
||||
|
||||
for (cp = buff; *cp; ++cp); /* find the end */
|
||||
while (cp > buff) {
|
||||
--cp;
|
||||
if ((*cp != '\n') && (*cp !='\r')
|
||||
&& (*cp != '\t') && (*cp != ' ')) return;
|
||||
*cp = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 /* never used */
|
||||
|
||||
int
|
||||
timeval_clear(struct timeval *tv)
|
||||
{
|
||||
if (tv == NULL)
|
||||
return -1;
|
||||
|
||||
tv->tv_sec = 0;
|
||||
tv->tv_usec = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* timetextbuf should be (SIZEOF_TIMEVALTEXT + 1) */
|
||||
char *
|
||||
timeval_to_text(const struct timeval *the_timeval, char *timetextbuf)
|
||||
{
|
||||
/*
|
||||
* given a timeval (seconds and microseconds), put the text
|
||||
* "seconds.microseconds" into timeval_as_text
|
||||
*/
|
||||
int seconds, microseconds;
|
||||
|
||||
seconds = the_timeval->tv_sec;
|
||||
microseconds = the_timeval->tv_usec;
|
||||
sprintf(timetextbuf, "%10d.%6.6d\t", seconds, microseconds);
|
||||
return timetextbuf;
|
||||
}
|
||||
|
||||
|
||||
/* doubletextbuf should be (SIZEOF_DOUBLETEXT+1) */
|
||||
|
||||
char *
|
||||
double_to_text(const double the_double, char *doubletextbuf)
|
||||
{
|
||||
/*
|
||||
* given a double, return text
|
||||
*/
|
||||
sprintf(doubletextbuf, "%17.01f\t", the_double);
|
||||
return(doubletextbuf);
|
||||
}
|
||||
|
||||
struct timeval
|
||||
text_to_timeval(ptcx_t ptcx, char *timeval_as_text) {
|
||||
long int seconds, microseconds;
|
||||
struct timeval the_timeval;
|
||||
|
||||
D_PRINTF(debugfile,"T/%d %s\n", (int)timeval_as_text, timeval_as_text);
|
||||
sscanf(timeval_as_text, "%ld.%ld", &seconds, µseconds);
|
||||
the_timeval.tv_sec = seconds;
|
||||
the_timeval.tv_usec = microseconds;
|
||||
return the_timeval;
|
||||
}
|
||||
|
||||
double
|
||||
text_to_double(ptcx_t ptcx, char *double_as_text) {
|
||||
double the_double = 0;
|
||||
int returnval = 0;
|
||||
|
||||
D_PRINTF(debugfile,"D/%d %s\n", (int)double_as_text, double_as_text);
|
||||
returnval = sscanf(double_as_text, "%lf", &the_double);
|
||||
if (returnval == 1)
|
||||
return(the_double);
|
||||
else
|
||||
return(0.0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
/* not currently used, but useful for debugging */
|
||||
void
|
||||
dumpevent(ptcx_t ptcx, event_timer_t *pevent)
|
||||
{
|
||||
D_PRINTF(debugfile, "trys=%d errs=%d br=%f bw=%f elapsed=%f sq=%f\n",
|
||||
pevent->trys, pevent->errs,
|
||||
pevent->bytesread, pevent->byteswritten,
|
||||
pevent->elapsedtime,
|
||||
pevent->elapsedtimesq);
|
||||
}
|
||||
|
||||
void
|
||||
dumptimer(ptcx_t ptcx, cmd_stats_t *rqsttimer)
|
||||
{
|
||||
if (gn_debug) {
|
||||
D_PRINTF(debugfile, "Connect: ");
|
||||
dumpevent(ptcx, &rqsttimer->connect);
|
||||
|
||||
D_PRINTF(debugfile, "Banner: ");
|
||||
dumpevent(ptcx, &rqsttimer->banner);
|
||||
|
||||
D_PRINTF(debugfile, "Login: ");
|
||||
dumpevent(ptcx, &rqsttimer->login);
|
||||
|
||||
D_PRINTF(debugfile, "Cmd: ");
|
||||
dumpevent(ptcx, &rqsttimer->cmd);
|
||||
|
||||
D_PRINTF(debugfile, "MsgRead: ");
|
||||
dumpevent(ptcx, &rqsttimer->msgread);
|
||||
|
||||
D_PRINTF(debugfile, "MsgWrite: ");
|
||||
dumpevent(ptcx, &rqsttimer->msgwrite);
|
||||
|
||||
D_PRINTF(debugfile, "Idle: ");
|
||||
dumpevent(ptcx, &rqsttimer->idle);
|
||||
|
||||
D_PRINTF(debugfile, "Logout: ");
|
||||
dumpevent(ptcx, &rqsttimer->logout);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1,514 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
* Mike Blakely
|
||||
* David Shak
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
#ifndef __BENCH_H__
|
||||
#define __BENCH_H__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <limits.h>
|
||||
#include <float.h>
|
||||
#include <sys/stat.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <winsock.h>
|
||||
#include <time.h>
|
||||
#include <process.h>
|
||||
#include <io.h>
|
||||
#define NT_STACKSIZE 50*1024
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#ifdef USE_PTHREADS
|
||||
#include <sys/signal.h>
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <sys/poll.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/wait.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/resource.h> /* for struct rlimit, RLIMIT_NOFILE */
|
||||
#ifdef HAVE_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
#ifdef HAVE_WAIT_H
|
||||
#include <wait.h>
|
||||
#endif
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#include "sysdep.h"
|
||||
|
||||
#define USECINSEC 1000000
|
||||
#define MSECINSEC 1000
|
||||
#define MAX_ACCEPT_SECS 180 /* maximum time master will wait for listen() */
|
||||
|
||||
#define SECS_2_USECS(x) ((x) * USECINSEC)
|
||||
#define USECS_2_SECS(x) ((x) / USECINSEC)
|
||||
|
||||
#define LINE_BUFSIZE 4096
|
||||
#define MAXPROCSPERNODE 4096 /* max # of procs/node */
|
||||
|
||||
#define SMTP_PORT 25 /* standard port numbers */
|
||||
#define POP3_PORT 110
|
||||
#define IMAP4_PORT 143
|
||||
#define HTTP_PORT 80
|
||||
#define WMAP_PORT 80
|
||||
|
||||
#define CRLF "\r\n"
|
||||
|
||||
#define MAX_USERNAME_LEN 32
|
||||
#define MAX_MAILADDR_LEN 64
|
||||
#define MAX_COMMAND_LEN (2*1024)
|
||||
#define MAX_RESPONSE_LEN (2*1024)
|
||||
#define MAX_ERRORMSG_LEN 256
|
||||
#define DATESTAMP_LEN 40
|
||||
|
||||
#define MAX_IMAP_FOLDERNAME_LEN 256
|
||||
#define MAX_SEARCH_PATTERN_LEN 256
|
||||
|
||||
#define MAX_HTTP_COMMAND_LEN 1024
|
||||
|
||||
/* TODO make these dynamic. For now just use big buffers */
|
||||
#define SIZEOF_EVENTTEXT 150 /* report text from a single timer */
|
||||
#define SIZEOF_RQSTSTATSTEXT 2048 /* report text from all timers */
|
||||
#define SIZEOF_SUMMARYTEXT 8192 /* report text from all protocols */
|
||||
|
||||
/* levels for timeexpired */
|
||||
#define EXIT_SOON 1 /* do a clean shutdown ASAP */
|
||||
#define EXIT_FAST 20 /* shutdown now, dont block */
|
||||
#define EXIT_FASTEST 50 /* close sockets unconnditionally */
|
||||
|
||||
/* Debug macros */
|
||||
#define D_PRINTF if (gn_debug > 0) d_printf
|
||||
#define T_PRINTF if (gn_record_telemetry) t_printf
|
||||
|
||||
/*
|
||||
Simple keyword indexed string storage
|
||||
This kind of thing has been invented many times. Once more with gusto!
|
||||
*/
|
||||
typedef struct param_list {
|
||||
struct param_list *next;
|
||||
char * name;
|
||||
char * value;
|
||||
} param_list_t;
|
||||
|
||||
/*
|
||||
Simple keyword indexed string storage
|
||||
This kind of thing has been invented many times. Once more with gusto!
|
||||
*/
|
||||
typedef struct string_list {
|
||||
struct string_list *next;
|
||||
char * value;
|
||||
} string_list_t;
|
||||
|
||||
/* Numeric range (Shared). Previous value must be stored seperately */
|
||||
typedef struct range {
|
||||
unsigned long first; /* first valid value */
|
||||
unsigned long last; /* last valid value */
|
||||
unsigned long span; /* last-first */
|
||||
int sequential; /* 0=random, +=sequential up, -=down */
|
||||
} range_t;
|
||||
|
||||
/* basic timing structure */
|
||||
typedef struct event_timer {
|
||||
unsigned long trys;
|
||||
unsigned long errs;
|
||||
double bytesread;
|
||||
double byteswritten;
|
||||
double elapsedtime;
|
||||
double elapsedtimesq;
|
||||
double maxtime;
|
||||
double mintime;
|
||||
} event_timer_t;
|
||||
|
||||
/* command stats kept for every block and for every thread */
|
||||
typedef struct cmd_stats {
|
||||
/* This is protocol independent */
|
||||
unsigned long totalerrs;
|
||||
unsigned long totalcommands;
|
||||
event_timer_t combined; /* AKA total */
|
||||
event_timer_t idle;
|
||||
|
||||
void * data; /* protocol dependent data */
|
||||
} cmd_stats_t;
|
||||
|
||||
typedef struct stats { /* used for throttling ??? */
|
||||
struct timeval starttime;
|
||||
struct timeval endtime;
|
||||
unsigned int total_num_of_commands;
|
||||
} stats_t;
|
||||
|
||||
typedef struct resolved_addr {
|
||||
char * hostName; /* name of server */
|
||||
NETPORT portNum; /* port ot use */
|
||||
int resolved;
|
||||
struct hostent host_phe;
|
||||
struct protoent host_ppe;
|
||||
unsigned long host_addr;
|
||||
short host_type;
|
||||
} resolved_addr_t;
|
||||
|
||||
typedef struct thread_context *ptcx_t;
|
||||
typedef struct mail_command *pmail_command_t;
|
||||
typedef struct protocol *p_protocol_t;
|
||||
typedef int (*parseStartPtr_t)(pmail_command_t, char *, param_list_t *);
|
||||
typedef int (*parseEndPtr_t)(pmail_command_t, string_list_t *, param_list_t *);
|
||||
typedef void *(*commStartPtr_t)(ptcx_t , pmail_command_t , cmd_stats_t *);
|
||||
typedef int (*commLoopPtr_t)(ptcx_t , pmail_command_t , cmd_stats_t *, void *);
|
||||
typedef void (*commEndPtr_t)(ptcx_t , pmail_command_t , cmd_stats_t *, void *);
|
||||
typedef void (*statsFormatPtr_t)(p_protocol_t, const char *extra, char *buf);
|
||||
typedef void (*statsInitPtr_t)(pmail_command_t, cmd_stats_t *, int, int);
|
||||
typedef void (*statsUpdatePtr_t)(p_protocol_t, cmd_stats_t *, cmd_stats_t *);
|
||||
typedef void (*statsOutputPtr_t)(p_protocol_t, cmd_stats_t *, char *);
|
||||
|
||||
typedef struct protocol {
|
||||
const char * name; /* text name */
|
||||
parseStartPtr_t parseStart; /* section start parse routine */
|
||||
parseEndPtr_t parseEnd; /* section end parse routine */
|
||||
|
||||
commStartPtr_t cmdStart; /* command start routine */
|
||||
commLoopPtr_t cmdLoop; /* command loop routine */
|
||||
commEndPtr_t cmdEnd; /* command end routine */
|
||||
|
||||
statsFormatPtr_t statsFormat; /* output format information */
|
||||
statsInitPtr_t statsInit; /* init and zero stats structure */
|
||||
statsUpdatePtr_t statsUpdate; /* sum commands */
|
||||
statsOutputPtr_t statsOutput; /* output stats */
|
||||
|
||||
int cmdCount; /* commands using this protocol */
|
||||
cmd_stats_t stats; /* total stats for this protocol */
|
||||
} protocol_t;
|
||||
|
||||
/* This structure defines a mail command */
|
||||
typedef struct mail_command {
|
||||
/* Required fields */
|
||||
protocol_t * proto;
|
||||
int weight;
|
||||
|
||||
/* These are protocol independent (client.c) */
|
||||
int blockID; /* ID number for each block */
|
||||
int numLoops; /* typically messages per connection */
|
||||
int idleTime; /* time to idle before loops */
|
||||
int loopDelay; /* time to idle after each loop */
|
||||
int blockTime; /* time to idle after block */
|
||||
int throttle; /* to simulate ops/sec (BROKEN) */
|
||||
|
||||
void *data; /* protocol specific data */
|
||||
} mail_command_t;
|
||||
|
||||
typedef struct child_context { /* forked sub processes */
|
||||
int pid;
|
||||
SOCKET socket;
|
||||
} ccx_t, *pccx_t;
|
||||
|
||||
typedef struct thread_context {
|
||||
/* initialized by parent thread */
|
||||
THREAD_ID tid; /* thread id */
|
||||
int processnum; /* ordinal process number */
|
||||
int threadnum; /* ordinal thread number */
|
||||
int random_seed; /* seed for srandom */
|
||||
|
||||
/* local thread context, also read by parent */
|
||||
int blockCount; /* how many command blocks */
|
||||
int connectCount; /* how many connections */
|
||||
stats_t timestat; /* throttle info */
|
||||
cmd_stats_t *cmd_stats; /* stats for each command */
|
||||
|
||||
/* temporary storage (event_start, event_stop) */
|
||||
struct timeval starttime; /* a starting timestamp */
|
||||
int bytesread; /* num bytes read in per event */
|
||||
int byteswritten; /* num bytes written per event */
|
||||
|
||||
int ofd; /* connection to master */
|
||||
FILE *dfile; /* debug file */
|
||||
int logfile; /* telemetry log file */
|
||||
|
||||
SOCKET sock; /* network connection */
|
||||
char errMsg[MAX_ERRORMSG_LEN]; /* low level error string */
|
||||
} tcx_t;
|
||||
|
||||
/* About errMsg:
|
||||
This should store what was being attempted when a IO error occurs.
|
||||
From errMsg and errno (or its NT equivalent) you should be able
|
||||
to understand what went wrong.
|
||||
|
||||
No message is printed by the common functions (since some errors are
|
||||
recoverable).
|
||||
|
||||
The protocol handlers combine errMsg with neterrstr() to generate
|
||||
the message that the user sees (if not handled by the protocol).
|
||||
|
||||
Note that this is a small buffer (since it is replicated with every
|
||||
thread). Don't try to stuff the read/written data into it.
|
||||
|
||||
The routine getting the system error sets errMsg (strcpy, or sprintf).
|
||||
Calling routines append a "call trace" with additional info (strcat).
|
||||
The "call trace" starts with '<' as a seperator.
|
||||
*/
|
||||
#define debugfile (ptcx->dfile)
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(x,y) (((x) < (y)) ? (x) : (y))
|
||||
#endif
|
||||
#ifndef MAX
|
||||
#define MAX(x,y) (((x) >= (y)) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
/* routines in bench.c */
|
||||
extern void event_start(ptcx_t ptcx, event_timer_t *pevent);
|
||||
extern void event_stop(ptcx_t ptcx, event_timer_t *pevent);
|
||||
extern void event_reset(event_timer_t *pevent);
|
||||
extern void event_sum(event_timer_t *psum, event_timer_t *pincr);
|
||||
extern char *event_to_text(event_timer_t *pevent, char *ebuf);
|
||||
extern void stats_init(stats_t *);
|
||||
|
||||
extern char * double_to_text(const double the_double, char *textbuf);
|
||||
#if 0
|
||||
extern cmd_stats_t *text_to_cmd_stats(ptcx_t ptcx, char *cmd_stats_as_text, cmd_stats_t *the_cmd_stats);
|
||||
extern cmd_stats_t * text_to_cmd_stats(ptcx_t ptcx, char *, cmd_stats_t *the_cmd_stats);
|
||||
extern stats_t * text_to_stats(ptcx_t ptcx, char *, stats_t *the_stats);
|
||||
extern char * stats_to_text(ptcx_t ptcx, const stats_t *, char *statstextbuf);
|
||||
#endif
|
||||
|
||||
/* shared variables */
|
||||
extern int gn_debug;
|
||||
extern int gn_record_telemetry;
|
||||
extern int gn_total_weight;
|
||||
extern int gn_client_throttle;
|
||||
extern int gn_maxerrorcnt;
|
||||
extern int gn_maxBlockCnt;
|
||||
extern int gn_numprocs;
|
||||
extern int gn_numthreads;
|
||||
extern int gn_feedback_secs;
|
||||
extern time_t gt_testtime;
|
||||
extern time_t gt_startedtime;
|
||||
extern volatile time_t gt_shutdowntime;
|
||||
extern volatile int gf_timeexpired;
|
||||
extern time_t gt_stopinterval; /* MAX (ramptime/5, 10) */
|
||||
extern time_t gt_aborttime; /* startedtime + testtime + ramptime*/
|
||||
extern int gn_number_of_commands;
|
||||
extern int gf_abortive_close;
|
||||
extern int gf_imapForceUniqueness;
|
||||
extern char gs_dateStamp[DATESTAMP_LEN];
|
||||
extern char gs_thishostname[];
|
||||
extern char *gs_parsename;
|
||||
extern pid_t gn_myPID;
|
||||
extern mail_command_t *g_loaded_comm_list; /* actually a dynamic array */
|
||||
extern protocol_t g_protocols[];
|
||||
extern const char *gs_eventToTextFormat;
|
||||
|
||||
|
||||
/* more routines in bench.c */
|
||||
extern void *mymalloc(size_t size);
|
||||
extern void *mycalloc(size_t size);
|
||||
extern void *myrealloc(void *ptr, size_t size);
|
||||
extern void myfree(void *ptr);
|
||||
extern char *mystrdup(const char *cp);
|
||||
|
||||
extern int timeval_clear(struct timeval *tv);
|
||||
extern int timeval_stamp(struct timeval *tv);
|
||||
|
||||
extern int waitReadWrite(int fd, int flags);
|
||||
extern int retryRead(ptcx_t ptcx, SOCKET sock, char *buf, int count);
|
||||
extern int retryWrite(ptcx_t ptcx, SOCKET sock, char *buf, int count);
|
||||
|
||||
extern int recvdata(ptcx_t ptcx, SOCKET sock, char *ptr, int nbytes);
|
||||
extern int senddata(ptcx_t ptcx, SOCKET sock, char *ptr, int nbytes);
|
||||
extern void rqstat_times(cmd_stats_t *rs, cmd_stats_t *rt);
|
||||
extern void rqstat_to_buffer(char *buf, char *comm, cmd_stats_t *stats);
|
||||
extern int readResponse(ptcx_t ptcx, SOCKET sock, char *buffer, int buflen);
|
||||
extern int sendCommand(ptcx_t ptcx, SOCKET sock, char *command);
|
||||
extern int doCommandResponse(ptcx_t ptcx, SOCKET sock, char *command, char *response, int resplen);
|
||||
extern int sendOutput(int fd, char *command);
|
||||
extern int retrMsg(ptcx_t ptcx, char *buffer, int maxBytes, SOCKET sock);
|
||||
extern void trimEndWhite (char *buff);
|
||||
unsigned long rangeNext (range_t *, unsigned long );
|
||||
void rangeSetFirstLast (range_t *, unsigned long , unsigned long , int );
|
||||
void rangeSetFirstCount (range_t *, unsigned long , unsigned long , int );
|
||||
void rangeSplit (range_t *whole, range_t *sub, int pnum, int tnum);
|
||||
extern void cmdStatsInit (cmd_stats_t *p);
|
||||
|
||||
/* routines in sysdep.c */
|
||||
extern void MS_usleep(unsigned int microsecs);
|
||||
extern void MS_sleep(unsigned int secs);
|
||||
|
||||
/* routines in errexit.c */
|
||||
extern void errexit(FILE *dfile, const char *, ...);
|
||||
extern int returnerr(FILE *dfile, const char *, ...);
|
||||
extern int d_printf(FILE *dfile, const char *, ...);
|
||||
extern int t_printf(int fd, const char *buffer, size_t count, const char *format, ...);
|
||||
extern char *neterrstr(void);
|
||||
|
||||
/* routines in smtp.c */
|
||||
/* TRANSITION functions */
|
||||
extern void pishStatsFormat (protocol_t *pp, const char *extra, char *buf);
|
||||
extern void pishStatsInit(pmail_command_t, cmd_stats_t *, int pN, int tN);
|
||||
extern void pishStatsUpdate(protocol_t *, cmd_stats_t *, cmd_stats_t *);
|
||||
extern void pishStatsOutput(protocol_t *, cmd_stats_t *, char *);
|
||||
|
||||
extern int SmtpParseStart (pmail_command_t , char *, param_list_t *);
|
||||
extern int SmtpParseEnd (pmail_command_t , string_list_t *, param_list_t *);
|
||||
extern void *sendSMTPStart(ptcx_t ptcx, pmail_command_t, cmd_stats_t *);
|
||||
extern int sendSMTPLoop(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
extern void sendSMTPEnd(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
|
||||
/* routines in pop3.c */
|
||||
extern int Pop3ParseStart (pmail_command_t , char *, param_list_t *);
|
||||
extern int Pop3ParseEnd (pmail_command_t , string_list_t *, param_list_t *);
|
||||
extern void *doPop3Start(ptcx_t ptcx, pmail_command_t, cmd_stats_t *);
|
||||
extern int doPop3Loop(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
extern void doPop3End(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
|
||||
|
||||
/* routines in imap4.c */
|
||||
extern int Imap4ParseStart (pmail_command_t , char *, param_list_t *);
|
||||
extern int Imap4ParseEnd (pmail_command_t , string_list_t *, param_list_t *);
|
||||
extern void *doImap4Start(ptcx_t ptcx, pmail_command_t, cmd_stats_t *);
|
||||
extern int doImap4Loop(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
extern void doImap4End(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
|
||||
/* routines in http.c */
|
||||
extern int HttpParseStart (pmail_command_t , char *, param_list_t *);
|
||||
extern int HttpParseEnd (pmail_command_t , string_list_t *, param_list_t *);
|
||||
extern void HttpStatsFormat (protocol_t *pp, const char *extra, char *buf);
|
||||
extern void HttpStatsInit(pmail_command_t, cmd_stats_t *, int pN, int tN);
|
||||
extern void HttpStatsUpdate(protocol_t *, cmd_stats_t *, cmd_stats_t *);
|
||||
extern void HttpStatsOutput(protocol_t *, cmd_stats_t *, char *);
|
||||
extern void *doHttpStart(ptcx_t ptcx, pmail_command_t, cmd_stats_t *);
|
||||
extern int doHttpLoop(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
extern void doHttpEnd(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
|
||||
/* routines in wmap.c */
|
||||
extern int WmapParseStart (pmail_command_t , char *, param_list_t *);
|
||||
extern int WmapParseEnd (pmail_command_t , string_list_t *, param_list_t *);
|
||||
extern void WmapStatsFormat (protocol_t *pp, const char *extra, char *buf);
|
||||
extern void WmapStatsInit(pmail_command_t, cmd_stats_t *, int pN, int tN);
|
||||
extern void WmapStatsUpdate(protocol_t *, cmd_stats_t *, cmd_stats_t *);
|
||||
extern void WmapStatsOutput(protocol_t *, cmd_stats_t *, char *);
|
||||
extern void *doWmapStart(ptcx_t ptcx, pmail_command_t, cmd_stats_t *);
|
||||
extern int doWmapLoop(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
extern void doWmapEnd(ptcx_t ptcx, pmail_command_t, cmd_stats_t *, void *);
|
||||
|
||||
/* routines in parse.c */
|
||||
extern char *string_tolower(char *string);
|
||||
extern char *string_unquote(char *string);
|
||||
extern int cmdParseNameValue (pmail_command_t cmd, char *name, char *tok);
|
||||
extern int time_atoi(const char *pstr);
|
||||
extern int load_commands(char *commands);
|
||||
extern param_list_t *paramListInit (void);
|
||||
/* paramListAdd returns: 1 update existing value, 0 new, -1 out of memory */
|
||||
extern int paramListAdd (param_list_t *list, const char *name, const char *value);
|
||||
/* paramListGet returns value or NULL */
|
||||
extern char *paramListGet (param_list_t *list, const char *name);
|
||||
extern param_list_t *g_default_params; /* default section params */
|
||||
extern string_list_t *stringListInit (const char *value);
|
||||
extern int stringListAdd (string_list_t *list, const char *value);
|
||||
extern void stringListFree (string_list_t *list);
|
||||
|
||||
/* routines in timefunc.c */
|
||||
extern double timevaldouble(struct timeval *);
|
||||
extern void doubletimeval(const double, struct timeval *);
|
||||
extern double compdifftime_double(struct timeval *End, struct timeval *Strt);
|
||||
|
||||
/* routines in main.c */
|
||||
extern char *safe_inet_ntoa(struct in_addr ina, char *psz);
|
||||
|
||||
extern SOCKET connectSocket(ptcx_t ptcx, resolved_addr_t *, char *protocol);
|
||||
extern int set_abortive_close(SOCKET sock);
|
||||
|
||||
extern void throttle(ptcx_t ptcx, mail_command_t *comm, cmd_stats_t *timer);
|
||||
|
||||
/* routines in client.c */
|
||||
extern void beginShutdown (void);
|
||||
extern int clientInit(ptcx_t ptcx);
|
||||
extern int clientLoop(ptcx_t ptcx);
|
||||
extern THREAD_RET clientThread(void *);
|
||||
extern void clientSummary(ptcx_t ptcxs, int ntcxs, int ii, int outfd);
|
||||
extern THREAD_RET summaryThread(void *);
|
||||
extern int clientProc(int pnum, SOCKET outfd, unsigned int timeleft, unsigned int thread_stagger_usec);
|
||||
|
||||
extern void MS_idle(ptcx_t ptcx, int idleSecs);
|
||||
extern int resolve_addrs(char *host, char *protocol, struct hostent *host_phe,
|
||||
struct protoent *proto_ppe, unsigned long *addr,
|
||||
short *type);
|
||||
#if 0
|
||||
extern void dumpevent(ptcx_t ptcx, event_timer_t *pevent);
|
||||
extern void dumptimer(ptcx_t ptcx, cmd_stats_t *rqsttimer);
|
||||
extern int clientStats(ptcx_t ptcx);
|
||||
unsigned long get_next_login(ptcx_t ptcx, mail_command_t *comm, cmd_stats_t *ptimer);
|
||||
unsigned long get_next_address(ptcx_t ptcx, mail_command_t *comm, cmd_stats_t *ptimer);
|
||||
#endif
|
||||
|
||||
#undef VERSION
|
||||
#define VERSION "4.2"
|
||||
#ifdef _DEBUG
|
||||
#define MAILCLIENT_VERSION "mailclient (" VERSION " DEBUG built " __DATE__ " " __TIME__ ")"
|
||||
#else
|
||||
#define MAILCLIENT_VERSION "mailclient (" VERSION " built " __DATE__ " " __TIME__ ")"
|
||||
#endif
|
||||
|
||||
FILE *fdopen(int fildes, const char *mode);
|
||||
#ifndef _WIN32
|
||||
extern int getopt(int, char *const *, const char *);
|
||||
#endif
|
||||
#ifndef __OSF1__
|
||||
#ifndef __LINUX__
|
||||
extern long random(void);
|
||||
#endif
|
||||
extern void srandom(unsigned);
|
||||
#endif
|
||||
|
||||
#endif /* !__BENCH_H__ */
|
||||
@@ -1,908 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/*
|
||||
client.c handles thread creation
|
||||
login, loop, logout
|
||||
status report generation
|
||||
throttling (not supported yet)
|
||||
thread joining
|
||||
*/
|
||||
|
||||
#include "bench.h"
|
||||
|
||||
static int StartedThreads = 0; /* counter semaphore for children */
|
||||
static int FinishedThreads = 0; /* counter semaphore for children */
|
||||
|
||||
#ifdef _WIN32
|
||||
#define DEBUG_FILE "mstone-debug"
|
||||
#define LOG_FILE "mstone-log"
|
||||
#else
|
||||
#define DEBUG_FILE "mstone-debug"
|
||||
#define LOG_FILE "mstone-log"
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/*
|
||||
This is a sleep that knows about test end.
|
||||
Should also do throttling.
|
||||
We dont check for signals because the only signal expected is test end
|
||||
*/
|
||||
void
|
||||
MS_idle(ptcx_t ptcx, int idleSecs)
|
||||
{
|
||||
int secsLeft = 0;
|
||||
|
||||
secsLeft = gt_shutdowntime - time(0L);
|
||||
|
||||
D_PRINTF(debugfile, "secsLeft=%d, idleSecs=%d\n", secsLeft, idleSecs);
|
||||
|
||||
if (secsLeft <= 0) { /* time is up, start exiting */
|
||||
if (gf_timeexpired < EXIT_SOON)
|
||||
gf_timeexpired = EXIT_SOON;
|
||||
return;
|
||||
}
|
||||
|
||||
if (idleSecs > secsLeft) idleSecs = secsLeft;
|
||||
if (idleSecs <= 0) return;
|
||||
|
||||
MS_sleep(idleSecs);
|
||||
}
|
||||
|
||||
/* used by POP, SMTP, IMAP4 methods */
|
||||
void
|
||||
throttle(ptcx_t ptcx, mail_command_t *comm, cmd_stats_t *timer )
|
||||
{
|
||||
|
||||
int chokeSecs = 0;
|
||||
struct timeval exittime;
|
||||
|
||||
/* check if we need to throttle this puppy */
|
||||
if (comm->throttle <= 0)
|
||||
return;
|
||||
|
||||
/* we probably have not reached NETCLOSE yet, so we do not
|
||||
know what timer->exittime is */
|
||||
timeval_stamp(&exittime);
|
||||
|
||||
/* time to sleep = throttle - (exittime - entertime) */
|
||||
chokeSecs = comm->throttle - ( exittime.tv_sec - ptcx->starttime.tv_sec );
|
||||
|
||||
|
||||
/* if chokeSecs is negative, don't bother sleeping */
|
||||
if (chokeSecs > 0) {
|
||||
d_printf(debugfile, "throttle=%d, chokeSecs=%d\n",
|
||||
comm->throttle, chokeSecs);
|
||||
MS_idle(ptcx, chokeSecs);
|
||||
}
|
||||
|
||||
} /* end throttle */
|
||||
|
||||
/*
|
||||
* Perform the given command block
|
||||
*
|
||||
* commNum = the number of the comm (offset in loaded_comm_list[])
|
||||
*
|
||||
* returns 1
|
||||
*/
|
||||
static int
|
||||
do_command(ptcx_t ptcx, /* thread state */
|
||||
int commNum) /* command block number */
|
||||
|
||||
{
|
||||
mail_command_t *comm = &g_loaded_comm_list[commNum];
|
||||
cmd_stats_t *cmd_stats = &(ptcx->cmd_stats[commNum]);
|
||||
int cnt, cntEnd; /* loop counters */
|
||||
void *state = NULL;
|
||||
|
||||
cntEnd = comm->numLoops+1; /* transfer count +1 */
|
||||
D_PRINTF(debugfile, "do_command start t=%lu commNum=%d cntEnd=%d\n",
|
||||
time(0L), commNum, cntEnd);
|
||||
|
||||
/* Start and End are special loop cases to make summations easier */
|
||||
for (cnt = 0; cnt <= cntEnd; cnt++) {
|
||||
|
||||
if (gf_timeexpired >= EXIT_FAST) /* no more calls */
|
||||
break;
|
||||
if (gf_timeexpired >= EXIT_SOON) {
|
||||
if (!state) break; /* no shutdown to do */
|
||||
cnt = cntEnd; /* go to shutdown */
|
||||
}
|
||||
|
||||
D_PRINTF(debugfile, "do_command t=%lu count=%d of %d\n",
|
||||
time(0L), cnt, cntEnd);
|
||||
|
||||
if (0 == cnt) { /* first time */
|
||||
cmd_stats->totalcommands++; /* track command blocks trys */
|
||||
state = (*(comm->proto->cmdStart)) (ptcx, comm, cmd_stats);
|
||||
if (NULL == state) {
|
||||
D_PRINTF(debugfile, "do_command Start returned NULL\n");
|
||||
break;
|
||||
}
|
||||
if (comm->idleTime && (gf_timeexpired < EXIT_SOON)) {
|
||||
D_PRINTF(debugfile,"do_command delay %d after Setup\n",
|
||||
comm->idleTime);
|
||||
event_start(ptcx, &cmd_stats->idle);
|
||||
MS_idle(ptcx, comm->idleTime);
|
||||
event_stop(ptcx, &cmd_stats->idle);
|
||||
}
|
||||
}
|
||||
else if ((cntEnd == cnt) && comm->proto->cmdEnd) { /* last */
|
||||
(*(comm->proto->cmdEnd)) (ptcx, comm, cmd_stats, state);
|
||||
break; /* done with loop */
|
||||
}
|
||||
else if (comm->proto->cmdLoop) { /* do transfers */
|
||||
int rc;
|
||||
rc = (*(comm->proto->cmdLoop)) (ptcx, comm, cmd_stats, state);
|
||||
if (rc < 0) {
|
||||
D_PRINTF(debugfile, "do_command Loop returned error/done\n");
|
||||
cnt = cntEnd -1; /* end loop */
|
||||
}
|
||||
/* do loopDelay even if error/done */
|
||||
if (comm->loopDelay && (gf_timeexpired < EXIT_SOON)) {
|
||||
D_PRINTF(debugfile,"do_command delay %d in loop\n",
|
||||
comm->loopDelay);
|
||||
event_start(ptcx, &cmd_stats->idle);
|
||||
MS_idle(ptcx, comm->loopDelay);
|
||||
event_stop(ptcx, &cmd_stats->idle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* do blockTime even if we hit an error connecting */
|
||||
if (comm->blockTime && (gf_timeexpired < EXIT_SOON)) {
|
||||
D_PRINTF(debugfile,"do_command delay %d after Block\n",
|
||||
comm->blockTime);
|
||||
event_start(ptcx, &cmd_stats->idle);
|
||||
MS_idle(ptcx, comm->blockTime);
|
||||
event_stop(ptcx, &cmd_stats->idle);
|
||||
}
|
||||
D_PRINTF(debugfile, "do_command end t=%lu commNum=%d cntEdn=%d\n",
|
||||
time(0L), commNum, cntEnd);
|
||||
|
||||
return 1; /* return connections */
|
||||
} /* END do_command() */
|
||||
|
||||
/*
|
||||
Initialize sub process context
|
||||
*/
|
||||
int
|
||||
clientInit(ptcx_t ptcx)
|
||||
{
|
||||
ptcx->dfile = stderr;
|
||||
|
||||
if (gn_debug) {
|
||||
/* open a debug log file */
|
||||
char debug_file_name[255];
|
||||
fflush(stderr);
|
||||
if (ptcx->threadnum >= 0) {
|
||||
sprintf(debug_file_name, "%s.%d.%d",
|
||||
DEBUG_FILE, ptcx->processnum, ptcx->threadnum);
|
||||
} else {
|
||||
sprintf(debug_file_name, "%s.%d",
|
||||
DEBUG_FILE, ptcx->processnum);
|
||||
}
|
||||
ptcx->dfile = fopen(debug_file_name, "w+");
|
||||
if (ptcx->dfile == NULL) {
|
||||
/*returnerr(stderr, "Can't open debug file\n");
|
||||
return -1;*/
|
||||
gn_debug = 0;
|
||||
d_printf (stderr, "Can't open debug file. Debug mode disabled\n");
|
||||
}
|
||||
D_PRINTF(debugfile, "Running in debug mode\n");
|
||||
}
|
||||
|
||||
if (gn_record_telemetry) {
|
||||
/* open a transaction log file. */
|
||||
char log_file_name[255];
|
||||
sprintf(log_file_name, "%s.%d.%d",
|
||||
LOG_FILE, ptcx->processnum, ptcx->threadnum);
|
||||
ptcx->logfile = open(log_file_name,
|
||||
O_CREAT | O_TRUNC | O_WRONLY, 0664);
|
||||
returnerr(debugfile,"Log file is %s [%d]\n", log_file_name, ptcx->logfile);
|
||||
} else {
|
||||
ptcx->logfile = -1;
|
||||
}
|
||||
|
||||
/* Initialize random number generator */
|
||||
SRANDOM(ptcx->random_seed);
|
||||
D_PRINTF(debugfile, "Random seed: 0x%08x\n", ptcx->random_seed );
|
||||
|
||||
stats_init(&ptcx->timestat);
|
||||
|
||||
ptcx->timestat.total_num_of_commands = gn_number_of_commands;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Continuously handle command blocks until time is up
|
||||
*/
|
||||
int
|
||||
clientLoop(ptcx_t ptcx)
|
||||
{
|
||||
for(ptcx->blockCount = 0; gf_timeexpired < EXIT_SOON; ) {
|
||||
int comm_index = 0;
|
||||
|
||||
if (gn_number_of_commands > 1) {
|
||||
int ran_number;
|
||||
/* Handle the weighted distribution of commands */
|
||||
/* HAVE FILELIST */
|
||||
|
||||
D_PRINTF(debugfile, "Total weight %d\n", gn_total_weight);
|
||||
/* random number between 0 and totalweight-1 */
|
||||
ran_number = (RANDOM() % gn_total_weight);
|
||||
D_PRINTF(debugfile, "random %ld\n", ran_number );
|
||||
|
||||
/* loop through pages, find correct one
|
||||
* while ran_number is positive, decrement it
|
||||
* by the weight of the current page
|
||||
* example: ran_number is 5, pages have weights of 10 and 10
|
||||
* first iteration comm_index = 0, ran_number = -5
|
||||
* iteration halted, comm_index = 0
|
||||
*/
|
||||
comm_index = -1;
|
||||
while (ran_number >= 0) {
|
||||
comm_index++;
|
||||
D_PRINTF(debugfile, "Current command index %d: %ld - %d\n",
|
||||
comm_index, ran_number,
|
||||
g_loaded_comm_list[comm_index].weight
|
||||
);
|
||||
ran_number -= g_loaded_comm_list[comm_index].weight;
|
||||
}
|
||||
|
||||
if (comm_index >= gn_number_of_commands) { /* shouldnt happen */
|
||||
D_PRINTF(debugfile, "Command weight overrun %d %d\n",
|
||||
ran_number, gn_total_weight);
|
||||
comm_index--;
|
||||
}
|
||||
/*D_PRINTF(debugfile, "Final page index %d\n", comm_index );*/
|
||||
}
|
||||
|
||||
/* run the command */
|
||||
ptcx->connectCount += do_command(ptcx, comm_index);
|
||||
++ptcx->blockCount;
|
||||
|
||||
if (gf_timeexpired >= EXIT_SOON) break; /* done, dont throttle */
|
||||
|
||||
/* For the single processes/thread case, this should be exact */
|
||||
if ((gn_maxBlockCnt) /* check for max loops */
|
||||
&& (ptcx->blockCount >= gn_maxBlockCnt)) {
|
||||
D_PRINTF (debugfile, "Saw enough loops %d, exiting\n",
|
||||
ptcx->blockCount);
|
||||
beginShutdown (); /* indicate early exit */
|
||||
break;
|
||||
}
|
||||
|
||||
/* throttle code mikeb@netscape.com
|
||||
* keeps client from going faster than client_throttle
|
||||
* operations per minute
|
||||
*/
|
||||
if (gn_client_throttle &&
|
||||
(ptcx->timestat.endtime.tv_sec > ptcx->timestat.starttime.tv_sec)) {
|
||||
timeval_stamp(&(ptcx->timestat.endtime));
|
||||
while ( 60 * ptcx->connectCount /
|
||||
(ptcx->timestat.endtime.tv_sec - ptcx->timestat.starttime.tv_sec)
|
||||
> gn_client_throttle ) {
|
||||
D_PRINTF(debugfile, "%.2f > %d, throttling\n",
|
||||
( 60 * ptcx->connectCount /
|
||||
(ptcx->timestat.endtime.tv_sec - ptcx->timestat.starttime.tv_sec) ),
|
||||
gn_client_throttle);
|
||||
/* sleep a little */
|
||||
MS_usleep( 100 );
|
||||
} /* end while too fast */
|
||||
}
|
||||
} /* END while blockCount */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Thread of execution.
|
||||
Also works in un-threaded case.
|
||||
Initialize, do some system housekeeping, run test, housekeeping, clean up
|
||||
*/
|
||||
THREAD_RET
|
||||
clientThread(void *targ)
|
||||
{
|
||||
time_t currentTime;
|
||||
struct tm *tmptm;
|
||||
char timeStamp[DATESTAMP_LEN];
|
||||
int ret = 0;
|
||||
tcx_t *ptcx = (ptcx_t)targ;
|
||||
/*char buf[256];*/
|
||||
|
||||
if (clientInit(ptcx)) { /* should never fail */
|
||||
#ifdef USE_PTHREADS
|
||||
if (ptcx->threadnum >= 0)
|
||||
pthread_exit((void *)((1 << 16) | ptcx->threadnum));
|
||||
return NULL;
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*sprintf(buf, "NOTICE: client process=%d thread=%d started\n",
|
||||
ptcx->processnum, ptcx->threadnum);
|
||||
sendOutput(ptcx->ofd, buf);*/
|
||||
|
||||
if (gn_debug) {
|
||||
/* write current time to debug file */
|
||||
time(¤tTime);
|
||||
tmptm = localtime(¤tTime);
|
||||
strftime(timeStamp, DATESTAMP_LEN, "%Y%m%d%H%M%S", tmptm);
|
||||
D_PRINTF(debugfile, "Time Stamp: %s\n", timeStamp);
|
||||
D_PRINTF(debugfile, "mailstone run dateStamp=%s\n", gs_dateStamp);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WAIT_INFINITY 100000000
|
||||
/* Tell parent we're ready */
|
||||
InterlockedIncrement(&StartedThreads);
|
||||
#else
|
||||
++StartedThreads; /* thread safe??? */
|
||||
#endif /* _WIN32 */
|
||||
|
||||
timeval_stamp(&(ptcx->timestat.starttime));
|
||||
D_PRINTF(debugfile, "entering clientLoop\n");
|
||||
|
||||
ret = clientLoop(ptcx); /* do the work */
|
||||
|
||||
timeval_stamp(&(ptcx->timestat.endtime));
|
||||
D_PRINTF(debugfile, "Test run complete\n" );
|
||||
|
||||
/* write current time to debug file */
|
||||
time(¤tTime);
|
||||
tmptm = localtime(¤tTime);
|
||||
strftime(timeStamp, DATESTAMP_LEN, "%Y%m%d%H%M%S", tmptm);
|
||||
D_PRINTF(debugfile, "Time Stamp: %s\n", timeStamp);
|
||||
|
||||
if (gn_record_telemetry && (ptcx->logfile > 0)) {
|
||||
close(ptcx->logfile);
|
||||
ptcx->logfile = -1;
|
||||
}
|
||||
|
||||
D_PRINTF(debugfile, "client exiting.\n" );
|
||||
|
||||
if (gn_debug && ptcx->dfile) {
|
||||
fflush(ptcx->dfile);
|
||||
if (ptcx->dfile != stderr) {
|
||||
fclose(ptcx->dfile);
|
||||
ptcx->dfile = stderr;
|
||||
}
|
||||
}
|
||||
|
||||
/*sprintf(buf, "NOTICE: client process=%d thread=%d ending\n",
|
||||
ptcx->processnum, ptcx->threadnum);
|
||||
sendOutput(ptcx->ofd, buf);*/
|
||||
|
||||
#ifdef _WIN32
|
||||
/* tell parent we're done */
|
||||
InterlockedIncrement(&FinishedThreads);
|
||||
#else /* _WIN32 */
|
||||
++FinishedThreads; /* thread safe??? */
|
||||
#ifdef USE_PTHREADS
|
||||
if (ptcx->threadnum >= 0)
|
||||
pthread_exit((void *)((ret << 16) | ptcx->threadnum));
|
||||
#endif
|
||||
return NULL;
|
||||
#endif /* _WIN32 */
|
||||
} /* END clientThread() */
|
||||
|
||||
/*
|
||||
The FORMAT format is:
|
||||
FORMAT: client=<NUMBER> <TYPE>:<NAME>\t<VALUE>
|
||||
|
||||
TYPE is one of: TIMER, PROTOCOL, LINE
|
||||
|
||||
Everything breaks down to attribute=value pairs.
|
||||
"attribute=" is literal, the listed value names the field
|
||||
|
||||
Attribute names must be unique with each timer.
|
||||
|
||||
The [] and {} indicate timers and protocols respectively.
|
||||
everything else is a literal (including whitespace).
|
||||
The protocols and timers will be expanded with simple text
|
||||
substitutions.
|
||||
|
||||
The literal text is as high in the description as possible.
|
||||
The processing splits out the values based on surrounding text.
|
||||
*/
|
||||
/*
|
||||
Output the format that the summaries will be in.
|
||||
This call the protocol specific formats, then outputs
|
||||
the complete line formats
|
||||
*/
|
||||
void
|
||||
clientSummaryFormat(int clientnum, int outfd)
|
||||
{
|
||||
char buf[SIZEOF_SUMMARYTEXT], *cp;
|
||||
char extra[96];
|
||||
protocol_t *pp;
|
||||
|
||||
sprintf (extra, "client=%d", clientnum); /* extra stuff on each line */
|
||||
|
||||
/* Define the contents of each protocol */
|
||||
for (pp=g_protocols; pp->name != NULL; ++pp) {
|
||||
if (!pp->cmdCount) continue; /* not used */
|
||||
|
||||
(pp->statsInit)(NULL, &(pp->stats), 0, 0); /* init stats (HERE?) */
|
||||
|
||||
(pp->statsFormat)(pp, extra, buf); /* output lines of format info */
|
||||
sendOutput(outfd, buf);
|
||||
}
|
||||
|
||||
/* Define the periodic update summaries */
|
||||
/* This is the most common message, so keep is as short as practical */
|
||||
cp = buf;
|
||||
sprintf(cp,
|
||||
"<FORMAT %s LINE=SUMMARY-TIME><TS %s>",
|
||||
extra,
|
||||
"client=client t=time blocks=blocks");
|
||||
for (; *cp; ++cp); /* skip to the end of the string */
|
||||
for (pp=g_protocols; pp->name != NULL; ++pp) {
|
||||
if (!pp->cmdCount) continue; /* not used */
|
||||
sprintf(cp, "\t<%s {%s}/>", pp->name, pp->name);
|
||||
for (; *cp; ++cp); /* skip to the end of the string */
|
||||
}
|
||||
strcat (cp, "</TS></FORMAT>\n");
|
||||
sendOutput(outfd, buf);
|
||||
|
||||
/* BLOCK-STATISTICS format */
|
||||
for (pp=g_protocols; pp->name != NULL; ++pp) {
|
||||
cp = buf;
|
||||
sprintf(cp,
|
||||
"<FORMAT %s LINE=BLOCK-STATISTICS-%s><BS-%s %s>",
|
||||
extra, pp->name, pp->name,
|
||||
"client=client thread=thread t=time blockID=blockID");
|
||||
for (; *cp; ++cp); /* skip to the end of the string */
|
||||
|
||||
sprintf(cp, "\t<%s {%s}/>", pp->name, pp->name);
|
||||
for (; *cp; ++cp); /* skip to the end of the string */
|
||||
sprintf (cp, "</BS-%s></FORMAT>\n", pp->name);
|
||||
sendOutput(outfd, buf);
|
||||
}
|
||||
|
||||
/* Notice Format */
|
||||
sprintf(buf,
|
||||
"<FORMAT %s LINE=NOTICE-1>%s</FORMAT>\n",
|
||||
extra,
|
||||
"<NOTICE client=client ... ");
|
||||
sendOutput(outfd, buf);
|
||||
|
||||
/* Abort Format */
|
||||
sprintf(buf,
|
||||
"<FORMAT %s LINE=NOTICE-2>%s</FORMAT>\n",
|
||||
extra,
|
||||
"<ABORT client=client ... ");
|
||||
sendOutput(outfd, buf);
|
||||
}
|
||||
|
||||
/*
|
||||
Output the block information for each thread
|
||||
*/
|
||||
void
|
||||
clientBlockSummary(ptcx_t ptcxs, int ntcxs, int clientnum, int outfd)
|
||||
{
|
||||
time_t curtime;
|
||||
protocol_t *pp;
|
||||
int jj, kk;
|
||||
char buf[SIZEOF_SUMMARYTEXT], *bp;
|
||||
|
||||
D_PRINTF(stderr, "clientSummaryBS starting.\n" );
|
||||
curtime = time(0L);
|
||||
for (kk = 0; kk < gn_number_of_commands; ++kk) { /* all commands */
|
||||
for (jj = 0; jj < ntcxs; ++jj) { /* all threads */
|
||||
if (0 == ptcxs[jj].cmd_stats[kk].totalcommands) /* nothing */
|
||||
continue;
|
||||
pp = g_loaded_comm_list[kk].proto;
|
||||
/* output proto independent part */
|
||||
bp = buf;
|
||||
sprintf (bp,
|
||||
"<BS-%s client=%d thread=%d t=%lu blockID=%d>",
|
||||
pp->name, clientnum, jj, curtime,
|
||||
g_loaded_comm_list[kk].blockID);
|
||||
for (; *bp; ++bp); /* find end of buffer */
|
||||
|
||||
sprintf (bp,
|
||||
"\t<%s blocks=%ld ",
|
||||
pp->name,
|
||||
ptcxs[jj].cmd_stats[kk].totalcommands);
|
||||
for (; *bp; ++bp); /* find end of buffer */
|
||||
|
||||
(pp->statsOutput)(pp, &(ptcxs[jj].cmd_stats[kk]), bp);
|
||||
for (; *bp; ++bp); /* find end of buffer */
|
||||
|
||||
sprintf (bp, "/></BS-%s>\n", pp->name); /* end it */
|
||||
sendOutput(outfd, buf);
|
||||
}
|
||||
}
|
||||
D_PRINTF(stderr, "clientSummaryBS done.\n");
|
||||
}
|
||||
|
||||
/* Output the periodic activity summary */
|
||||
void
|
||||
clientTimeSummary(ptcx_t ptcxs, int ntcxs, int clientnum, int outfd)
|
||||
{
|
||||
time_t curtime;
|
||||
int blockCount = 0, connectCount = 0;
|
||||
protocol_t *pp;
|
||||
int jj, kk;
|
||||
char buf[SIZEOF_SUMMARYTEXT];
|
||||
char rqsttextbuf[SIZEOF_RQSTSTATSTEXT+1];
|
||||
static int oldThreadStarts= 0;
|
||||
static int oldThreadEnds= 0;
|
||||
|
||||
D_PRINTF(stderr, "clientTimeSummary starting.\n" );
|
||||
curtime = time(0L);
|
||||
|
||||
for (pp=g_protocols; pp->name != NULL; ++pp) { /* zero protocol stats */
|
||||
if (!pp->cmdCount) continue; /* not used */
|
||||
cmdStatsInit (&(pp->stats)); /* clear proto independent part */
|
||||
(pp->statsInit)(NULL, &(pp->stats), 0, 0); /* clear proto part */
|
||||
}
|
||||
|
||||
/* sum by protocol all commands, all threads */
|
||||
for (jj = 0; jj < ntcxs; ++jj) {
|
||||
blockCount += ptcxs[jj].blockCount;
|
||||
connectCount += ptcxs[jj].connectCount;
|
||||
for (kk = 0; kk < gn_number_of_commands; ++kk) {
|
||||
pp = g_loaded_comm_list[kk].proto;
|
||||
(pp->statsUpdate)(pp, &pp->stats, &(ptcxs[jj].cmd_stats[kk]));
|
||||
}
|
||||
}
|
||||
|
||||
/* output proto independent part */
|
||||
sprintf(buf, "<TS client=%d t=%lu blocks=%d>",
|
||||
clientnum, curtime, blockCount);
|
||||
|
||||
for (pp=g_protocols; pp->name != NULL; ++pp) { /* output proto parts */
|
||||
if (!pp->cmdCount) continue; /* not used */
|
||||
(pp->statsOutput)(pp, &pp->stats, rqsttextbuf);
|
||||
/* The \t seperates sections for report parsing */
|
||||
sprintf(&buf[strlen(buf)], "\t<%s blocks=%ld %s/>",
|
||||
pp->name, pp->stats.totalcommands,
|
||||
rqsttextbuf);
|
||||
}
|
||||
strcat(buf, "</TS>\n"); /* end it */
|
||||
sendOutput(outfd, buf);
|
||||
|
||||
/* do additional status updates */
|
||||
if (oldThreadStarts != StartedThreads) {
|
||||
sprintf(buf, "<NOTICE client=%d threadStarts=%d/>\n",
|
||||
clientnum, StartedThreads - oldThreadStarts);
|
||||
sendOutput(outfd, buf);
|
||||
oldThreadStarts = StartedThreads;
|
||||
}
|
||||
|
||||
if (oldThreadEnds != FinishedThreads) {
|
||||
sprintf(buf, "<NOTICE client=%d threadFinishes=%d/>\n",
|
||||
clientnum, FinishedThreads - oldThreadEnds);
|
||||
sendOutput(outfd, buf);
|
||||
oldThreadEnds = FinishedThreads;
|
||||
}
|
||||
|
||||
if (gn_maxerrorcnt) { /* check for max error count */
|
||||
int errors = 0;
|
||||
for (pp=g_protocols; pp->name != NULL; ++pp) { /* sum total */
|
||||
if (!pp->cmdCount) continue; /* not used */
|
||||
errors += pp->stats.combined.errs;
|
||||
}
|
||||
|
||||
if (errors > gn_maxerrorcnt) {
|
||||
returnerr (stderr,
|
||||
"<ABORT client=%d errorCount=%ld errorLimit=%ld/>\n",
|
||||
clientnum, errors, gn_maxerrorcnt);
|
||||
beginShutdown ();
|
||||
}
|
||||
}
|
||||
|
||||
if ((gn_maxBlockCnt)
|
||||
&& (blockCount >= gn_maxBlockCnt)) { /* check for max loops */
|
||||
returnerr (stderr,
|
||||
"<ABORT client=%d blockCount=%ld blockLimit=%ld/>\n",
|
||||
clientnum, blockCount, gn_maxBlockCnt);
|
||||
beginShutdown ();
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "clientTimeSummary done.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
Thread that calls clientTimeSummary at the right rate
|
||||
*/
|
||||
THREAD_RET
|
||||
summaryThread(void *targ)
|
||||
{
|
||||
ptcx_t ptcxs = (ptcx_t)targ; /* thread contexts */
|
||||
|
||||
D_PRINTF(stderr, "summaryThread starting...\n");
|
||||
|
||||
/* client threads running...dump periodic stats */
|
||||
while (gn_feedback_secs && (gf_timeexpired < EXIT_FAST)) {
|
||||
D_PRINTF(stderr, "client %d: clientTimeSummary\n", ptcxs[0].processnum);
|
||||
clientTimeSummary(ptcxs, gn_numthreads, ptcxs[0].processnum, ptcxs[0].ofd);
|
||||
D_PRINTF(stderr, "client %d: waiting %d seconds before feedback\n",
|
||||
ptcxs[0].processnum, gn_feedback_secs);
|
||||
MS_sleep(gn_feedback_secs);
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "summaryThread exiting...\n");
|
||||
|
||||
#ifdef USE_PTHREADS
|
||||
pthread_exit(0);
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
Initialize per thread context
|
||||
*/
|
||||
void
|
||||
initTcx(ptcx_t ptcx, int ofd, int pnum, int tnum)
|
||||
{
|
||||
int kk;
|
||||
ptcx->processnum = pnum;
|
||||
ptcx->threadnum = tnum;
|
||||
ptcx->random_seed = (tnum << 16) + getpid();
|
||||
ptcx->cmd_stats =
|
||||
(cmd_stats_t *)mycalloc(sizeof(cmd_stats_t)*gn_number_of_commands);
|
||||
|
||||
/* do PROTO specific init */
|
||||
for (kk = 0; kk < gn_number_of_commands; ++kk) {
|
||||
(g_loaded_comm_list[kk].proto->statsInit)
|
||||
(&g_loaded_comm_list[kk], &(ptcx->cmd_stats[kk]), pnum, tnum);
|
||||
}
|
||||
|
||||
ptcx->ofd = ofd;
|
||||
ptcx->sock = BADSOCKET_VALUE;
|
||||
}
|
||||
|
||||
void
|
||||
destroyTcx(ptcx_t ptcx)
|
||||
{
|
||||
if (ptcx->cmd_stats) {
|
||||
free(ptcx->cmd_stats);
|
||||
ptcx->cmd_stats = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static time_t bailtime;
|
||||
|
||||
/* advance directly to shutdown phase. May be called from signal handlers */
|
||||
void
|
||||
beginShutdown (void)
|
||||
{
|
||||
if (gf_timeexpired >= EXIT_SOON) return; /* already shutting down */
|
||||
|
||||
gf_timeexpired = EXIT_SOON;
|
||||
gt_shutdowntime = bailtime = time(0); /* advance end time to now */
|
||||
|
||||
/* Changing aborttime probably has no effect (wrong process) */
|
||||
gt_aborttime = gt_shutdowntime + gt_stopinterval*2*EXIT_FASTEST;
|
||||
}
|
||||
|
||||
/* This is the guts of each sub process.
|
||||
The socket for data output has already be setup.
|
||||
init context
|
||||
start threads (if possible/needed) with proper rampup delays
|
||||
wait for threads to end
|
||||
*/
|
||||
int
|
||||
clientProc(int pnum, SOCKET outfd,
|
||||
unsigned int testtime,
|
||||
unsigned int thread_stagger_usec)
|
||||
{
|
||||
int tnum;
|
||||
int ret;
|
||||
ptcx_t ptcxs; /* thread contexts */
|
||||
THREAD_ID summary_tid;
|
||||
int status;
|
||||
|
||||
|
||||
bailtime = gt_shutdowntime;
|
||||
|
||||
returnerr(stderr, "Child starting\n"); /* get our pid and time printed */
|
||||
D_PRINTF(stderr, "clientProc(%d, %d, %d) starting\n",
|
||||
pnum, testtime, thread_stagger_usec);
|
||||
|
||||
if (testtime <= 0) { /* never happens, checked in main.c */
|
||||
D_PRINTF (stderr, "ABORTING testtime=%d\n", testtime);
|
||||
return 0;
|
||||
}
|
||||
|
||||
setup_signal_handlers ();
|
||||
#ifndef _WIN32
|
||||
alarm(testtime); /* promptly notice test end */
|
||||
#endif
|
||||
|
||||
clientSummaryFormat (pnum, outfd);
|
||||
|
||||
#if defined(USE_PTHREADS) || defined(_WIN32)
|
||||
if (gn_numthreads > 0) {
|
||||
ptcxs = (ptcx_t)mycalloc(sizeof(tcx_t) * gn_numthreads);
|
||||
|
||||
for (tnum = 0; tnum < gn_numthreads; ++tnum) {
|
||||
initTcx(&ptcxs[tnum], outfd, pnum, tnum);
|
||||
}
|
||||
|
||||
/*fprintf(stderr, "launching summary\n");*/
|
||||
if ((ret=sysdep_thread_create(&summary_tid, summaryThread,
|
||||
(void *)ptcxs)) != 0) {
|
||||
returnerr(stderr, "client %d: summary thread create failed ret=%d errno=%d: %s\n",
|
||||
pnum, ret, errno, strerror(errno));
|
||||
ptcxs[tnum].tid = 0;
|
||||
}
|
||||
/*fprintf(stderr, "summary should be running...\n");*/
|
||||
|
||||
for (tnum = 0; tnum < gn_numthreads; ++tnum) {
|
||||
if (gf_timeexpired)
|
||||
break;
|
||||
|
||||
/* sleep between each client thread we try to start */
|
||||
if (tnum && thread_stagger_usec) {
|
||||
MS_usleep(thread_stagger_usec);
|
||||
if (gf_timeexpired)
|
||||
break;
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "client %d: thread %d testtime %d\n",
|
||||
pnum, tnum, testtime);
|
||||
|
||||
if ((ret=sysdep_thread_create(&(ptcxs[tnum].tid), clientThread,
|
||||
(void *)&ptcxs[tnum])) != 0) {
|
||||
returnerr(stderr, "client %d: thread %d create() failed ret=%d errno=%d: %s\n",
|
||||
pnum, tnum, ret, errno, strerror(errno));
|
||||
ptcxs[tnum].tid = 0;
|
||||
}
|
||||
D_PRINTF(stderr, "client %d: thread %d created with ID %d\n",
|
||||
pnum, tnum, ptcxs[tnum].tid);
|
||||
}
|
||||
|
||||
/* threads are going, but wait for them to get through setup */
|
||||
while (StartedThreads < gn_numthreads) {
|
||||
int tm = time(0);
|
||||
if (tm > bailtime) {
|
||||
++gf_timeexpired;
|
||||
bailtime += gt_stopinterval;
|
||||
}
|
||||
if (gf_timeexpired >= EXIT_SOON) /* failsafe if thread count bad */
|
||||
break;
|
||||
MS_sleep(2);
|
||||
}
|
||||
D_PRINTF(stderr, "client %d: started all threads.\n", pnum);
|
||||
|
||||
|
||||
/* Wait for all threads to exit or overtime */
|
||||
while (FinishedThreads < StartedThreads) {
|
||||
int tm = time(0);
|
||||
if (tm > bailtime) {
|
||||
++gf_timeexpired;
|
||||
bailtime += gt_stopinterval;
|
||||
#ifndef _WIN32
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
returnerr (stderr, "Client signaling exit, started=%d finished=%d timeexpired=%d\n",
|
||||
StartedThreads, FinishedThreads, gf_timeexpired);
|
||||
kill (0, SIGALRM); /* wake children */
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (gf_timeexpired >= EXIT_FASTEST) {
|
||||
returnerr (stderr, "Forcing sockets closed.\n");
|
||||
/* close all client sockets, to force calls to exit */
|
||||
for (tnum = 0; tnum < gn_numthreads; ++tnum) {
|
||||
if (BADSOCKET(ptcxs[tnum].sock)) continue;
|
||||
D_PRINTF (stderr, "Closing sock=%d tnum=%d\n",
|
||||
ptcxs[tnum].sock, tnum);
|
||||
set_abortive_close(ptcxs[tnum].sock);
|
||||
NETCLOSE(ptcxs[tnum].sock);
|
||||
}
|
||||
returnerr (stderr, "Forced socket close complete.\n");
|
||||
break;
|
||||
}
|
||||
MS_sleep(1);
|
||||
}
|
||||
|
||||
|
||||
D_PRINTF (stderr, "Shutdown timeexpired=%d\n", gf_timeexpired);
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
gf_timeexpired = EXIT_FAST; /* signal summary thread to exit */
|
||||
returnerr (stderr, "Clean child shutdown\n");
|
||||
} else if (gf_timeexpired >= EXIT_FASTEST) {
|
||||
returnerr (stderr, "Forced child shutdown\n");
|
||||
} else {
|
||||
returnerr (stderr, "Accellerated child shutdown\n");
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "client %d: joining summary thread\n", pnum);
|
||||
if ((ret=sysdep_thread_join(summary_tid, &status)) != 0) {
|
||||
returnerr(stderr,
|
||||
"client %d: summary thread join failed ret=%d errno=%d: %s\n",
|
||||
pnum, ret, errno, strerror(errno));
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
/* do a summary now in case we hang in joins (needed?) */
|
||||
D_PRINTF(stderr, "client %d: pre-join clientTimeSummary\n", pnum);
|
||||
clientTimeSummary(ptcxs, gn_numthreads, pnum, outfd);
|
||||
|
||||
for (tnum = 0; tnum < gn_numthreads; ++tnum) {
|
||||
D_PRINTF(stderr, "client %d: joining thread %d ID %d\n",
|
||||
pnum, tnum, ptcxs[tnum].tid);
|
||||
if (ptcxs[tnum].tid) {
|
||||
sysdep_thread_join(ptcxs[tnum].tid, &status);
|
||||
D_PRINTF(stderr, "client %d: thread %d joined ID %d, ret=%d status=%d\n",
|
||||
pnum, tnum, ptcxs[tnum].tid, ret, status);
|
||||
ptcxs[tnum].tid = 0;
|
||||
}
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
} else
|
||||
#endif /* USE_PTHREADS || _WIN32*/
|
||||
{ /* thread un-available or 0 */
|
||||
gn_numthreads = 1;
|
||||
ptcxs = (ptcx_t)mycalloc(sizeof(tcx_t) * gn_numthreads);
|
||||
|
||||
initTcx(&ptcxs[0], outfd, pnum, -1);
|
||||
|
||||
D_PRINTF(stderr, "client %d: testtime: %d\n", pnum);
|
||||
|
||||
/* set initial data point */
|
||||
D_PRINTF(stderr, "client %d: initial clientTimeSummary\n", 0);
|
||||
clientTimeSummary(ptcxs, gn_numthreads, pnum, outfd);
|
||||
|
||||
clientThread(&ptcxs[0]);
|
||||
}
|
||||
|
||||
/* final time summary feedback */
|
||||
D_PRINTF(stderr, "client %d: final summaries\n", 0);
|
||||
clientTimeSummary(ptcxs, gn_numthreads, pnum, outfd);
|
||||
clientBlockSummary(ptcxs, gn_numthreads, pnum, outfd);
|
||||
|
||||
#if 0
|
||||
for (tnum = 0; tnum < gn_numthreads; ++tnum) { /* extra reporting */
|
||||
D_PRINTF(stderr, "client %d: thread %d stats\n", pnum, tnum);
|
||||
clientStats(&ptcxs[tnum]);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (tnum = 0; tnum < gn_numthreads; ++tnum) { /* clean up */
|
||||
D_PRINTF(stderr, "client %d: thread %d destroyed\n", pnum, tnum);
|
||||
destroyTcx(&ptcxs[tnum]);
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "child: %d done\n", pnum);
|
||||
return 0;
|
||||
}
|
||||
@@ -1,203 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
* Mike Blakely
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/* calls for general error handling */
|
||||
|
||||
#include "bench.h"
|
||||
|
||||
#ifdef HAVE_VPRINTF
|
||||
#define VPRINTF(stderr, format, args) vfprintf((stderr), (format), (args))
|
||||
#else
|
||||
#ifdef HAVE_DOPRNT
|
||||
#define VPRINTF(stderr, format, args) _doprnt((format), (args), (stderr))
|
||||
#endif /* HAVE_DOPRNT */
|
||||
#endif /* HAVE_VPRINTF */
|
||||
|
||||
/* print an error message and exit 1 */
|
||||
void
|
||||
errexit(FILE *dfile, const char *format, ...)
|
||||
{
|
||||
time_t t=time(0L) - gt_startedtime;
|
||||
va_list args;
|
||||
#if defined (HAVE_SNPRINTF) && defined (HAVE_VPRINTF)
|
||||
char buff[1024];
|
||||
int r;
|
||||
#endif
|
||||
|
||||
va_start(args, format);
|
||||
|
||||
#if defined (HAVE_SNPRINTF) && defined (HAVE_VPRINTF)
|
||||
/* puts as one chunk so that output doesnt get mixed up */
|
||||
r = snprintf(buff, sizeof(buff),
|
||||
"%s[%d]\tt=%lu EXITING: ", gs_thishostname, gn_myPID, t);
|
||||
vsnprintf(buff+r, sizeof(buff) - r, format, args);
|
||||
fputs (buff, stderr);
|
||||
fflush(stderr);
|
||||
|
||||
if (gn_debug && dfile && (dfile != stderr)) {
|
||||
fputs (buff, dfile);
|
||||
fflush(dfile);
|
||||
}
|
||||
#else
|
||||
fprintf(stderr,
|
||||
"%s[%d]\tt=%lu EXITING: ", gs_thishostname, gn_myPID, t);
|
||||
VPRINTF(stderr, format, args);
|
||||
fflush(stderr);
|
||||
|
||||
if (gn_debug && dfile && (dfile != stderr)) {
|
||||
fprintf(dfile,
|
||||
"%s[%d]\tt=%lu EXITING: ", gs_thishostname, gn_myPID, t);
|
||||
VPRINTF(dfile, format, args);
|
||||
fflush(dfile);
|
||||
}
|
||||
#endif
|
||||
va_end(args);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* This is the main feedback path for errors and status */
|
||||
/* print an error message and return -1 */
|
||||
/* Also log to the debug file if available */
|
||||
int
|
||||
returnerr(FILE *dfile, const char *format, ...)
|
||||
{
|
||||
time_t t=time(0L) - gt_startedtime;
|
||||
va_list args;
|
||||
#if defined (HAVE_SNPRINTF) && defined (HAVE_VPRINTF)
|
||||
char buff[1024];
|
||||
int r;
|
||||
#endif
|
||||
|
||||
va_start(args, format);
|
||||
|
||||
#if defined (HAVE_SNPRINTF) && defined (HAVE_VPRINTF)
|
||||
/* puts as one chunk so that output doesnt get mixed up */
|
||||
r = snprintf(buff, sizeof(buff),
|
||||
"%s[%d]\tt=%lu: ", gs_thishostname, gn_myPID, t);
|
||||
vsnprintf(buff+r, sizeof(buff) - r, format, args);
|
||||
fputs (buff, stderr);
|
||||
fflush(stderr);
|
||||
|
||||
if (gn_debug && dfile && (dfile != stderr)) {
|
||||
fputs (buff, dfile);
|
||||
fflush(dfile);
|
||||
}
|
||||
#else
|
||||
fprintf(stderr,
|
||||
"%s[%d]\tt=%lu: ", gs_thishostname, gn_myPID, t);
|
||||
VPRINTF(stderr, format, args);
|
||||
fflush(stderr);
|
||||
|
||||
if (gn_debug && dfile && (dfile != stderr)) {
|
||||
fprintf(dfile,
|
||||
"%s[%d]\tt=%lu: ", gs_thishostname, gn_myPID, t);
|
||||
VPRINTF(dfile, format, args);
|
||||
fflush(dfile);
|
||||
}
|
||||
#endif
|
||||
va_end(args);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* print a debug message and then flush */
|
||||
int
|
||||
d_printf(FILE *dfile, const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
if (dfile) {
|
||||
fprintf(dfile, "%s: ", gs_thishostname);
|
||||
VPRINTF(dfile, format, args);
|
||||
}
|
||||
va_end(args);
|
||||
|
||||
if (dfile) fflush(dfile);
|
||||
return 0;
|
||||
}
|
||||
/* that's it */
|
||||
|
||||
/*
|
||||
Like d_printf, but for transaction logs.
|
||||
*/
|
||||
int
|
||||
t_printf(int fd, const char *buffer, size_t count, const char *format, ...)
|
||||
{
|
||||
time_t t=time(0L) - gt_startedtime;
|
||||
va_list args;
|
||||
char buff[1024];
|
||||
int r;
|
||||
|
||||
if (fd <= 0) return 0;
|
||||
|
||||
va_start(args, format);
|
||||
#if defined (HAVE_SNPRINTF) && defined (HAVE_VPRINTF)
|
||||
r = snprintf(buff, sizeof(buff), /* stick in standard info */
|
||||
"<LOG t=%lu length=%d ", t, count);
|
||||
snprintf(buff + r, sizeof(buff) - r, format, args);
|
||||
strcat (buff, ">\n");
|
||||
write (fd, buff, strlen(buff));
|
||||
|
||||
if (count)
|
||||
write (fd, buffer, count); /* write the (possibly binary) data */
|
||||
|
||||
r = snprintf(buff, sizeof(buff), /* terminate entry cleanly */
|
||||
"\n</LOG t=%lu length=%d>\n", t, count);
|
||||
write (fd, buff, strlen(buff));
|
||||
#else
|
||||
if (count)
|
||||
write (fd, buffer, count); /* write the (possibly binary) data */
|
||||
#endif
|
||||
va_end(args);
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* that's it */
|
||||
|
||||
/* returns the last network error as a string */
|
||||
char *
|
||||
neterrstr(void) {
|
||||
static char buf[200];
|
||||
|
||||
#ifdef _WIN32
|
||||
sprintf(buf, "WSAGetLastError()=%d", WSAGetLastError());
|
||||
WSASetLastError(0);
|
||||
#else /* !_WIN32 */
|
||||
sprintf(buf, "errno=%d: %s", errno, strerror(errno));
|
||||
errno = 0;
|
||||
#endif /* _WIN32 */
|
||||
|
||||
return buf;
|
||||
}
|
||||
@@ -1,419 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/* http-util.c -- Shared HTTP functions */
|
||||
|
||||
#include "bench.h"
|
||||
#include "http-util.h"
|
||||
|
||||
/*
|
||||
Establish (or re-establish) connection to server.
|
||||
No data is exchanged.
|
||||
*/
|
||||
int
|
||||
HttpConnect (
|
||||
ptcx_t ptcx,
|
||||
resolved_addr_t *hostInfo,
|
||||
event_timer_t *timer)
|
||||
{
|
||||
int rc=0;
|
||||
|
||||
D_PRINTF(stderr, "HttpConnect()\n");
|
||||
|
||||
event_start(ptcx, timer);
|
||||
ptcx->sock = connectSocket(ptcx, hostInfo, "tcp");
|
||||
event_stop(ptcx, timer);
|
||||
if (BADSOCKET(ptcx->sock)) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
timer->errs++;
|
||||
returnerr(debugfile,
|
||||
"%s<HttpConnect: HTTP Couldn't connect to %s: %s\n",
|
||||
ptcx->errMsg, hostInfo->hostName, neterrstr());
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (gf_abortive_close) {
|
||||
if (set_abortive_close(ptcx->sock) != 0) {
|
||||
returnerr(debugfile,
|
||||
"%s<HttpConnect: HTTP: WARNING: Could not set abortive close\n",
|
||||
ptcx->errMsg, neterrstr());
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
HttpReadResponse handles the details of reading a HTTP response It
|
||||
takes and interactive parsing function and a response buffer. The
|
||||
response buffer will hold at least the last 1/2 buffer of the data
|
||||
stream. This allows errors to be handled by the calling routine.
|
||||
Long responses should be parsed on the fly by the parsing callback.
|
||||
|
||||
HttpReadResponse handles find the content-length and header break.
|
||||
Once the break is called, it will call the parsing callback so that it can
|
||||
set findStr (which is NULL).
|
||||
|
||||
The findStr search is case insensitive if the first character of findStr
|
||||
has distinct upper and lower cases (see toupper and tolower).
|
||||
|
||||
The callback is called with the buffer, the bytes in the buffer,
|
||||
a pointer just past the findStr match, and a pointer to findStr.
|
||||
The callback should then update findStr and searchStr; and return -2
|
||||
for an error (abort message), 0 for success, and 1 for need more data.
|
||||
|
||||
findStr is expected to be a constant or static storage.
|
||||
Before exit, the parsing callback is called one last time (with NULL
|
||||
findStr and searchStr), so that it can do any cleanup.
|
||||
|
||||
Management of the buffer is done automatically by the movement of searchStr.
|
||||
|
||||
HttpReadResponse returns bytesInBuffer on success, -1 for IO error,
|
||||
-2 for error returned by the parser.
|
||||
*/
|
||||
int
|
||||
HttpReadResponse(
|
||||
ptcx_t ptcx,
|
||||
mail_command_t *cmd, /* command info for msgParse */
|
||||
void *me, /* connection state for msgParse */
|
||||
char *buffer,
|
||||
int buflen,
|
||||
parseMsgPtr_t msgParse
|
||||
)
|
||||
{
|
||||
/* read the server response and do nothing with it */
|
||||
/* Will need to look for HTTP headers and Content-Length/Keep-Alive */
|
||||
int gotheader = 0;
|
||||
int totalbytesread = 0;
|
||||
int bytesread;
|
||||
int bytesInBuffer = 0;
|
||||
const char *findStr; /* string we are watching for */
|
||||
const char *oldFindStr = NULL;
|
||||
char findStrSpn[3]; /* case insensitive search start */
|
||||
int findLen=0; /* length of string */
|
||||
char *foundStr; /* what we found */
|
||||
char *searchStart; /* where next to look for findStr */
|
||||
int contentlength = 0; /* HTTP content length */
|
||||
int bytestoread = buflen-1; /* start by reading lots */
|
||||
int getBytes = 0; /* need more input */
|
||||
|
||||
D_PRINTF(stderr, "HttpReadResponse()\n");
|
||||
|
||||
findStr = HTTP_CONTENT_LENGTH;
|
||||
searchStart = buffer;
|
||||
memset(buffer, 0, buflen); /* DEBUG */
|
||||
while (1)
|
||||
{
|
||||
if (gf_timeexpired >= EXIT_FAST) {
|
||||
D_PRINTF(stderr,"HttpReadResponse() Time expired.\n");
|
||||
break;
|
||||
}
|
||||
if (findStr != oldFindStr) { /* findStr changed */
|
||||
if (NULL == findStr) {
|
||||
findLen = 0;
|
||||
findStrSpn[0] = 0;
|
||||
} else {
|
||||
char upperC, lowerC; /* upper and lower of findStr[0] */
|
||||
findLen = strlen (findStr);
|
||||
upperC = toupper (findStr[0]);
|
||||
lowerC = tolower (findStr[0]);
|
||||
if (lowerC != upperC) {
|
||||
/*D_PRINTF (stderr, "New findStr [%s] upper %c lower %c\n",
|
||||
findStr, upperC, lowerC);*/
|
||||
findStrSpn[0] = upperC;
|
||||
findStrSpn[1] = lowerC;
|
||||
findStrSpn[2] = 0;
|
||||
} else {
|
||||
/*D_PRINTF (stderr, "New findStr [%s] NOT case sensitive\n",
|
||||
findStr);*/
|
||||
findStrSpn[0] = 0;
|
||||
}
|
||||
}
|
||||
oldFindStr = findStr;
|
||||
}
|
||||
/* See if we should read more */
|
||||
if ((getBytes > 0)
|
||||
|| (0 == findLen)
|
||||
|| ((bytesInBuffer - (searchStart - buffer)) < findLen)) {
|
||||
int count;
|
||||
|
||||
if (totalbytesread >= bytestoread) { /* done reading */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Make room for more data */
|
||||
/* need to be careful to save data for response. shift by half */
|
||||
if ((searchStart - buffer) > buflen/2) {
|
||||
/* This is the only place we reduce searchStart or bytesInBuffer */
|
||||
int toSkip = buflen/2;
|
||||
int toSave = bytesInBuffer - toSkip;
|
||||
/*D_PRINTF (stderr, "Shifting %d of %d bytes\n",
|
||||
toSave, bytesInBuffer);*/
|
||||
memcpy (buffer, buffer+toSkip, toSave); /* shift data down */
|
||||
bytesInBuffer = toSave;
|
||||
buffer[bytesInBuffer] = 0; /* re-terminate??? */
|
||||
searchStart -= toSkip;
|
||||
assert (searchStart >= buffer);
|
||||
}
|
||||
count = MIN (bytestoread-totalbytesread,
|
||||
buflen-bytesInBuffer-1);
|
||||
/*D_PRINTF(stderr, "retryRead() size=%d %d/%d inBuffer=%d\n",
|
||||
count, totalbytesread, bytestoread, bytesInBuffer);*/
|
||||
bytesread = retryRead(ptcx, ptcx->sock, buffer+bytesInBuffer, count);
|
||||
|
||||
if (0 == bytesread) { /* most likely an error */
|
||||
strcpy (ptcx->errMsg, "HttpReadResponse:got 0 bytes");
|
||||
break;
|
||||
}
|
||||
if (bytesread < 0) { /* ERROR */
|
||||
strcat (ptcx->errMsg, "<HttpReadResponse");
|
||||
return -1;
|
||||
}
|
||||
T_PRINTF(ptcx->logfile, buffer+bytesInBuffer, bytesread,
|
||||
"%s ReadResponse", cmd->proto->name); /* telemetry log */
|
||||
totalbytesread += bytesread;
|
||||
bytesInBuffer += bytesread;
|
||||
buffer[bytesInBuffer] = 0; /* terminate for string searches */
|
||||
ptcx->bytesread += bytesread; /* log statistics */
|
||||
getBytes = 0;
|
||||
} else {
|
||||
/*D_PRINTF (stderr,
|
||||
"Not reading, have %d only need %d. %d/%d\n",
|
||||
bytesInBuffer- (searchStart - buffer), findLen,
|
||||
bytestoread, totalbytesread);*/
|
||||
}
|
||||
|
||||
if (NULL == findStr) { /* nothing to search for */
|
||||
searchStart = buffer+bytesInBuffer; /* discard buffer */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* otherwise search for findStr */
|
||||
if (findStrSpn[0]) { /* do case insensitive version */
|
||||
char *cp;
|
||||
foundStr = NULL;
|
||||
for (cp = searchStart; (cp - buffer) < bytesInBuffer; ++cp) {
|
||||
cp = strpbrk (cp, findStrSpn); /* look for first char match */
|
||||
if (NULL == cp) {
|
||||
break;
|
||||
}
|
||||
if (!strnicmp(cp, findStr, findLen)) { /* check whole match */
|
||||
foundStr = cp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else { /* non case sensitive version */
|
||||
foundStr = strstr(searchStart, findStr);
|
||||
}
|
||||
|
||||
if (NULL == foundStr) { /* found nothing, shift and continue */
|
||||
/* jump to findLen-1 from end */
|
||||
if (bytesInBuffer < findLen)
|
||||
continue; /* nothing to shift */
|
||||
|
||||
searchStart = buffer + bytesInBuffer - findLen + 1;
|
||||
continue; /* get more input */
|
||||
}
|
||||
|
||||
/* Found search string */
|
||||
/*D_PRINTF (stderr, "Found [%s] after %d bytes\n",
|
||||
findStr, totalbytesread);*/
|
||||
searchStart = foundStr + findLen; /* found this much */
|
||||
|
||||
if (0 == gotheader) { /* found length */
|
||||
contentlength = atoi(searchStart); /* save contentlength */
|
||||
searchStart = strchr (searchStart, '\n'); /* jump to EOL */
|
||||
if (NULL == searchStart) { /* missing line end, get more */
|
||||
searchStart = buffer;
|
||||
} else { /* got complete contentlength line */
|
||||
gotheader++;
|
||||
findStr = HTTP_HEADER_BREAK; /* now look for break */
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if (1 == gotheader) { /* found header break */
|
||||
gotheader++;
|
||||
/* now compute bytetoread */
|
||||
bytestoread = contentlength
|
||||
+ ((searchStart - buffer) /* position in buffer */
|
||||
+ (totalbytesread - bytesInBuffer)); /* buffer offset */
|
||||
D_PRINTF(stderr, "contentlength=%d, bytestoread=%d\n",
|
||||
contentlength, bytestoread);
|
||||
|
||||
findStr = NULL; /* should chain into extra searches */
|
||||
|
||||
if (msgParse) { /* initialize callback */
|
||||
int rc;
|
||||
/* having findStr == NULL signal initial callback */
|
||||
rc = (*(msgParse)) (ptcx, cmd, me,
|
||||
buffer, bytesInBuffer, &searchStart, &findStr);
|
||||
if (rc < 0) { /* parser signaled error */
|
||||
return rc;
|
||||
}
|
||||
if (NULL == searchStart) {
|
||||
searchStart = buffer+bytesInBuffer; /* discard buffer */
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (msgParse) { /* call extra searches */
|
||||
int rc;
|
||||
rc = (*(msgParse)) (ptcx, cmd, me,
|
||||
buffer, bytesInBuffer, &searchStart, &findStr);
|
||||
if (rc < 0) { /* protocol error */
|
||||
return rc;
|
||||
}
|
||||
if (rc > 0) { /* need more data */
|
||||
getBytes = rc;
|
||||
searchStart = foundStr; /* back up search string */
|
||||
continue;
|
||||
}
|
||||
if (searchStart < buffer) { /* or NULL */
|
||||
searchStart = buffer+bytesInBuffer; /* discard buffer */
|
||||
}
|
||||
} else {
|
||||
searchStart = buffer+bytesInBuffer; /* discard buffer */
|
||||
}
|
||||
}
|
||||
}
|
||||
D_PRINTF(stderr, "HttpReadResponse: Read %d/%d saved %d\n",
|
||||
totalbytesread, bytestoread, bytesInBuffer);
|
||||
if (msgParse) { /* call extra searches */
|
||||
findStr = NULL; /* signal final callback */
|
||||
searchStart = NULL;
|
||||
(void)(*(msgParse)) (ptcx, cmd, me,
|
||||
buffer, bytesInBuffer, &searchStart, &findStr);
|
||||
}
|
||||
|
||||
return bytesInBuffer;
|
||||
}
|
||||
|
||||
/*
|
||||
Handle a command-response transaction. Connects/retries as needed.
|
||||
Expects pointers to buffers of these sizes:
|
||||
char command[MAX_COMMAND_LEN]
|
||||
char response[resplen]
|
||||
*/
|
||||
int
|
||||
HttpCommandResponse (
|
||||
ptcx_t ptcx, /* thread state */
|
||||
mail_command_t *cmd, /* command info [blind] */
|
||||
void *me, /* connection state for msgParse */
|
||||
resolved_addr_t *hostInfo, /* reconnect info */
|
||||
event_timer_t *reconnect, /* timer for reconnects */
|
||||
|
||||
event_timer_t *timer, /* timer for this command */
|
||||
char *command, /* command to send */
|
||||
char *response, /* response buffer */
|
||||
int resplen, /* size of response buffer */
|
||||
parseMsgPtr_t msgParse) /* response handler */
|
||||
{
|
||||
int retries = 0;
|
||||
int ret;
|
||||
|
||||
if (response == NULL)
|
||||
return -1;
|
||||
|
||||
response[0] = 0; /* make sure it makes sense on error */
|
||||
|
||||
D_PRINTF(stderr, "HttpCommandResponse() command=[%.99s]\n", command);
|
||||
|
||||
while (retries++ < HTTP_MAX_RECONNECTS) {
|
||||
if (BADSOCKET(ptcx->sock)) {
|
||||
ret = HttpConnect(ptcx, hostInfo, reconnect);
|
||||
if (ret == -1) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/* send the command already formatted */
|
||||
T_PRINTF(ptcx->logfile, command, strlen (command),
|
||||
"%s SendCommand", cmd->proto->name);
|
||||
event_start(ptcx, timer);
|
||||
ret = sendCommand(ptcx, ptcx->sock, command);
|
||||
if (ret == -1) {
|
||||
event_stop(ptcx, timer);
|
||||
reconnect->errs++;
|
||||
/* this can only mean an IO error. Probably EPIPE */
|
||||
NETCLOSE(ptcx->sock);
|
||||
ptcx->sock = BADSOCKET_VALUE;
|
||||
strcat (ptcx->errMsg, "<HttpCommandResponse");
|
||||
D_PRINTF (stderr, "%s Aborting connection %s\n",
|
||||
ptcx->errMsg, neterrstr());
|
||||
continue;
|
||||
}
|
||||
|
||||
/* read server response */
|
||||
ret = HttpReadResponse(ptcx, cmd, me, response, resplen, msgParse);
|
||||
event_stop(ptcx, timer);
|
||||
if (ret == 0) { /* got nothing */
|
||||
/* Probably an IO error. It will be definate if re-tried. */
|
||||
MS_usleep (5000); /* time for bytes to show up */
|
||||
continue; /* just re-try it */
|
||||
} else if (ret == -1) { /* IO error */
|
||||
reconnect->errs++;
|
||||
NETCLOSE(ptcx->sock);
|
||||
ptcx->sock = BADSOCKET_VALUE;
|
||||
strcat (ptcx->errMsg, "<HttpCommandResponse");
|
||||
D_PRINTF (stderr, "%s Aborting connection %s\n",
|
||||
ptcx->errMsg, neterrstr());
|
||||
continue;
|
||||
} else if (ret < -1) { /* some other error */
|
||||
timer->errs++;
|
||||
/* this is overkill */
|
||||
NETCLOSE(ptcx->sock);
|
||||
ptcx->sock = BADSOCKET_VALUE;
|
||||
strcat (ptcx->errMsg, "<HttpCommandResponse: protocol ERROR");
|
||||
return -1;
|
||||
}
|
||||
/*D_PRINTF (stderr, "HttpCommandResponse saved %d bytes response=[%s]\n",
|
||||
ret, response);*/
|
||||
/* You get parent.timeoutCB on any kind of error (like bad sid) */
|
||||
if (strstr (response, "parent.timeoutCB()")) {
|
||||
timer->errs++;
|
||||
NETCLOSE(ptcx->sock);
|
||||
ptcx->sock = BADSOCKET_VALUE;
|
||||
strcpy (ptcx->errMsg, "HttpCommandResponse: got HTTP error msg");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
reconnect->errs++;
|
||||
NETCLOSE(ptcx->sock);
|
||||
ptcx->sock = BADSOCKET_VALUE;
|
||||
strcat (ptcx->errMsg, "<HttpCommandResponse: Too many connection retries");
|
||||
return -1;
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/* http-util.h -- Shared HTTP functions */
|
||||
|
||||
#define HTTP_HEADER_BREAK "\r\n\r\n"
|
||||
#define HTTP_CONTENT_TYPE_POST "Content-type: application/x-www-form-urlencoded"
|
||||
#define HTTP_CONTENT_LENGTH "Content-length:"
|
||||
#define HTTP_LOCATION "Location:"
|
||||
#define HTTP_PROTOCOL "http://"
|
||||
|
||||
#define HTTP_MAX_RECONNECTS 5 /* max to reconnect/retry a command */
|
||||
|
||||
/* Callback type for parsing messages on the fly */
|
||||
typedef int (*parseMsgPtr_t)(
|
||||
ptcx_t, pmail_command_t, void *me,
|
||||
char *buffer, int bytesInBuffer, char **searchStr, const char **findStr);
|
||||
|
||||
extern int HttpConnect(ptcx_t ptcx, resolved_addr_t *hostInfo,
|
||||
event_timer_t *timer);
|
||||
|
||||
extern int HttpReadResponse(ptcx_t ptcx, mail_command_t *cmd, void *me,
|
||||
char *responce, int resplen,
|
||||
parseMsgPtr_t msgParse);
|
||||
|
||||
extern int HttpCommandResponse (ptcx_t ptcx, mail_command_t *cmd, void *me,
|
||||
resolved_addr_t *hostInfo, event_timer_t *reconnect,
|
||||
event_timer_t *timer, char *command, char *response, int resplen,
|
||||
parseMsgPtr_t msgParse);
|
||||
@@ -1,405 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/* http.c: HTTP protocol test */
|
||||
|
||||
#include "bench.h"
|
||||
#include "http-util.h"
|
||||
|
||||
#define MAX_HTTP_RESPONSE_LEN (2*1024) /* size of sliding buffer */
|
||||
|
||||
/*
|
||||
these are protocol dependent timers for Pop, Imap, Smtp, Http
|
||||
There is one of these for every command in every thread.
|
||||
*/
|
||||
typedef struct http_stats {
|
||||
event_timer_t connect; /* initial connections */
|
||||
event_timer_t reconnect; /* re-connections */
|
||||
event_timer_t msgread; /* AKA retrieve */
|
||||
event_timer_t logout; /* AKA dis-connect */
|
||||
/* no local storage */
|
||||
} http_stats_t;
|
||||
|
||||
/* These are common to POP, IMAP, SMTP, HTTP */
|
||||
typedef struct http_command {
|
||||
resolved_addr_t hostInfo; /* Host, port, and IP cache */
|
||||
|
||||
char * httpCommand; /* Old: single HTTP command */
|
||||
|
||||
#if 0
|
||||
string_list_t getFirstCmds; /* GET commands after connect */
|
||||
string_list_t getLoopCmds; /* GET commands, each loop */
|
||||
string_list_t getLastCmds; /* GET commands before disconnect */
|
||||
#endif
|
||||
|
||||
} http_command_t;
|
||||
|
||||
/*
|
||||
State during command execution.
|
||||
*/
|
||||
typedef struct _doHTTP_state {
|
||||
int nothingHere;
|
||||
} doHTTP_state_t;
|
||||
|
||||
static void doHttpExit (ptcx_t ptcx, doHTTP_state_t *me);
|
||||
static int HttpParseNameValue (pmail_command_t cmd, char *name, char *tok);
|
||||
|
||||
/*
|
||||
Set defaults in command structure
|
||||
*/
|
||||
int
|
||||
HttpParseStart (pmail_command_t cmd,
|
||||
char *line,
|
||||
param_list_t *defparm)
|
||||
{
|
||||
param_list_t *pp;
|
||||
http_command_t *mycmd = (http_command_t *)mycalloc
|
||||
(sizeof (http_command_t));
|
||||
cmd->data = mycmd;
|
||||
|
||||
cmd->numLoops = 1; /* default 1 downloads */
|
||||
mycmd->hostInfo.portNum = HTTP_PORT; /* get default port */
|
||||
|
||||
D_PRINTF(stderr, "Http Assign defaults\n");
|
||||
/* Fill in defaults first, ignore defaults we dont use */
|
||||
for (pp = defparm; pp; pp = pp->next) {
|
||||
(void)HttpParseNameValue (cmd, pp->name, pp->value);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
Fill in structure from a list of lines
|
||||
*/
|
||||
int
|
||||
HttpParseEnd (pmail_command_t cmd,
|
||||
string_list_t *section,
|
||||
param_list_t *defparm)
|
||||
{
|
||||
http_command_t *mycmd = (http_command_t *)cmd->data;
|
||||
string_list_t *sp;
|
||||
|
||||
/* Now parse section lines */
|
||||
D_PRINTF(stderr, "Http Assign section lines\n");
|
||||
/* skip first and last */
|
||||
for (sp = section->next; sp->next; sp = sp->next) {
|
||||
char *name = sp->value;
|
||||
char *tok = name + strcspn(name, " \t=");
|
||||
*tok++ = 0; /* split name off */
|
||||
tok += strspn(tok, " \t=");
|
||||
|
||||
string_tolower(name);
|
||||
tok = string_unquote(tok);
|
||||
|
||||
if (HttpParseNameValue (cmd, name, tok) < 0) {
|
||||
/* not a known attr */
|
||||
D_PRINTF(stderr,"unknown attribute '%s' '%s'\n", name, tok);
|
||||
returnerr(stderr,"unknown attribute '%s' '%s'\n", name, tok);
|
||||
}
|
||||
}
|
||||
|
||||
/* check for some of the required command attrs */
|
||||
if (!mycmd->hostInfo.hostName) {
|
||||
D_PRINTF(stderr,"missing server for command");
|
||||
return returnerr(stderr,"missing server for command\n");
|
||||
}
|
||||
|
||||
if (!mycmd->httpCommand) {
|
||||
D_PRINTF(stderr,"missing httpcommand for HTTP");
|
||||
return returnerr(stderr,"missing httpcommand for HTTP\n");
|
||||
}
|
||||
|
||||
/* see if we can resolve the mailserver addr */
|
||||
if (resolve_addrs(mycmd->hostInfo.hostName, "tcp",
|
||||
&(mycmd->hostInfo.host_phe),
|
||||
&(mycmd->hostInfo.host_ppe),
|
||||
&(mycmd->hostInfo.host_addr),
|
||||
&(mycmd->hostInfo.host_type))) {
|
||||
return returnerr (stderr, "Error resolving hostname '%s'\n",
|
||||
mycmd->hostInfo.hostName);
|
||||
} else {
|
||||
mycmd->hostInfo.resolved = 1; /* mark the hostInfo resolved */
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
Parse arguments for http command
|
||||
*/
|
||||
static int
|
||||
HttpParseNameValue (pmail_command_t cmd,
|
||||
char *name,
|
||||
char *tok)
|
||||
{
|
||||
http_command_t *mycmd = (http_command_t *)cmd->data;
|
||||
D_PRINTF (stderr, "HttpParseNameValue(name='%s' value='%s')\n", name, tok);
|
||||
|
||||
/* find a home for the attr/value */
|
||||
if (cmdParseNameValue(cmd, name, tok))
|
||||
; /* done */
|
||||
else if (strcmp(name, "server") == 0)
|
||||
mycmd->hostInfo.hostName = mystrdup (tok);
|
||||
else if (strcmp(name, "portnum") == 0)
|
||||
mycmd->hostInfo.portNum = atoi(tok);
|
||||
else if (strcmp(name, "httpcommand") == 0)
|
||||
mycmd->httpCommand = mystrdup (tok);
|
||||
/*stringListAdd(&mycmd->getFirstCmds, tok);*/
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* PROTOCOL specific */
|
||||
void
|
||||
HttpStatsInit(mail_command_t *cmd, cmd_stats_t *p, int procNum, int threadNum)
|
||||
{
|
||||
assert (NULL != p);
|
||||
|
||||
if (!p->data) { /* create it */
|
||||
p->data = mycalloc (sizeof (http_stats_t));
|
||||
} else { /* zero it */
|
||||
memset (p->data, 0, sizeof (http_stats_t));
|
||||
}
|
||||
|
||||
if (cmd) { /* do sub-range calulations */
|
||||
/*http_command_t *mycmd = (http_command_t *)cmd->data;
|
||||
http_stats_t *stats = (http_stats_t *)p->data;*/
|
||||
}
|
||||
}
|
||||
|
||||
/* PROTOCOL specific */
|
||||
void
|
||||
HttpStatsUpdate(protocol_t *proto,
|
||||
cmd_stats_t *sum,
|
||||
cmd_stats_t *incr)
|
||||
{
|
||||
http_stats_t *ss = (http_stats_t *)sum->data;
|
||||
http_stats_t *is = (http_stats_t *)incr->data;
|
||||
|
||||
event_sum(&sum->idle, &incr->idle);
|
||||
event_sum(&ss->connect, &is->connect);
|
||||
event_sum(&ss->msgread, &is->msgread);
|
||||
event_sum(&ss->logout, &is->logout);
|
||||
|
||||
event_reset(&incr->combined); /* figure out total */
|
||||
event_sum(&incr->combined, &incr->idle);
|
||||
event_sum(&incr->combined, &is->connect);
|
||||
event_sum(&incr->combined, &is->msgread);
|
||||
event_sum(&incr->combined, &is->logout);
|
||||
|
||||
event_sum(&sum->combined, &incr->combined); /* add our total to sum-total*/
|
||||
|
||||
sum->totalerrs += incr->totalerrs;
|
||||
sum->totalcommands += incr->totalcommands;
|
||||
}
|
||||
|
||||
/* PROTOCOL specific */
|
||||
void
|
||||
HttpStatsOutput(protocol_t *proto,
|
||||
cmd_stats_t *ptimer,
|
||||
char *buf)
|
||||
{
|
||||
char eventtextbuf[SIZEOF_EVENTTEXT];
|
||||
http_stats_t *stats = (http_stats_t *)ptimer->data;
|
||||
|
||||
*buf = 0;
|
||||
|
||||
/* BUG blocks done in clientSummary */
|
||||
event_to_text(&ptimer->combined, eventtextbuf);
|
||||
sprintf(&buf[strlen(buf)], "total=%s ", eventtextbuf);
|
||||
|
||||
event_to_text(&stats->connect, eventtextbuf);
|
||||
sprintf(&buf[strlen(buf)], "conn=%s ", eventtextbuf);
|
||||
|
||||
event_to_text(&stats->msgread, eventtextbuf);
|
||||
sprintf(&buf[strlen(buf)], "retrieve=%s ", eventtextbuf);
|
||||
|
||||
event_to_text(&stats->logout, eventtextbuf);
|
||||
sprintf(&buf[strlen(buf)], "logout=%s ", eventtextbuf);
|
||||
|
||||
event_to_text(&ptimer->idle, eventtextbuf);
|
||||
sprintf(&buf[strlen(buf)], "idle=%s ", eventtextbuf);
|
||||
|
||||
}
|
||||
|
||||
/* PROTOCOL specific */
|
||||
void
|
||||
HttpStatsFormat (protocol_t *pp,
|
||||
const char *extra, /* extra text to insert (client=) */
|
||||
char *buf)
|
||||
{
|
||||
static char *timerList[] = { /* must match order of StatsOutput */
|
||||
"total",
|
||||
"conn", "retrieve", "logout",
|
||||
"idle" };
|
||||
|
||||
char **tp;
|
||||
char *cp = buf;
|
||||
int ii;
|
||||
|
||||
/* Define the contents of each timer
|
||||
These must all the same, to that the core time functions
|
||||
can be qualified. We specify each one for reduce.pl to work right.
|
||||
*/
|
||||
|
||||
for (ii=0, tp=timerList;
|
||||
ii < (sizeof (timerList)/sizeof (timerList[0]));
|
||||
++ii, ++tp) {
|
||||
sprintf(cp, "<FORMAT %s TIMER=[%s]>%s</FORMAT>\n",
|
||||
extra, *tp,
|
||||
gs_eventToTextFormat); /* match event_to_text*/
|
||||
for (; *cp; ++cp); /* skip to the end of the string */
|
||||
}
|
||||
/* BUG blocks matches clientSummary */
|
||||
sprintf(cp, "<FORMAT %s PROTOCOL={%s}>blocks=blocks ",
|
||||
extra, pp->name);
|
||||
for (; *cp; ++cp); /* skip to the end of the string */
|
||||
for (ii=0, tp=timerList; /* same as above list (for now) */
|
||||
ii < (sizeof (timerList)/sizeof (timerList[0]));
|
||||
++ii, ++tp) {
|
||||
sprintf (cp, "%s=[%s] ", *tp, *tp);
|
||||
for (; *cp; ++cp); /* skip to the end of the string */
|
||||
}
|
||||
strcat (cp, "</FORMAT>\n");
|
||||
}
|
||||
|
||||
void *
|
||||
doHttpStart(ptcx_t ptcx, mail_command_t *cmd, cmd_stats_t *ptimer)
|
||||
{
|
||||
doHTTP_state_t *me = (doHTTP_state_t *)mycalloc (sizeof (doHTTP_state_t));
|
||||
http_stats_t *stats = (http_stats_t *)ptimer->data;
|
||||
http_command_t *mycmd = (http_command_t *)cmd->data;
|
||||
|
||||
if (!me) return NULL;
|
||||
|
||||
if (HttpConnect(ptcx, &mycmd->hostInfo, &stats->connect) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* there is no banner or login state for HTTP */
|
||||
|
||||
return me;
|
||||
}
|
||||
|
||||
int
|
||||
doHttpLoop (
|
||||
ptcx_t ptcx,
|
||||
mail_command_t *cmd,
|
||||
cmd_stats_t *ptimer,
|
||||
void *mystate)
|
||||
{
|
||||
doHTTP_state_t *me = (doHTTP_state_t *)mystate;
|
||||
char command[MAX_COMMAND_LEN];
|
||||
char respBuffer[MAX_HTTP_RESPONSE_LEN];
|
||||
int rc;
|
||||
http_stats_t *stats = (http_stats_t *)ptimer->data;
|
||||
http_command_t *mycmd = (http_command_t *)cmd->data;
|
||||
|
||||
if (BADSOCKET(ptcx->sock)) { /* re-connect if needed */
|
||||
rc = HttpConnect(ptcx, &mycmd->hostInfo, &stats->connect);
|
||||
if (rc == -1) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* send the HTTP command */
|
||||
|
||||
strcpy (command, mycmd->httpCommand);
|
||||
strcat (command, " HTTP/1.0\r\n");
|
||||
/* other headers go here... */
|
||||
strcat(command, "\r\n");
|
||||
rc = HttpCommandResponse(ptcx, cmd, mystate,
|
||||
&mycmd->hostInfo, &stats->connect,
|
||||
&stats->msgread,
|
||||
command, respBuffer,
|
||||
sizeof(respBuffer), NULL);
|
||||
if (rc == 0) {
|
||||
doHttpExit (ptcx, me);
|
||||
return -1;
|
||||
}
|
||||
if (rc == -1) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->msgread.errs++;
|
||||
}
|
||||
doHttpExit (ptcx, me);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
doHttpEnd(ptcx_t ptcx, mail_command_t *cmd, cmd_stats_t *ptimer, void *mystate)
|
||||
{
|
||||
doHTTP_state_t *me = (doHTTP_state_t *)mystate;
|
||||
http_stats_t *stats = (http_stats_t *)ptimer->data;
|
||||
|
||||
if (BADSOCKET(ptcx->sock)) return; /* closed by previous error */
|
||||
|
||||
#if 0
|
||||
int rc;
|
||||
char command[MAX_COMMAND_LEN];
|
||||
char respBuffer[MAX_RESPONSE_LEN];
|
||||
|
||||
/* send HTTP QUIT equivalent */
|
||||
sprintf(command, "QUIT%s", CRLF);
|
||||
event_start(ptcx, &stats->logout);
|
||||
rc = doHttpCommandResponse(ptcx, ptcx->sock, command, respBuffer);
|
||||
event_stop(ptcx, &stats->logout);
|
||||
if (rc == -1) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->logout.errs++;
|
||||
}
|
||||
}
|
||||
#else
|
||||
event_start(ptcx, &stats->logout);
|
||||
NETCLOSE(ptcx->sock); ptcx->sock = BADSOCKET_VALUE;
|
||||
event_stop(ptcx, &stats->logout);
|
||||
#endif
|
||||
|
||||
doHttpExit (ptcx, me);
|
||||
}
|
||||
|
||||
void
|
||||
doHttpExit (ptcx_t ptcx, doHTTP_state_t *me)
|
||||
{
|
||||
if (!BADSOCKET(ptcx->sock))
|
||||
NETCLOSE(ptcx->sock);
|
||||
ptcx->sock = BADSOCKET_VALUE;
|
||||
|
||||
myfree (me);
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="mailclient" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=mailclient - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mailclient.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mailclient.mak" CFG="mailclient - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "mailclient - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "mailclient - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /I /D "VERSION=\" 4.1\"" /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /machine:I386 /out:"..\built\WINNT4.0_OPT.OBJ\mailclient.exe"
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "_WIN32" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /D "VERSION=\" 4.1\"" /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:console /debug /machine:I386 /out:"..\built\WINNT4.0_DBG.OBJ\mailclient.exe" /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "mailclient - Win32 Release"
|
||||
# Name "mailclient - Win32 Debug"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\bench.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\client.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\errexit.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\getopt.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\http.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\imap4.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\main.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\parse.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\pop3.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\smtp.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\sysdep.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\timefunc.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\wmap.c
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
||||
@@ -1,465 +0,0 @@
|
||||
# Microsoft Developer Studio Generated NMAKE File, Based on mailclient.dsp
|
||||
!IF "$(CFG)" == ""
|
||||
CFG=mailclient - Win32 Debug
|
||||
!MESSAGE No configuration specified. Defaulting to mailclient - Win32 Debug.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" != "mailclient - Win32 Release" && "$(CFG)" != "mailclient - Win32 Debug"
|
||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mailclient.mak" CFG="mailclient - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "mailclient - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "mailclient - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
!ERROR An invalid configuration is specified.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(OS)" == "Windows_NT"
|
||||
NULL=
|
||||
!ELSE
|
||||
NULL=nul
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
OUTDIR=.\Release
|
||||
INTDIR=.\Release
|
||||
|
||||
ALL : "..\built\WINNT4.0_OPT.OBJ\mailclient.exe"
|
||||
|
||||
|
||||
CLEAN :
|
||||
-@erase "$(INTDIR)\bench.obj"
|
||||
-@erase "$(INTDIR)\client.obj"
|
||||
-@erase "$(INTDIR)\errexit.obj"
|
||||
-@erase "$(INTDIR)\getopt.obj"
|
||||
-@erase "$(INTDIR)\http.obj"
|
||||
-@erase "$(INTDIR)\imap4.obj"
|
||||
-@erase "$(INTDIR)\main.obj"
|
||||
-@erase "$(INTDIR)\parse.obj"
|
||||
-@erase "$(INTDIR)\pop3.obj"
|
||||
-@erase "$(INTDIR)\smtp.obj"
|
||||
-@erase "$(INTDIR)\sysdep.obj"
|
||||
-@erase "$(INTDIR)\timefunc.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(INTDIR)\wmap.obj"
|
||||
-@erase "..\built\WINNT4.0_OPT.OBJ\mailclient.exe"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP=cl.exe
|
||||
CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /I /D "VERSION=\" 4.1\"" /c
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
RSC=rc.exe
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mailclient.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LINK32=link.exe
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\mailclient.pdb" /machine:I386 /out:"..\built\WINNT4.0_OPT.OBJ\mailclient.exe"
|
||||
LINK32_OBJS= \
|
||||
"$(INTDIR)\bench.obj" \
|
||||
"$(INTDIR)\client.obj" \
|
||||
"$(INTDIR)\errexit.obj" \
|
||||
"$(INTDIR)\getopt.obj" \
|
||||
"$(INTDIR)\http.obj" \
|
||||
"$(INTDIR)\imap4.obj" \
|
||||
"$(INTDIR)\main.obj" \
|
||||
"$(INTDIR)\parse.obj" \
|
||||
"$(INTDIR)\pop3.obj" \
|
||||
"$(INTDIR)\smtp.obj" \
|
||||
"$(INTDIR)\sysdep.obj" \
|
||||
"$(INTDIR)\timefunc.obj" \
|
||||
"$(INTDIR)\wmap.obj"
|
||||
|
||||
"..\built\WINNT4.0_OPT.OBJ\mailclient.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
||||
$(LINK32) @<<
|
||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||
<<
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
OUTDIR=.\Debug
|
||||
INTDIR=.\Debug
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Debug
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "..\built\WINNT4.0_DBG.OBJ\mailclient.exe" "$(OUTDIR)\mailclient.bsc"
|
||||
|
||||
|
||||
CLEAN :
|
||||
-@erase "$(INTDIR)\bench.obj"
|
||||
-@erase "$(INTDIR)\bench.sbr"
|
||||
-@erase "$(INTDIR)\client.obj"
|
||||
-@erase "$(INTDIR)\client.sbr"
|
||||
-@erase "$(INTDIR)\errexit.obj"
|
||||
-@erase "$(INTDIR)\errexit.sbr"
|
||||
-@erase "$(INTDIR)\getopt.obj"
|
||||
-@erase "$(INTDIR)\getopt.sbr"
|
||||
-@erase "$(INTDIR)\http.obj"
|
||||
-@erase "$(INTDIR)\http.sbr"
|
||||
-@erase "$(INTDIR)\imap4.obj"
|
||||
-@erase "$(INTDIR)\imap4.sbr"
|
||||
-@erase "$(INTDIR)\main.obj"
|
||||
-@erase "$(INTDIR)\main.sbr"
|
||||
-@erase "$(INTDIR)\parse.obj"
|
||||
-@erase "$(INTDIR)\parse.sbr"
|
||||
-@erase "$(INTDIR)\pop3.obj"
|
||||
-@erase "$(INTDIR)\pop3.sbr"
|
||||
-@erase "$(INTDIR)\smtp.obj"
|
||||
-@erase "$(INTDIR)\smtp.sbr"
|
||||
-@erase "$(INTDIR)\sysdep.obj"
|
||||
-@erase "$(INTDIR)\sysdep.sbr"
|
||||
-@erase "$(INTDIR)\timefunc.obj"
|
||||
-@erase "$(INTDIR)\timefunc.sbr"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(INTDIR)\vc60.pdb"
|
||||
-@erase "$(INTDIR)\wmap.obj"
|
||||
-@erase "$(INTDIR)\wmap.sbr"
|
||||
-@erase "$(OUTDIR)\mailclient.bsc"
|
||||
-@erase "$(OUTDIR)\mailclient.pdb"
|
||||
-@erase "..\built\WINNT4.0_DBG.OBJ\mailclient.exe"
|
||||
-@erase "..\built\WINNT4.0_DBG.OBJ\mailclient.ilk"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP=cl.exe
|
||||
CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "_WIN32" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /D "VERSION=\" 4.1\"" /c
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
RSC=rc.exe
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mailclient.bsc"
|
||||
BSC32_SBRS= \
|
||||
"$(INTDIR)\bench.sbr" \
|
||||
"$(INTDIR)\client.sbr" \
|
||||
"$(INTDIR)\errexit.sbr" \
|
||||
"$(INTDIR)\getopt.sbr" \
|
||||
"$(INTDIR)\http.sbr" \
|
||||
"$(INTDIR)\imap4.sbr" \
|
||||
"$(INTDIR)\main.sbr" \
|
||||
"$(INTDIR)\parse.sbr" \
|
||||
"$(INTDIR)\pop3.sbr" \
|
||||
"$(INTDIR)\smtp.sbr" \
|
||||
"$(INTDIR)\sysdep.sbr" \
|
||||
"$(INTDIR)\timefunc.sbr" \
|
||||
"$(INTDIR)\wmap.sbr"
|
||||
|
||||
"$(OUTDIR)\mailclient.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
|
||||
$(BSC32) @<<
|
||||
$(BSC32_FLAGS) $(BSC32_SBRS)
|
||||
<<
|
||||
|
||||
LINK32=link.exe
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\mailclient.pdb" /debug /machine:I386 /out:"..\built\WINNT4.0_DBG.OBJ\mailclient.exe" /pdbtype:sept
|
||||
LINK32_OBJS= \
|
||||
"$(INTDIR)\bench.obj" \
|
||||
"$(INTDIR)\client.obj" \
|
||||
"$(INTDIR)\errexit.obj" \
|
||||
"$(INTDIR)\getopt.obj" \
|
||||
"$(INTDIR)\http.obj" \
|
||||
"$(INTDIR)\imap4.obj" \
|
||||
"$(INTDIR)\main.obj" \
|
||||
"$(INTDIR)\parse.obj" \
|
||||
"$(INTDIR)\pop3.obj" \
|
||||
"$(INTDIR)\smtp.obj" \
|
||||
"$(INTDIR)\sysdep.obj" \
|
||||
"$(INTDIR)\timefunc.obj" \
|
||||
"$(INTDIR)\wmap.obj"
|
||||
|
||||
"..\built\WINNT4.0_DBG.OBJ\mailclient.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
||||
$(LINK32) @<<
|
||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||
<<
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
||||
!IF EXISTS("mailclient.dep")
|
||||
!INCLUDE "mailclient.dep"
|
||||
!ELSE
|
||||
!MESSAGE Warning: cannot find "mailclient.dep"
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release" || "$(CFG)" == "mailclient - Win32 Debug"
|
||||
SOURCE=.\bench.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\bench.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\bench.obj" "$(INTDIR)\bench.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\client.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\client.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\client.obj" "$(INTDIR)\client.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\errexit.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\errexit.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\errexit.obj" "$(INTDIR)\errexit.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\getopt.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\getopt.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\getopt.obj" "$(INTDIR)\getopt.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\http.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\http.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\http.obj" "$(INTDIR)\http.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\imap4.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\imap4.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\imap4.obj" "$(INTDIR)\imap4.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\main.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\main.obj" "$(INTDIR)\main.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\parse.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\parse.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\parse.obj" "$(INTDIR)\parse.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\pop3.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\pop3.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\pop3.obj" "$(INTDIR)\pop3.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\smtp.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\smtp.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\smtp.obj" "$(INTDIR)\smtp.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\sysdep.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\sysdep.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\sysdep.obj" "$(INTDIR)\sysdep.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\timefunc.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\timefunc.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\timefunc.obj" "$(INTDIR)\timefunc.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=.\wmap.c
|
||||
|
||||
!IF "$(CFG)" == "mailclient - Win32 Release"
|
||||
|
||||
|
||||
"$(INTDIR)\wmap.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ELSEIF "$(CFG)" == "mailclient - Win32 Debug"
|
||||
|
||||
|
||||
"$(INTDIR)\wmap.obj" "$(INTDIR)\wmap.sbr" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
@@ -1,974 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/*
|
||||
main.c handles all the initialization and then forks off sub processes.
|
||||
*/
|
||||
|
||||
#include "bench.h"
|
||||
|
||||
/* really globalize variables */
|
||||
volatile int gf_timeexpired = 0;
|
||||
time_t gt_testtime = 0; /* time of test, in seconds */
|
||||
time_t gt_startedtime = 0; /* when we started */
|
||||
volatile time_t gt_shutdowntime = 0; /* startedtime + testtime */
|
||||
time_t gt_stopinterval = 0; /* MAX (ramptime/5, 10) */
|
||||
time_t gt_aborttime = 0; /* startedtime + testtime + ramptime*/
|
||||
|
||||
int gn_record_telemetry = 0;
|
||||
int gn_total_weight = 0;
|
||||
int gn_client_throttle = 0;
|
||||
int gn_maxerrorcnt = 0;
|
||||
int gn_maxBlockCnt = 0;
|
||||
int gn_numprocs = 0;
|
||||
int gn_numthreads = 0;
|
||||
int gn_debug = 0;
|
||||
int gn_feedback_secs = 5;
|
||||
int gf_abortive_close = 0;
|
||||
int gn_number_of_commands = 0;
|
||||
int gf_imapForceUniqueness = 0;
|
||||
char gs_dateStamp[DATESTAMP_LEN];
|
||||
char gs_thishostname[MAXHOSTNAMELEN+10] = "";
|
||||
char *gs_parsename = gs_thishostname; /* name used during parsing */
|
||||
pid_t gn_myPID = 0;
|
||||
mail_command_t *g_loaded_comm_list; /* actually a dynamic array */
|
||||
|
||||
protocol_t g_protocols[] = { /* array of protocol information */
|
||||
{
|
||||
"SMTP",
|
||||
SmtpParseStart,
|
||||
SmtpParseEnd,
|
||||
sendSMTPStart,
|
||||
sendSMTPLoop,
|
||||
sendSMTPEnd,
|
||||
pishStatsFormat,
|
||||
pishStatsInit,
|
||||
pishStatsUpdate,
|
||||
pishStatsOutput,
|
||||
},
|
||||
{
|
||||
"POP3",
|
||||
Pop3ParseStart,
|
||||
Pop3ParseEnd,
|
||||
doPop3Start,
|
||||
doPop3Loop,
|
||||
doPop3End,
|
||||
pishStatsFormat,
|
||||
pishStatsInit,
|
||||
pishStatsUpdate,
|
||||
pishStatsOutput,
|
||||
},
|
||||
{
|
||||
"IMAP4",
|
||||
Imap4ParseStart,
|
||||
Imap4ParseEnd,
|
||||
doImap4Start,
|
||||
doImap4Loop,
|
||||
doImap4End,
|
||||
pishStatsFormat,
|
||||
pishStatsInit,
|
||||
pishStatsUpdate,
|
||||
pishStatsOutput,
|
||||
},
|
||||
{
|
||||
"HTTP",
|
||||
HttpParseStart,
|
||||
HttpParseEnd,
|
||||
doHttpStart,
|
||||
doHttpLoop,
|
||||
doHttpEnd,
|
||||
HttpStatsFormat,
|
||||
HttpStatsInit,
|
||||
HttpStatsUpdate,
|
||||
HttpStatsOutput,
|
||||
},
|
||||
{
|
||||
"WMAP",
|
||||
WmapParseStart,
|
||||
WmapParseEnd,
|
||||
doWmapStart,
|
||||
doWmapLoop,
|
||||
doWmapEnd,
|
||||
WmapStatsFormat,
|
||||
WmapStatsInit,
|
||||
WmapStatsUpdate,
|
||||
WmapStatsOutput,
|
||||
},
|
||||
{
|
||||
NULL, /* terminate the list */
|
||||
},
|
||||
};
|
||||
|
||||
/* End of globals */
|
||||
|
||||
static time_t ramptime = 0;
|
||||
|
||||
static char mailmaster[MAXHOSTNAMELEN];
|
||||
static NETPORT listenport = 0;
|
||||
static char *commandsfilename = NULL;
|
||||
static int f_usestdin = 0;
|
||||
#if 0
|
||||
static struct hostent mailserv_phe, mailmast_phe;
|
||||
static struct protoent mailserv_ppe, mailmast_ppe;
|
||||
static unsigned long mailserv_addr, mailmast_addr;
|
||||
static short mailserv_type, mailmast_type; /* socket type */
|
||||
#endif
|
||||
|
||||
static void
|
||||
usage(const char *progname)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s [options] -n <clients> -t <time> <-s | -u <commandFile>>\n\n",
|
||||
progname);
|
||||
fprintf(stderr, " required parameters:\n");
|
||||
fprintf(stderr, " -n numprocs number of clients processes to run [1-%d]\n",
|
||||
MAXPROCSPERNODE);
|
||||
fprintf(stderr, " -t testtime test duration (mins) or #[hmsd]\n");
|
||||
fprintf(stderr, " -s use stdin for commands\n");
|
||||
fprintf(stderr, " -u commandlist file for commands\n\n");
|
||||
|
||||
fprintf(stderr, " options:\n");
|
||||
fprintf(stderr, " -h help - this message\n\n");
|
||||
fprintf(stderr, " -H name hostname for parsing HOSTS=\n");
|
||||
fprintf(stderr, " -A use abortive close\n");
|
||||
fprintf(stderr, " -T opsperhour client throttle\n");
|
||||
fprintf(stderr, " -f summpersec frequency to send summary results\n");
|
||||
fprintf(stderr, " -d debug\n");
|
||||
fprintf(stderr, " -D datestamp assign a datestamp\n");
|
||||
fprintf(stderr, " -N numthreads number of clients threads per process\n");
|
||||
fprintf(stderr, " -m maxErrorCnt threshold to force test abort\n");
|
||||
fprintf(stderr, " -M maxBlockCnt number of blocks to run\n");
|
||||
fprintf(stderr, " -R ramptime test rampup time (secs)\n");
|
||||
fprintf(stderr, " -v print version\n");
|
||||
fprintf(stderr, " -r record all transactions\n\n");
|
||||
exit(1);
|
||||
} /* END usage() */
|
||||
|
||||
void
|
||||
parseArgs(int argc, char **argv)
|
||||
{
|
||||
int getoptch;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
/*
|
||||
* PARSE THE COMMAND LINE OPTIONS
|
||||
*/
|
||||
|
||||
while((getoptch =
|
||||
getopt(argc,argv,"hf:H:T:t:u:c:m:M:n:N:R:D:Adrsv")) != EOF)
|
||||
{
|
||||
switch(getoptch)
|
||||
{
|
||||
case 'h':
|
||||
usage(argv[0]);
|
||||
break;
|
||||
case 'H': /* name for parsing */
|
||||
gs_parsename = mystrdup(optarg);
|
||||
break;
|
||||
case 'A':
|
||||
gf_abortive_close = 1;
|
||||
break;
|
||||
case 'T':
|
||||
/* client throttles to ops/hour */
|
||||
gn_client_throttle = atoi(optarg);
|
||||
break;
|
||||
case 'f':
|
||||
/* feedback frequency in seconds */
|
||||
gn_feedback_secs = atoi(optarg);
|
||||
break;
|
||||
case 'd':
|
||||
gn_debug = 1;
|
||||
break;
|
||||
case 'D':
|
||||
strcpy(gs_dateStamp, optarg);
|
||||
break;
|
||||
case 'm':
|
||||
gn_maxerrorcnt = atoi(optarg);
|
||||
break;
|
||||
case 'M':
|
||||
gn_maxBlockCnt = atoi(optarg);
|
||||
break;
|
||||
case 'n':
|
||||
gn_numprocs = atoi(optarg);
|
||||
break;
|
||||
case 'N':
|
||||
gn_numthreads = atoi(optarg);
|
||||
break;
|
||||
case 'u':
|
||||
commandsfilename = mystrdup(optarg);
|
||||
break;
|
||||
case 's':
|
||||
f_usestdin = 1;
|
||||
break;
|
||||
case 't':
|
||||
gt_testtime = time_atoi(optarg);
|
||||
break;
|
||||
case 'R':
|
||||
ramptime = time_atoi(optarg);
|
||||
break;
|
||||
case 'v':
|
||||
fprintf(stderr, "Netscape " MAILCLIENT_VERSION "\n");
|
||||
fprintf(stderr, "Copyright (c) Netscape Communications Corporation 1997, 1998, 1999\n");
|
||||
exit(1);
|
||||
break;
|
||||
case 'r':
|
||||
gn_record_telemetry = 1;
|
||||
break;
|
||||
default:
|
||||
usage(argv[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define SIZEOF_NTOABUF ((3+1)*4)
|
||||
|
||||
char *
|
||||
safe_inet_ntoa(struct in_addr ina, char *psz)
|
||||
{
|
||||
sprintf(psz,"%d.%d.%d.%d",
|
||||
((unsigned char *)&ina.s_addr)[0],
|
||||
((unsigned char *)&ina.s_addr)[1],
|
||||
((unsigned char *)&ina.s_addr)[2],
|
||||
((unsigned char *)&ina.s_addr)[3]);
|
||||
return psz;
|
||||
}
|
||||
|
||||
/* look up the host name and protocol
|
||||
* called from each protocol (via connectSocket)
|
||||
*/
|
||||
|
||||
int
|
||||
resolve_addrs(char *host,
|
||||
char *protocol,
|
||||
struct hostent *host_phe,
|
||||
struct protoent *proto_ppe,
|
||||
unsigned long *addr,
|
||||
short *type)
|
||||
{
|
||||
struct hostent *phe;
|
||||
struct protoent *ppe;
|
||||
#ifdef USE_PTHREADS
|
||||
#ifdef USE_GETHOSTBYNAME_R
|
||||
struct hostent he;
|
||||
struct protoent pe;
|
||||
char buf[512];
|
||||
int h_err;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* if IP address given, convert to internal form */
|
||||
if (host[0] >= '0' && host[0] <= '9') {
|
||||
*addr = inet_addr(host);
|
||||
if (*addr == INADDR_NONE)
|
||||
return(returnerr(stderr,"Invalid IP address %s\n", host));
|
||||
|
||||
} else {
|
||||
/* look up by name */
|
||||
#ifdef USE_GETHOSTBYNAME_R
|
||||
phe = gethostbyname_r(host, &he, buf, sizeof(buf), &h_err);
|
||||
errno = h_err;
|
||||
#else
|
||||
phe = gethostbyname(host);
|
||||
#endif
|
||||
|
||||
if (phe == NULL)
|
||||
{
|
||||
D_PRINTF(stderr, "Gethostbyname failed: %s", neterrstr() );
|
||||
return(returnerr(stderr,"Can't get %s host entry\n", host));
|
||||
}
|
||||
memcpy(host_phe, phe, sizeof(struct hostent));
|
||||
memcpy((char *)addr, phe->h_addr, sizeof(*addr));
|
||||
}
|
||||
|
||||
/* Map protocol name to protocol number */
|
||||
#ifdef USE_GETPROTOBYNAME_R
|
||||
ppe = getprotobyname_r(protocol, &pe, buf, sizeof(buf));
|
||||
#else
|
||||
ppe = getprotobyname(protocol);
|
||||
#endif
|
||||
|
||||
if (ppe == 0)
|
||||
{
|
||||
D_PRINTF(stderr, "protobyname returned %d\n", ppe );
|
||||
return(returnerr(stderr,"Can't get %s protocol entry\n",protocol));
|
||||
}
|
||||
memcpy(proto_ppe, ppe, sizeof(struct protoent));
|
||||
|
||||
/* D_PRINTF(stderr, "Protocol number %d\n", ppe->p_proto ); */
|
||||
|
||||
/* Use protocol to choose a socket type */
|
||||
if (strcmp(protocol,"udp") == 0)
|
||||
{
|
||||
*type = SOCK_DGRAM;
|
||||
}
|
||||
else
|
||||
{
|
||||
*type = SOCK_STREAM;
|
||||
/* D_PRINTF(stderr, "Choosing SOCK_STREAM %d type %d %s\n",
|
||||
SOCK_STREAM, *type, neterrstr() ); */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* connect to a socket given the hostname and protocol */
|
||||
SOCKET
|
||||
connectSocket(ptcx_t ptcx,
|
||||
resolved_addr_t *hostInfo,
|
||||
char *protocol)
|
||||
{
|
||||
struct sockaddr_in sin; /* an Internet endpoint address */
|
||||
SOCKET s; /* socket descriptor */
|
||||
int type; /* socket type */
|
||||
short proto;
|
||||
int returnval; /* temporary return value */
|
||||
char ntoa_buf[SIZEOF_NTOABUF];
|
||||
|
||||
D_PRINTF(debugfile, "Beginning connectSocket; host=%s port=%d proto=%s\n",
|
||||
hostInfo->hostName, hostInfo->portNum, protocol );
|
||||
|
||||
sin.sin_family = AF_INET;
|
||||
memset((char *)&sin, 0, sizeof(sin));
|
||||
D_PRINTF(debugfile, "Zeroed address structure\n" );
|
||||
|
||||
sin.sin_port = htons(hostInfo->portNum);
|
||||
D_PRINTF(debugfile, "Set port number %d\n", hostInfo->portNum);
|
||||
|
||||
/* check if we've resolved this already */
|
||||
if ((hostInfo) && (hostInfo->resolved)) {
|
||||
sin.sin_addr.S_ADDR = hostInfo->host_addr;
|
||||
sin.sin_family = PF_INET;
|
||||
proto = hostInfo->host_ppe.p_proto;
|
||||
type = hostInfo->host_type;
|
||||
} else {
|
||||
struct hostent host_phe;
|
||||
struct protoent host_ppe;
|
||||
unsigned long host_addr;
|
||||
short host_type; /* socket type */
|
||||
|
||||
if (resolve_addrs(hostInfo->hostName, "tcp",
|
||||
&host_phe, &host_ppe, &host_addr, &host_type)) {
|
||||
return returnerr(debugfile,"Can't resolve hostname %s in get()\n",
|
||||
hostInfo->hostName);
|
||||
}
|
||||
sin.sin_addr.S_ADDR = host_addr;
|
||||
sin.sin_family = PF_INET;
|
||||
proto = host_ppe.p_proto;
|
||||
type = host_type;
|
||||
}
|
||||
|
||||
/* Allocate a socket */
|
||||
s = socket(PF_INET, type, proto);
|
||||
|
||||
if (BADSOCKET(s))
|
||||
{
|
||||
D_PRINTF(debugfile, "Can't create socket: %s\n",neterrstr() );
|
||||
return BADSOCKET_VALUE;
|
||||
}
|
||||
|
||||
/* Connect the socket */
|
||||
D_PRINTF(debugfile, "Trying to connect %d with size %d\n",
|
||||
s, sizeof(sin));
|
||||
D_PRINTF(debugfile, "Address is family %d, port %d, addr %s\n",
|
||||
sin.sin_family, ntohs(sin.sin_port),
|
||||
safe_inet_ntoa(sin.sin_addr, ntoa_buf) );
|
||||
|
||||
returnval = connect(s, (struct sockaddr *)&sin, sizeof(sin));
|
||||
|
||||
if (returnval < 0) {
|
||||
int err = GET_ERROR; /* preserve the error code */
|
||||
|
||||
D_PRINTF(debugfile, "Can't connect: %s\n", neterrstr() );
|
||||
NETCLOSE(s);
|
||||
|
||||
SET_ERROR(err);
|
||||
return BADSOCKET_VALUE;
|
||||
}
|
||||
|
||||
/* all done, returning socket descriptor */
|
||||
D_PRINTF(debugfile, "Returning %d from connectSocket call\n", s );
|
||||
return(s);
|
||||
|
||||
} /* END connectSocket() */
|
||||
|
||||
int
|
||||
set_abortive_close(SOCKET sock)
|
||||
{
|
||||
struct linger linger_opt;
|
||||
|
||||
linger_opt.l_onoff = 1;
|
||||
linger_opt.l_linger = 0;
|
||||
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_LINGER,
|
||||
(char *) &linger_opt, sizeof(linger_opt)) < 0) {
|
||||
returnerr(stderr, "Couldn't set SO_LINGER = 0\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
initializeCommands(char *cfilename)
|
||||
{
|
||||
char *cbuf = NULL;
|
||||
int cbuflen = 0;
|
||||
int cbufalloced = 0;
|
||||
int ret;
|
||||
FILE *cfile;
|
||||
|
||||
D_PRINTF(stderr, "initializeCommands(%s)\n",
|
||||
cfilename ? cfilename : "STDIN");
|
||||
|
||||
if (cfilename == NULL || strlen(cfilename) == 0) {
|
||||
cfile = stdin;
|
||||
cfilename = "stdin";
|
||||
} else {
|
||||
if ((cfile = fopen(cfilename, "r")) == NULL) {
|
||||
D_PRINTF(stderr, "Cannot open commands file %s: errno=%d: %s\n",
|
||||
cfilename, errno, strerror(errno));
|
||||
errexit(stderr, "Cannot open commands file %s: errno=%d: %s\n",
|
||||
cfilename, errno, strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
#define CMDBUF_INCR 4096 /* longest allowed line */
|
||||
|
||||
while (!feof(cfile)) { /* read file in to char array */
|
||||
if ((cbuflen + CMDBUF_INCR + 1) > cbufalloced) { /* grow array */
|
||||
cbufalloced += CMDBUF_INCR;
|
||||
cbuf = (char *)myrealloc(cbuf, cbufalloced+1);
|
||||
cbuf[cbuflen] = '\0';
|
||||
}
|
||||
ret = fread(cbuf+cbuflen, 1, CMDBUF_INCR, cfile);
|
||||
if (ret < 0) {
|
||||
D_PRINTF(stderr, "Error reading commands file %s: errno=%d: %s\n",
|
||||
cfilename, errno, strerror(errno));
|
||||
errexit(stderr, "Error reading commands file %s: errno=%d: %s\n",
|
||||
cfilename, errno, strerror(errno));
|
||||
}
|
||||
if (ret == 0)
|
||||
break;
|
||||
cbuflen += ret;
|
||||
cbuf[cbuflen] = '\0';
|
||||
}
|
||||
|
||||
if (cfile != stdin)
|
||||
fclose(cfile);
|
||||
|
||||
/* D_PRINTF(stderr, "Got commands len=%d:\n%s\n", cbuflen, cbuf); */
|
||||
|
||||
/* Read commands into structure, make sure we have all req arguments */
|
||||
if ((gn_total_weight = load_commands(cbuf)) < 0) {
|
||||
D_PRINTF(stderr, "could not load %s\n", cfilename);
|
||||
errexit(stderr, "Could not load command file\n");
|
||||
}
|
||||
if (0 == gn_total_weight) {
|
||||
D_PRINTF(stderr, "No commands found for this host in %s\n", cfilename);
|
||||
errexit(stderr, "No command for current host in command file\n");
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
readwriteStream(int ii, int fdin, int fdout)
|
||||
{
|
||||
char buf[MAX (8192, 2*SIZEOF_SUMMARYTEXT+1)], *cp;
|
||||
int res;
|
||||
int toread = sizeof(buf)-1;
|
||||
int towrite;
|
||||
|
||||
D_PRINTF(stderr, "readwriteStream(%d,%d,%d)\n", ii, fdin, fdout);
|
||||
|
||||
/* structured as a while() for future nonblocking style */
|
||||
while (toread) {
|
||||
errno = 0;
|
||||
res = NETREAD(fdin, buf, sizeof(buf)-1);
|
||||
D_PRINTF(stderr, "read %d bytes from client %d\n", res, ii);
|
||||
if (res == 0) {
|
||||
return -1; /* EOF unless O_NDELAY */
|
||||
} else if (res < 0) {
|
||||
if (errno == EINTR || errno == EINTR) {
|
||||
return 0; /* go back to the poll loop to service others */
|
||||
}
|
||||
|
||||
fprintf(stderr, "readwriteStream(%d,%d,%d) error reading: errno=%d: %s\n",
|
||||
ii, fdin, fdout, errno, strerror(errno));
|
||||
return -1;
|
||||
} else {
|
||||
/* TODO: ...can do more data reduction here... */
|
||||
|
||||
toread -= res;
|
||||
|
||||
cp = buf;
|
||||
towrite = res;
|
||||
buf[towrite] = '\0';
|
||||
/*D_PRINTF(stderr, "writing %d bytes to %d [%s]\n", towrite, fdout, buf);*/
|
||||
D_PRINTF(stderr, "writing %d bytes to %d\n", towrite, fdout);
|
||||
while (towrite) {
|
||||
res = write(fdout, cp, towrite);
|
||||
D_PRINTF(stderr, "wrote %d bytes to %d\n", res, fdout);
|
||||
if (res <= 0) {
|
||||
D_PRINTF(stderr, "error writing to %d: errno=%d: %s\n", fdout, errno, strerror(errno));
|
||||
} else {
|
||||
towrite -= res;
|
||||
cp += res;
|
||||
}
|
||||
}
|
||||
}
|
||||
toread = 0; /* just read one chunk at a time for now... */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
#define DIRECT_OUT /* report directly to stdout */
|
||||
|
||||
int
|
||||
readwriteChildren(pccx_t pccxs)
|
||||
{
|
||||
while (readwriteStream(0, pccxs[0].socket, 1) >= 0)
|
||||
;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else /* !_WIN32 */
|
||||
|
||||
/* This is where the master process merges output and waits for
|
||||
the spawned processes to exit.
|
||||
Note that no alarm has been set. We never wait very long in poll.
|
||||
*/
|
||||
int
|
||||
readwriteChildren(pccx_t pccxs)
|
||||
{
|
||||
struct pollfd *pfds;
|
||||
int nfds;
|
||||
int ii;
|
||||
|
||||
/*
|
||||
* Wait for all children to exit.
|
||||
*/
|
||||
nfds=0;
|
||||
pfds = (struct pollfd *)mycalloc(sizeof(struct pollfd)*gn_numprocs);
|
||||
for (ii=0; ii < gn_numprocs; ++ii) {
|
||||
if (pccxs[ii].socket != -1) {
|
||||
pfds[nfds].fd = pccxs[ii].socket;
|
||||
++nfds;
|
||||
}
|
||||
}
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
while (nfds > 0) {
|
||||
int ret, closethisfd;
|
||||
if (time(0L) >= gt_aborttime) {
|
||||
D_PRINTF (stderr, "Time is up. Signalling exit %d\n",
|
||||
gf_timeexpired);
|
||||
gf_timeexpired = EXIT_FASTEST; /* signal clean up and exit */
|
||||
break; /* just get out of here */
|
||||
}
|
||||
for (ii=0; ii < nfds; ++ii) {
|
||||
pfds[ii].events = POLLIN;
|
||||
pfds[ii].revents = 0;
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "entering poll(nfds=%d)\n", nfds);
|
||||
ret = poll(pfds, nfds, 5*1000);
|
||||
D_PRINTF(stderr, "back from poll, ret=%d\n", ret);
|
||||
|
||||
if (ret == 0)
|
||||
continue;
|
||||
|
||||
if (ret < 0) {
|
||||
if (errno == EAGAIN || errno == EINTR)
|
||||
continue;
|
||||
|
||||
fprintf(stderr, "poll error: errno=%d: %s\n", errno, strerror(errno));
|
||||
break;
|
||||
}
|
||||
|
||||
for (ii = 0; ii < nfds; ++ii) {
|
||||
closethisfd = 0;
|
||||
|
||||
if (pfds[ii].revents) {
|
||||
D_PRINTF(stderr, "poll says stdout fd=%d for client=%d is 0x%02x\n",
|
||||
pfds[ii].fd, ii, pfds[ii].revents);
|
||||
}
|
||||
|
||||
if (pfds[ii].revents & POLLIN) {
|
||||
if (readwriteStream(ii, pfds[ii].fd, 1) == -1) {
|
||||
closethisfd = 1;
|
||||
}
|
||||
} else if (pfds[ii].revents & (POLLHUP | POLLERR | POLLNVAL)) {
|
||||
if (pfds[ii].revents & POLLHUP)
|
||||
D_PRINTF(stderr, "POLLHUP for stdout fd=%d for client=%d!\n",
|
||||
pfds[ii].fd, ii);
|
||||
closethisfd = 1;
|
||||
}
|
||||
|
||||
if (closethisfd) {
|
||||
D_PRINTF(stderr, "closing for slot=%d fd=%d nfds=%d\n",
|
||||
ii, pfds[ii].fd, nfds);
|
||||
NETCLOSE(pfds[ii].fd);
|
||||
|
||||
--nfds; /* shrink poll array */
|
||||
/* NOTE: this re-orders the array */
|
||||
if (ii != nfds) { /* move last one into old spot */
|
||||
pfds[ii].fd = pfds[nfds].fd;
|
||||
pfds[ii].events = pfds[nfds].events;
|
||||
pfds[ii].revents = pfds[nfds].revents;
|
||||
--ii; /* check moved entry on the next loop */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (nfds > 0) {
|
||||
d_printf (stderr,
|
||||
"WARNING: Exiting with open clients nfds=%d time=%lu shutdowntime=%lu\n",
|
||||
nfds, time(0L), gt_shutdowntime);
|
||||
for (ii = 0; ii < nfds; ++ii) { /* close socket to make clients die */
|
||||
D_PRINTF(stderr, "closing for slot=%d fd=%d\n", ii, pfds[ii].fd);
|
||||
NETCLOSE(pfds[ii].fd);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/* This is where each sub process starts */
|
||||
THREAD_RET
|
||||
launchChild(void *targ)
|
||||
{
|
||||
SOCKET clientsock;
|
||||
struct sockaddr_in saddr; /* server address */
|
||||
struct linger linger_opt;
|
||||
unsigned int testtimeleft;
|
||||
int ret;
|
||||
unsigned int thread_stagger_usec = 1000; /* 1000/sec */
|
||||
int pnum = (int)targ;
|
||||
|
||||
gn_myPID = getpid();
|
||||
if (ramptime) {
|
||||
/* comvert to microseconds */
|
||||
if (gn_numthreads > 0) {
|
||||
/* force intermediate result to double to avoid overflow */
|
||||
thread_stagger_usec = (unsigned int)((ramptime * (double)USECINSEC) / gn_numthreads);
|
||||
} else {
|
||||
thread_stagger_usec = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ((clientsock=socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
||||
errexit(stderr, "child socket(): %s\n", neterrstr());
|
||||
}
|
||||
|
||||
memset(&saddr, 0, sizeof(saddr));
|
||||
saddr.sin_addr.S_ADDR = inet_addr("127.0.0.1");
|
||||
saddr.sin_family = AF_INET;
|
||||
saddr.sin_port = listenport;
|
||||
|
||||
if (connect(clientsock, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) {
|
||||
NETCLOSE(clientsock);
|
||||
errexit(stderr, "child connect(): %s\n", neterrstr());
|
||||
}
|
||||
#if 1
|
||||
linger_opt.l_onoff = 1;
|
||||
linger_opt.l_linger = 60;
|
||||
|
||||
if (setsockopt(clientsock, SOL_SOCKET, SO_LINGER, (char *) &linger_opt, sizeof(linger_opt)) < 0) {
|
||||
NETCLOSE(clientsock);
|
||||
errexit(stderr, "child setsockopt(): %s\n", neterrstr());
|
||||
}
|
||||
#endif
|
||||
D_PRINTF(stderr, "child %d: using socket %d\n", pnum, clientsock);
|
||||
|
||||
|
||||
#if 0
|
||||
unsigned int fork_stagger_usec = 10000; /* 100/sec */
|
||||
if (pnum) {
|
||||
D_PRINTF(stderr, "child %d: delaying %d secs\n",
|
||||
pnum, USECS_2_SECS(pnum * fork_stagger_usec));
|
||||
MS_usleep(pnum * fork_stagger_usec);
|
||||
}
|
||||
#endif
|
||||
|
||||
testtimeleft = gt_shutdowntime - time(0L);
|
||||
|
||||
D_PRINTF(stderr, "child %d: proceeding for %d remaining seconds\n",
|
||||
pnum, testtimeleft);
|
||||
|
||||
if (testtimeleft > 0) {
|
||||
/* This is where the test gets run */
|
||||
#ifndef DIRECT_OUT
|
||||
ret = clientProc(pnum, clientsock,
|
||||
testtimeleft, thread_stagger_usec);
|
||||
#else
|
||||
ret = clientProc(pnum, fileno(stdout),
|
||||
testtimeleft, thread_stagger_usec);
|
||||
#endif
|
||||
} else {
|
||||
D_PRINTF(stderr, "child %d: Too late to start! shudowntime=%lu now=%lu\n",
|
||||
pnum, testtimeleft, time(0L));
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "child %d: closing logging socket\n", pnum);
|
||||
NETCLOSE(clientsock);
|
||||
|
||||
#ifndef _WIN32
|
||||
return((void *)ret);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Wait for childred to exit (after readwritechildren returns).
|
||||
*/
|
||||
int
|
||||
waitChildren(void)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
int pid;
|
||||
int status;
|
||||
|
||||
for (;;) {
|
||||
errno = 0;
|
||||
alarm(gt_stopinterval); /* dont wait forever */
|
||||
pid = wait(&status);
|
||||
if (pid == -1) {
|
||||
if (errno == ECHILD) {
|
||||
break; /* none left. finished */
|
||||
}
|
||||
if (errno == EINTR) { /* alarm went off */
|
||||
if (time(0L) > (gt_aborttime+(EXIT_FAST*gt_stopinterval))) {
|
||||
d_printf (stderr,
|
||||
"WARNING: Aborting wait for children!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (WIFSIGNALED (status)) { /* show error exits */
|
||||
d_printf (stderr, "Client pid %d died with signal %d\n",
|
||||
pid, WTERMSIG(status));
|
||||
} else {
|
||||
D_PRINTF(stderr, "Client pid %d: status: %d errno=%d: %s\n",
|
||||
pid, status, errno, strerror(errno));
|
||||
}
|
||||
}
|
||||
#endif /* !_WIN32 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int ii;
|
||||
struct tm *tmptm;
|
||||
time_t currentTime;
|
||||
#ifdef _WIN32
|
||||
int err;
|
||||
WSADATA WSAData;
|
||||
#endif
|
||||
int ret;
|
||||
int pid=0;
|
||||
pccx_t pccxs; /* client process contexts */
|
||||
SOCKET serversock;
|
||||
struct sockaddr_in saddr; /* server address */
|
||||
struct sockaddr_in caddr; /* client address */
|
||||
int addr_len;
|
||||
char ntoabuf[SIZEOF_NTOABUF];
|
||||
|
||||
#ifdef _WIN32
|
||||
//MessageBeep(~0U); /* announce our existence */
|
||||
|
||||
err = WSAStartup(MAKEWORD(1,1), &WSAData);
|
||||
if (err != 0) {
|
||||
errexit(stderr, "Error in WSAStartup()\n");
|
||||
}
|
||||
|
||||
atexit(sock_cleanup);
|
||||
|
||||
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
|
||||
#endif /* _WIN32 */
|
||||
|
||||
gn_myPID = getpid();
|
||||
gethostname(gs_thishostname, sizeof(gs_thishostname)-1);
|
||||
|
||||
memset(mailmaster, 0, sizeof(mailmaster));
|
||||
memset(gs_dateStamp, 0, DATESTAMP_LEN*sizeof(char));
|
||||
|
||||
parseArgs(argc, argv);
|
||||
|
||||
returnerr(stderr, MAILCLIENT_VERSION "\n");
|
||||
returnerr(stderr, "procs=%d threads=%d seconds=%d ramptime=%d...\n",
|
||||
gn_numprocs, gn_numthreads , gt_testtime, ramptime);
|
||||
if (ramptime > gt_testtime) {
|
||||
returnerr (stderr, "RampTime %d longer than TestTime %d. Adjusting.\n",
|
||||
ramptime, gt_testtime);
|
||||
ramptime = gt_testtime;
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "Running in debug mode\n\n" );
|
||||
|
||||
/* print the command line */
|
||||
if (gn_debug) {
|
||||
for (ii = 0; ii < argc; ii++)
|
||||
fprintf(stderr, "%s ", argv[ii] );
|
||||
fprintf(stderr, "\n\n" );
|
||||
}
|
||||
|
||||
if (commandsfilename == NULL && f_usestdin == 0) {
|
||||
/* Must specify a message list */
|
||||
returnerr(stderr, "No mail message list specified (use <-s | -u commandsfilename>)\n");
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (gt_testtime == 0) { /* NO TEST TIME */
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (gn_numprocs > MAXPROCSPERNODE || gn_numprocs < 1) {
|
||||
returnerr(stderr, "Number of clients must be between 1 and %d\n", MAXPROCSPERNODE);
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
crank_limits();
|
||||
|
||||
if (!gs_dateStamp[0]) {
|
||||
time(¤tTime);
|
||||
tmptm = localtime(¤tTime);
|
||||
strftime(gs_dateStamp, DATESTAMP_LEN, "%Y%m%d%H%M%S", tmptm);
|
||||
}
|
||||
|
||||
initializeCommands(commandsfilename); /* read command block */
|
||||
|
||||
gt_startedtime = time(0L);
|
||||
gt_shutdowntime = gt_startedtime + gt_testtime; /* start clean shutdown */
|
||||
gt_stopinterval = MAX ((ramptime/EXIT_FASTEST), 1); /* signal period */
|
||||
/* this is when the master gives up on the children */
|
||||
gt_aborttime = gt_shutdowntime + gt_stopinterval*2*EXIT_FASTEST;
|
||||
|
||||
|
||||
if ((pccxs = (pccx_t)mycalloc(sizeof(ccx_t) * gn_numprocs)) == NULL) {
|
||||
errexit(stderr, "error mycalloc() pccxs\n");
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "preparing serversock\n");
|
||||
|
||||
if ((serversock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
||||
errexit(stderr, "socket() error: %s\n", neterrstr());
|
||||
}
|
||||
|
||||
memset(&saddr, 0, sizeof(saddr));
|
||||
/*saddr.sin_addr.S_ADDR = htonl(INADDR_ANY);*/
|
||||
saddr.sin_addr.S_ADDR = inet_addr("127.0.0.1");
|
||||
saddr.sin_family = AF_INET;
|
||||
saddr.sin_port = 0;
|
||||
|
||||
if (bind(serversock, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) {
|
||||
NETCLOSE(serversock);
|
||||
errexit(stderr, "bind() error: %s\n", neterrstr());
|
||||
}
|
||||
|
||||
if (listen(serversock, 512) == -1) {
|
||||
NETCLOSE(serversock);
|
||||
errexit(stderr, "listen() error: %s\n", neterrstr());
|
||||
}
|
||||
|
||||
addr_len = sizeof(saddr);
|
||||
if (getsockname(serversock, (struct sockaddr *)&saddr, &addr_len) == -1) {
|
||||
NETCLOSE(serversock);
|
||||
errexit(stderr, "getsockname() error: %s\n", neterrstr());
|
||||
}
|
||||
|
||||
listenport = saddr.sin_port;
|
||||
|
||||
D_PRINTF(stderr, "listening on [%s:%d]\n",
|
||||
safe_inet_ntoa(saddr.sin_addr, ntoabuf), ntohs(listenport));
|
||||
|
||||
setup_signal_handlers (); /* trap signals */
|
||||
|
||||
for(ii = 0; ii < gn_numprocs; ++ii) {
|
||||
D_PRINTF(stderr, "parent: forking client %d\n", ii);
|
||||
|
||||
#ifdef _WIN32
|
||||
if (_beginthread(launchChild, NT_STACKSIZE, (void *)ii) == -1) {
|
||||
errexit(stderr, "_beginthread failed: %d", GetLastError());
|
||||
}
|
||||
#else
|
||||
#ifdef DIRECT_OUT /* for Unix, only if debugging */
|
||||
if (1 == gn_numprocs) {
|
||||
fprintf (stderr, "Single process, NOT forking.\n");
|
||||
launchChild (0); /* DEBUG */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
switch(pid=fork()) {
|
||||
case 0: /* CHILD */
|
||||
launchChild((void *)ii);
|
||||
exit(ii);
|
||||
break;
|
||||
case -1: /* ERROR */
|
||||
fprintf(stderr, "parent: error forking child %d, errno=%d: %s\n", ii, errno, strerror(errno));
|
||||
errexit(stderr, "Error forking child processes\n");
|
||||
exit(1);
|
||||
default: /* PARENT */
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
pccxs[ii].pid = pid;
|
||||
|
||||
D_PRINTF(stderr, "parent: Accepting child %d pid=%d\n", ii, pid);
|
||||
/* Maybe fork everything before accepting */
|
||||
addr_len = sizeof(caddr);
|
||||
/* If the the child dies immediately, we hang here */
|
||||
if ((ret = accept(serversock, (struct sockaddr *)&caddr, &addr_len)) == -1) {
|
||||
errexit(stderr, "accept() error: %s\n", neterrstr());
|
||||
}
|
||||
D_PRINTF(stderr, "parent: child %d using socket %d\n", ii, ret);
|
||||
pccxs[ii].socket = ret;
|
||||
}
|
||||
|
||||
readwriteChildren(pccxs);
|
||||
|
||||
D_PRINTF(stderr, "done polling, now just wait\n");
|
||||
|
||||
waitChildren();
|
||||
|
||||
returnerr(stderr, "Master process done.\n");
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
return 0;
|
||||
} /* end main() */
|
||||
|
||||
@@ -1,633 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/*
|
||||
* parse the workload description file
|
||||
*
|
||||
*/
|
||||
|
||||
#include "bench.h"
|
||||
|
||||
/* global variables */
|
||||
param_list_t *g_default_params; /* list of default values */
|
||||
|
||||
|
||||
/* Find a protocol in the global protocol list */
|
||||
protocol_t *
|
||||
protocol_get (char *name)
|
||||
{
|
||||
protocol_t *pp;
|
||||
|
||||
for (pp=g_protocols; pp->name != NULL; ++pp) {
|
||||
/* we only check the length of the registered protocol name */
|
||||
/* that way NAME can have additonal stuff after it */
|
||||
/* This is much better than the old single letter checking */
|
||||
if (0 == strnicmp (name, pp->name, strlen (pp->name)))
|
||||
return pp;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
converts a string of the form #x to seconds
|
||||
where x can be a unit specifier of
|
||||
d or D days
|
||||
h or H hours
|
||||
m or M minutes
|
||||
s or S seconds
|
||||
the default is seconds
|
||||
*/
|
||||
int
|
||||
time_atoi(const char *pstr)
|
||||
{
|
||||
int ret=0;
|
||||
int len = strlen(pstr);
|
||||
|
||||
if (!pstr[0]) return 0;
|
||||
switch (pstr[len-1]) {
|
||||
case 'd': /* days */
|
||||
case 'D':
|
||||
ret = 24 * 60 * 60 * atoi(pstr);
|
||||
break;
|
||||
case 'h': /* hours */
|
||||
case 'H':
|
||||
ret = 60 * 60 * atoi(pstr);
|
||||
break;
|
||||
case 'm': /* minutes */
|
||||
case 'M':
|
||||
ret = 60 * atoi(pstr);
|
||||
break;
|
||||
case 's': /* seconds */
|
||||
case 'S':
|
||||
default:
|
||||
ret = atoi(pstr);
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
Simple keyword indexed string storage
|
||||
This kind of thing has been invented many times. Once more with gusto!
|
||||
*/
|
||||
param_list_t *
|
||||
paramListInit (void)
|
||||
{
|
||||
param_list_t *np = (param_list_t *)mycalloc (sizeof (param_list_t));
|
||||
return np;
|
||||
}
|
||||
|
||||
/* paramListAdd returns: 1 update existing value, 0 new, -1 out of memory */
|
||||
int
|
||||
paramListAdd (param_list_t *list,
|
||||
const char *name,
|
||||
const char *value)
|
||||
{
|
||||
param_list_t *pl;
|
||||
int found = 0;
|
||||
assert (list != NULL);
|
||||
assert (name != NULL);
|
||||
assert (value != NULL);
|
||||
|
||||
if (NULL == list->name) { /* first one special case */
|
||||
list->name = mystrdup (name);
|
||||
if (NULL == list->name) return -1; /* out of memory */
|
||||
list->value = mystrdup (value);
|
||||
if (NULL == list->value) return -1; /* out of memory */
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (pl = list; pl->next; pl = pl->next) {
|
||||
if (0 == strcmp (pl->name, name)) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
free (pl->value);
|
||||
pl->value = mystrdup (value);
|
||||
if (NULL == pl->value) return -1; /* out of memory */
|
||||
return 1;
|
||||
} else {
|
||||
param_list_t *np = (param_list_t *)mycalloc (sizeof (param_list_t));
|
||||
if (NULL == np) return -1; /* out of memory */
|
||||
np->name = mystrdup (name);
|
||||
if (NULL == np->name) return -1; /* out of memory */
|
||||
np->value = mystrdup (value);
|
||||
if (NULL == np->value) return -1; /* out of memory */
|
||||
pl->next = np;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* paramListGet returns value or NULL */
|
||||
char *
|
||||
paramListGet (param_list_t *list,
|
||||
const char *name)
|
||||
{
|
||||
param_list_t *pl;
|
||||
assert (list != NULL);
|
||||
assert (name != NULL);
|
||||
|
||||
for (pl = list; pl->next; pl = pl->next) {
|
||||
if (0 == strcmp (pl->name, name)) {
|
||||
return pl->value;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
Simple keyword indexed string storage
|
||||
This kind of thing has been invented many times. Once more with gusto!
|
||||
*/
|
||||
string_list_t *
|
||||
stringListInit (const char *value)
|
||||
{
|
||||
string_list_t *np = (string_list_t *)mycalloc (sizeof (string_list_t));
|
||||
if (value)
|
||||
np->value = mystrdup (value); /* This can be NULL */
|
||||
return np;
|
||||
}
|
||||
|
||||
void
|
||||
stringListFree (string_list_t *list)
|
||||
{
|
||||
string_list_t *pl, *next;
|
||||
assert (list != NULL);
|
||||
|
||||
for (pl = list; pl; pl = next) {
|
||||
next = pl->next;
|
||||
if (pl->value)
|
||||
free (pl->value);
|
||||
free (pl);
|
||||
}
|
||||
}
|
||||
|
||||
/* stringListAdd returns: 0 new, -1 out of memory */
|
||||
int
|
||||
stringListAdd (string_list_t *list,
|
||||
const char *value)
|
||||
{
|
||||
string_list_t *pl;
|
||||
string_list_t *np;
|
||||
assert (list != NULL);
|
||||
assert (value != NULL);
|
||||
|
||||
if (NULL == list->value) { /* first one special case */
|
||||
list->value = mystrdup (value);
|
||||
if (NULL == list->value) return -1; /* out of memory */
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (pl = list; pl->next; pl = pl->next)
|
||||
; /* skip to end */
|
||||
np = (string_list_t *)mycalloc (sizeof (string_list_t));
|
||||
if (NULL == np)
|
||||
return -1; /* out of memory */
|
||||
np->value = mystrdup (value);
|
||||
if (NULL == np->value)
|
||||
return -1; /* out of memory */
|
||||
pl->next = np;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* return non 0 if whitespace */
|
||||
#define IS_WHITE(c) ((' ' == (c)) || '\t' == (c))
|
||||
#define IS_TERM(c) (('\r' == (c)) || '\n' == (c))
|
||||
#define IS_NUM(c) (('0' <= (c)) && ('9' >= (c)))
|
||||
|
||||
/*
|
||||
Get a 'line' from a text buffer (terminated by CR-NL or NL)
|
||||
Handle comments.
|
||||
Skip empty lines.
|
||||
Handle continued lines (backslash as last character)
|
||||
|
||||
Return the pointer to the next line (or NULL at end)
|
||||
*/
|
||||
char *
|
||||
get_line_from_buffer (char *buffer, /* buffer to sort through */
|
||||
char *line, /* line buffer to fill in */
|
||||
int *lineCount, /* count of lines */
|
||||
int continuation) /* part of previous line */
|
||||
{
|
||||
char *end, *start;
|
||||
char *next;
|
||||
int len;
|
||||
|
||||
assert (buffer != NULL);
|
||||
assert (line != NULL);
|
||||
|
||||
next = strchr (buffer, '\n');
|
||||
if (next) {
|
||||
++next; /* start point for next line */
|
||||
} else if (strlen (buffer) > 0) {
|
||||
d_printf (stderr, "Last line missing NEWLINE\n");
|
||||
} else { /* done with buffer */
|
||||
*line = 0;
|
||||
return NULL;
|
||||
}
|
||||
if (lineCount) ++(*lineCount); /* increment line count */
|
||||
|
||||
if (continuation) {
|
||||
/* continuation lines keep everything */
|
||||
start = buffer;
|
||||
end = next-1;
|
||||
} else {
|
||||
/* find usefull text */
|
||||
len = strcspn (buffer, "#\r\n");
|
||||
if (!len) { /* empty line, go to next */
|
||||
return get_line_from_buffer (next, line, lineCount, continuation);
|
||||
}
|
||||
/* skip trailing white too */
|
||||
for (end = buffer + len; end > buffer; --end) {
|
||||
if (!IS_WHITE (end[-1])) break;
|
||||
}
|
||||
if (end == buffer) { /* blank line */
|
||||
return get_line_from_buffer (next, line, lineCount, continuation);
|
||||
}
|
||||
|
||||
/* find leading whitespace */
|
||||
start = buffer + strspn (buffer, " \t");
|
||||
}
|
||||
|
||||
assert (end > start); /* we should have found blank above */
|
||||
|
||||
strncpy(line, start, end - start); /* get a line */
|
||||
line[end-start] = '\0';
|
||||
|
||||
if (line[end-start-1] == '\\') { /* continuation line */
|
||||
return get_line_from_buffer (next, &line[end-start-1], lineCount, 1);
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "clean line [%s]\n", line);
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
/*
|
||||
return 1 if for us, 0 if everyone, -1 if not for us
|
||||
*/
|
||||
int
|
||||
check_hostname_attribute (const char *line)
|
||||
{
|
||||
char *hostp;
|
||||
/* Section open, check if for us */
|
||||
if ((hostp = strstr(line, "hosts="))
|
||||
|| (hostp = strstr(line, "HOSTS="))) {
|
||||
hostp = strchr (hostp, '='); /* skip to the equals */
|
||||
assert (hostp != NULL);
|
||||
|
||||
/* look for our hostname */
|
||||
if (strstr(hostp, gs_parsename) != NULL) {
|
||||
/* should check for complete string match */
|
||||
return 1;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* not host specific */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Protocol independent parsing
|
||||
*/
|
||||
int
|
||||
cmdParseNameValue (pmail_command_t cmd,
|
||||
char *name,
|
||||
char *tok)
|
||||
{
|
||||
if (strcmp(name, "numloops") == 0)
|
||||
cmd->numLoops = atoi(tok);
|
||||
else if (strcmp(name, "throttle") == 0)
|
||||
cmd->throttle = atoi(tok);
|
||||
else if (strcmp(name, "weight") == 0)
|
||||
cmd->weight = atoi(tok);
|
||||
else if (strcmp(name, "idletime") == 0)
|
||||
cmd->idleTime = time_atoi(tok);
|
||||
else if (strcmp(name, "blockid") == 0)
|
||||
cmd->blockID = time_atoi(tok);
|
||||
else if (strcmp(name, "blocktime") == 0)
|
||||
cmd->blockTime = time_atoi(tok);
|
||||
else if (strcmp(name, "loopdelay") == 0)
|
||||
cmd->loopDelay = time_atoi(tok);
|
||||
else if (strcmp(name, "checkmailinterval") == 0) /* BACK COMPAT */
|
||||
cmd->loopDelay = time_atoi(tok);
|
||||
else
|
||||
return 0; /* no match */
|
||||
|
||||
return 1; /* matched it */
|
||||
}
|
||||
|
||||
/*
|
||||
* count_num_commands()
|
||||
* given a commandsfile string, count the valid command for us.
|
||||
TODO Dynamically load the protocols found
|
||||
*/
|
||||
static int
|
||||
count_num_commands(char *commands)
|
||||
{
|
||||
char *cmdptr = commands;
|
||||
int num_comms = 0;
|
||||
char line[LINE_BUFSIZE];
|
||||
|
||||
/*
|
||||
* parse through the string line-by-line,strip out comments
|
||||
*/
|
||||
/*D_PRINTF(stderr, "count_num_commands[%s]\n", commands);*/
|
||||
|
||||
while (NULL != (cmdptr = get_line_from_buffer (cmdptr, line, NULL, 0))) {
|
||||
/* increment count if we've hit a open tag (e.g. <SMTP...) and
|
||||
it's not the <Default> tag, or <Graph> tag */
|
||||
if (line[0] != '<') continue; /* not an open */
|
||||
if (line[1] == '/') continue; /* a close */
|
||||
if (0 == strnicmp (line+1, "default", 7)) continue; /* default */
|
||||
|
||||
/* should already be filtered out */
|
||||
if (0 == strnicmp (line+1, "graph", 5)) continue; /* graph */
|
||||
|
||||
/* Section open, check if for us */
|
||||
if (check_hostname_attribute (line) < 0) {
|
||||
D_PRINTF (stderr, "count_num_commands: section not for us '%s'\n",
|
||||
line);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* find protocol */
|
||||
if (NULL == protocol_get (line+1)) {
|
||||
/* TODO load handler */
|
||||
|
||||
/* TODO add to protocol list */
|
||||
|
||||
D_PRINTF (stderr, "count_num_commands: No handler for '%s'\n",
|
||||
line);
|
||||
continue;
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "count_num_commands: Found section '%s'\n", line);
|
||||
num_comms++;
|
||||
}
|
||||
|
||||
return (num_comms);
|
||||
}
|
||||
|
||||
char *
|
||||
string_tolower(char *string)
|
||||
{
|
||||
if (string == NULL)
|
||||
return NULL;
|
||||
|
||||
/* convert to lower case */
|
||||
for (; *string != '\0'; ++string) {
|
||||
*string = tolower (*string);
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
||||
char *
|
||||
string_unquote(char *string)
|
||||
{
|
||||
int len, num;
|
||||
char *from, *to;
|
||||
|
||||
if (string == NULL)
|
||||
return NULL;
|
||||
|
||||
len = strlen(string);
|
||||
|
||||
if (string[0] == '"' && string[len-1] == '"') {
|
||||
/* remove matching double-quotes */
|
||||
string[len-1] = '\0';
|
||||
++string;
|
||||
}
|
||||
|
||||
/* replace quoted characters (and decimal codes) */
|
||||
/* assuming line-continuation already happened */
|
||||
from = to = string;
|
||||
while (*from) {
|
||||
if (*from == '\\') {
|
||||
++from;
|
||||
if (IS_NUM(*from)) {
|
||||
num = *from++ - '0';
|
||||
if (IS_NUM(*from))
|
||||
num = num*10 + (*from++ - '0');
|
||||
if (IS_NUM(*from))
|
||||
num = num*10 + (*from++ - '0');
|
||||
*to++ = num;
|
||||
} else {
|
||||
switch (*from) {
|
||||
case '\0': continue;
|
||||
case 'n': *to++ = '\n'; break;
|
||||
case 'r': *to++ = '\r'; break;
|
||||
case 't': *to++ = '\t'; break;
|
||||
default: *to++ = *from; break;
|
||||
}
|
||||
++from;
|
||||
}
|
||||
} else {
|
||||
*to++ = *from++;
|
||||
}
|
||||
}
|
||||
*to = '\0';
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
/*
|
||||
* load_commands()
|
||||
* Parse the commlist file again, this time getting the commands, filenames
|
||||
* and weights and reading the message files into memory.
|
||||
*/
|
||||
int
|
||||
load_commands(char *commands)
|
||||
{
|
||||
char *cmdptr = commands;
|
||||
|
||||
int total_weight = 0;
|
||||
char line[LINE_BUFSIZE];
|
||||
int lineNumber = 0;
|
||||
int commIndex = 0;
|
||||
int inCommand = 0; /* 0 none, -1 ignore, 1 default, 2 other */
|
||||
string_list_t *param_list = NULL;
|
||||
|
||||
g_default_params = paramListInit (); /* create default section list */
|
||||
|
||||
/* set built in defaults. always use lower case names */
|
||||
paramListAdd (g_default_params, "numloops", "1");
|
||||
paramListAdd (g_default_params, "numrecipients", "1");
|
||||
paramListAdd (g_default_params, "numlogins", "1");
|
||||
paramListAdd (g_default_params, "numaddresses", "1");
|
||||
paramListAdd (g_default_params, "weight", "100");
|
||||
|
||||
gn_number_of_commands = count_num_commands(commands);
|
||||
D_PRINTF(stderr, "number_of_commands = %d\n", gn_number_of_commands);
|
||||
if (gn_number_of_commands <= 0) { /* no mail msgs - exit */
|
||||
return returnerr (stderr, "No commands found\n");
|
||||
}
|
||||
|
||||
/* allocate structure to hold command list (command filename weight) */
|
||||
g_loaded_comm_list =
|
||||
(mail_command_t *) mycalloc(gn_number_of_commands
|
||||
* sizeof(mail_command_t));
|
||||
|
||||
while (NULL
|
||||
!= (cmdptr = get_line_from_buffer (cmdptr, line, &lineNumber, 0))) {
|
||||
|
||||
/* The pre-process step does lots of checking, keep this simple */
|
||||
/* check for close tag */
|
||||
if ((line[0] == '<') && (line[1] == '/')) {
|
||||
/* default or ignored command */
|
||||
if (inCommand < 2) {
|
||||
assert (param_list == NULL);
|
||||
inCommand = 0;
|
||||
continue;
|
||||
}
|
||||
stringListAdd (param_list, line); /* store last line */
|
||||
|
||||
if (g_loaded_comm_list[commIndex].proto->parseEnd) {
|
||||
int ret;
|
||||
ret = (g_loaded_comm_list[commIndex].proto->parseEnd)
|
||||
(g_loaded_comm_list+commIndex,
|
||||
param_list, g_default_params);
|
||||
|
||||
if (ret < 0) {
|
||||
D_PRINTF (stderr, "Error finalizing section for '%s'\n",
|
||||
line);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
g_loaded_comm_list[commIndex].proto->cmdCount++;
|
||||
D_PRINTF (stderr, "Section done: '%s' weight=%d\n\n",
|
||||
line, g_loaded_comm_list[commIndex].weight);
|
||||
/* update total weight */
|
||||
total_weight += g_loaded_comm_list[commIndex].weight;
|
||||
|
||||
commIndex++;
|
||||
inCommand = 0;
|
||||
if (param_list) {
|
||||
stringListFree (param_list);
|
||||
param_list = NULL;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
/* open tag */
|
||||
if (line[0] == '<') {
|
||||
protocol_t *pp;
|
||||
|
||||
if (check_hostname_attribute (line) < 0) { /* not for us */
|
||||
D_PRINTF (stderr, "Section not for us %s\n", line);
|
||||
inCommand = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if default special case */
|
||||
if (0 == strnicmp (line+1, "default", 7)) { /* default */
|
||||
D_PRINTF (stderr, "DEFAULT section\n");
|
||||
inCommand = 1;
|
||||
continue;
|
||||
}
|
||||
/* Check if we should ignore it */
|
||||
if (0 == strnicmp (line+1, "graph", 5)) { /* ignore graph */
|
||||
D_PRINTF (stderr, "GRAPH section (ignored)\n");
|
||||
inCommand = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
pp = protocol_get (line+1);
|
||||
if (NULL == pp) { /* protocol not found */
|
||||
d_printf (stderr,
|
||||
"Warning: Skipping section with no protocol handler '%s'\n",
|
||||
line);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pp->parseStart) {
|
||||
int ret;
|
||||
ret = (pp->parseStart) (g_loaded_comm_list+commIndex,
|
||||
line, g_default_params);
|
||||
if (ret < 0) {
|
||||
D_PRINTF (stderr, "Error Initializing section for '%s'\n",
|
||||
line);
|
||||
continue;
|
||||
} else if (ret == 0) {
|
||||
D_PRINTF (stderr, "Ignoring section for '%s'\n",
|
||||
line);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* start a command */
|
||||
D_PRINTF (stderr, "New Section: %s\n", line);
|
||||
g_loaded_comm_list[commIndex].proto = pp;
|
||||
inCommand = 2;
|
||||
param_list = stringListInit (line); /* store first line */
|
||||
/* ignoring rest of line */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* If we're not inside a command tag or not for us, ignore the line */
|
||||
if (inCommand <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* attr value */
|
||||
if (1 == inCommand) { /* default, always name value pairs */
|
||||
char *value;
|
||||
value = line + strcspn (line, " \t=");
|
||||
if (value != line) {
|
||||
*value++ = 0; /* terminate name */
|
||||
value += strspn(value, " \t=");
|
||||
|
||||
string_tolower(line);
|
||||
value = string_unquote(value);
|
||||
|
||||
/*D_PRINTF (stderr, "DEFAULT: name='%s' value='%s'\n",
|
||||
line, value);*/
|
||||
paramListAdd (g_default_params, line, value);
|
||||
} else {
|
||||
D_PRINTF (stderr, "DEFAULT: Cound not find 'NAME VALUE...', line %d\n",
|
||||
lineNumber);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
/* store body for protocol parsing */
|
||||
stringListAdd (param_list, line);
|
||||
}
|
||||
return (total_weight);
|
||||
}
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
/* these are protocol dependent timers for Pop, Imap, Smtp, Http*/
|
||||
typedef struct pish_stats {
|
||||
event_timer_t connect;
|
||||
event_timer_t banner;
|
||||
event_timer_t login;
|
||||
event_timer_t cmd;
|
||||
event_timer_t msgread;
|
||||
event_timer_t msgwrite;
|
||||
event_timer_t logout;
|
||||
|
||||
/* protocol dependent local storage */
|
||||
/* should have local ranges too */
|
||||
range_t loginRange; /* login range for this thread */
|
||||
unsigned long lastLogin;
|
||||
range_t domainRange; /* domain range for this thread */
|
||||
unsigned long lastDomain;
|
||||
range_t addressRange; /* address range for this thread */
|
||||
unsigned long lastAddress;
|
||||
} pish_stats_t;
|
||||
|
||||
/* These are common to POP, IMAP, SMTP, HTTP */
|
||||
typedef struct pish_command {
|
||||
resolved_addr_t hostInfo; /* should be a read only cache */
|
||||
|
||||
/* These are common to SMTP, POP, IMAP */
|
||||
char * loginFormat;
|
||||
range_t loginRange; /* login range for all threads */
|
||||
|
||||
range_t domainRange; /* domain range for all threads */
|
||||
|
||||
char * passwdFormat;
|
||||
|
||||
long flags; /* protocol specific flags */
|
||||
|
||||
/* SMTP command attrs */
|
||||
char * addressFormat;
|
||||
range_t addressRange; /* address range for all threads */
|
||||
|
||||
int numRecipients; /* recpients per message */
|
||||
char * smtpMailFrom; /* default from address */
|
||||
char * filePattern; /* filename pattern */
|
||||
int fileCount; /* number of files */
|
||||
void * files; /* array of file info */
|
||||
|
||||
/* IMAP command attrs */
|
||||
char * imapSearchFolder;
|
||||
char * imapSearchPattern;
|
||||
int imapSearchRate;
|
||||
} pish_command_t;
|
||||
|
||||
/* TRANSITION functions */
|
||||
extern int pishParseNameValue (pmail_command_t cmd, char *name, char *tok);
|
||||
@@ -1,425 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
* Mike Blakely
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/* pop3.c: POP3 protocol test */
|
||||
|
||||
#include "bench.h"
|
||||
#include "pish.h"
|
||||
|
||||
typedef struct _doPOP3_state {
|
||||
int numMsgs; /* messages in folder */
|
||||
int totalMsgLength; /* total msg length */
|
||||
int msgCounter; /* count in download */
|
||||
} doPOP3_state_t;
|
||||
|
||||
/* POP3 flags definitions */
|
||||
#define leaveMailOnServer 0x01
|
||||
|
||||
static void doPop3Exit (ptcx_t ptcx, doPOP3_state_t *me);
|
||||
|
||||
|
||||
static int
|
||||
PopParseNameValue (pmail_command_t cmd,
|
||||
char *name,
|
||||
char *tok)
|
||||
{
|
||||
pish_command_t *pish = (pish_command_t *)cmd->data;
|
||||
|
||||
/* find a home for the attr/value */
|
||||
if (pishParseNameValue(cmd, name, tok) == 0)
|
||||
; /* done */
|
||||
else if (strcmp(name, "leavemailonserver") == 0)
|
||||
if (atoi(tok) > 0) {
|
||||
pish->flags |= leaveMailOnServer;
|
||||
} else {
|
||||
pish->flags &= ~leaveMailOnServer;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Set defaults in command structure
|
||||
*/
|
||||
int
|
||||
Pop3ParseStart (pmail_command_t cmd,
|
||||
char *line,
|
||||
param_list_t *defparm)
|
||||
{
|
||||
param_list_t *pp;
|
||||
pish_command_t *pish = (pish_command_t *)mycalloc
|
||||
(sizeof (pish_command_t));
|
||||
cmd->data = pish;
|
||||
|
||||
cmd->numLoops = 9999; /* default 9999 downloads */
|
||||
pish->hostInfo.portNum = POP3_PORT; /* default port */
|
||||
|
||||
D_PRINTF(stderr, "Pop3 Assign defaults\n");
|
||||
/* Fill in defaults first, ignore defaults we dont use */
|
||||
for (pp = defparm; pp; pp = pp->next) {
|
||||
(void)PopParseNameValue (cmd, pp->name, pp->value);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
Fill in command structure from a list of lines
|
||||
*/
|
||||
int
|
||||
Pop3ParseEnd (pmail_command_t cmd,
|
||||
string_list_t *section,
|
||||
param_list_t *defparm)
|
||||
{
|
||||
string_list_t *sp;
|
||||
pish_command_t *pish = (pish_command_t *)cmd->data;
|
||||
|
||||
/* Now parse section lines */
|
||||
D_PRINTF(stderr, "Pop3 Assign section lines\n");
|
||||
/* skip first and last */
|
||||
for (sp = section->next; sp->next; sp = sp->next) {
|
||||
char *name = sp->value;
|
||||
char *tok = name + strcspn(name, " \t=");
|
||||
*tok++ = 0; /* split name off */
|
||||
tok += strspn(tok, " \t=");
|
||||
|
||||
string_tolower(name);
|
||||
tok = string_unquote(tok);
|
||||
|
||||
if (PopParseNameValue (cmd, name, tok) < 0) {
|
||||
/* not a known attr */
|
||||
D_PRINTF(stderr,"unknown attribute '%s' '%s'\n", name, tok);
|
||||
returnerr(stderr,"unknown attribute '%s' '%s'\n", name, tok);
|
||||
}
|
||||
}
|
||||
|
||||
/* check for some of the required command attrs */
|
||||
if (!pish->hostInfo.hostName) {
|
||||
D_PRINTF(stderr,"missing server for command");
|
||||
return returnerr(stderr,"missing server for command\n");
|
||||
}
|
||||
|
||||
if (!pish->loginFormat) {
|
||||
D_PRINTF(stderr,"missing loginFormat for command");
|
||||
return returnerr(stderr,"missing loginFormat for command\n");
|
||||
}
|
||||
|
||||
if (!pish->passwdFormat) {
|
||||
D_PRINTF(stderr,"missing passwdFormat for command");
|
||||
return returnerr(stderr,"missing passwdFormat for command\n");
|
||||
}
|
||||
|
||||
/* see if we can resolve the mailserver addr */
|
||||
if (resolve_addrs(pish->hostInfo.hostName, "tcp",
|
||||
&(pish->hostInfo.host_phe),
|
||||
&(pish->hostInfo.host_ppe),
|
||||
&(pish->hostInfo.host_addr),
|
||||
&(pish->hostInfo.host_type))) {
|
||||
return returnerr (stderr, "Error resolving hostname '%s'\n",
|
||||
pish->hostInfo.hostName);
|
||||
} else {
|
||||
pish->hostInfo.resolved = 1; /* mark the hostInfo resolved */
|
||||
}
|
||||
|
||||
rangeSetFirstCount (&pish->loginRange, pish->loginRange.first,
|
||||
pish->loginRange.span, pish->loginRange.sequential);
|
||||
rangeSetFirstCount (&pish->domainRange, pish->domainRange.first,
|
||||
pish->domainRange.span, pish->domainRange.sequential);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
doPopCommandResponse(ptcx_t ptcx, SOCKET sock, char *command, char *response, int resplen)
|
||||
{
|
||||
int rc;
|
||||
|
||||
T_PRINTF(ptcx->logfile, command, strlen (command), "POP3 SendCommand");
|
||||
rc = doCommandResponse(ptcx, sock, command, response, resplen);
|
||||
if (rc == -1)
|
||||
return rc;
|
||||
T_PRINTF(ptcx->logfile, response, strlen(response),
|
||||
"POP3 ReadResponse"); /* telemetry log. should be lower level */
|
||||
/* D_PRINTF(stderr, "POP command=[%s] response=[%s]\n", command, response); */
|
||||
if (strncmp(response, "+OK", 3) != 0) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
trimEndWhite (command);
|
||||
trimEndWhite (response);
|
||||
returnerr(debugfile,"POP3 error command=[%s] response=[%s]\n",
|
||||
command, response);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
popLogin(ptcx_t ptcx, mail_command_t *cmd, cmd_stats_t *ptimer, SOCKET sock)
|
||||
{
|
||||
char command[MAX_COMMAND_LEN];
|
||||
char respBuffer[MAX_RESPONSE_LEN];
|
||||
char mailUser[MAX_MAILADDR_LEN];
|
||||
char userPasswd[MAX_MAILADDR_LEN];
|
||||
unsigned long loginNum;
|
||||
unsigned long domainNum;
|
||||
int rc;
|
||||
pish_stats_t *stats = (pish_stats_t *)ptimer->data;
|
||||
pish_command_t *pish = (pish_command_t *)cmd->data;
|
||||
|
||||
/* generate a random username and domainname(with a mailbox on the server) */
|
||||
domainNum = rangeNext (&stats->domainRange, stats->lastDomain);
|
||||
stats->lastDomain = domainNum;
|
||||
loginNum = rangeNext (&stats->loginRange, stats->lastLogin);
|
||||
stats->lastLogin = loginNum;
|
||||
|
||||
sprintf(mailUser, pish->loginFormat, loginNum, domainNum);
|
||||
D_PRINTF(debugfile,"mailUser=%s\n", mailUser);
|
||||
sprintf(command, "USER %s%s", mailUser, CRLF);
|
||||
|
||||
event_start(ptcx, &stats->cmd);
|
||||
rc = doPopCommandResponse(ptcx, sock, command, respBuffer, sizeof(respBuffer));
|
||||
event_stop(ptcx, &stats->cmd);
|
||||
if (rc == -1) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->login.errs++;
|
||||
/* error already displayed */
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* send Password */
|
||||
sprintf(userPasswd, pish->passwdFormat, loginNum);
|
||||
sprintf(command, "PASS %s%s", userPasswd, CRLF);
|
||||
|
||||
event_start(ptcx, &stats->login);
|
||||
rc = doPopCommandResponse(ptcx, sock, command, respBuffer, sizeof(respBuffer));
|
||||
event_stop(ptcx, &stats->login);
|
||||
if (rc == -1) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->login.errs++;
|
||||
returnerr(debugfile,"POP3 cannot login user=%s pass=%s\n",
|
||||
mailUser, userPasswd);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *
|
||||
doPop3Start(ptcx_t ptcx, mail_command_t *cmd, cmd_stats_t *ptimer)
|
||||
{
|
||||
doPOP3_state_t *me = (doPOP3_state_t *)mycalloc (sizeof (doPOP3_state_t));
|
||||
char respBuffer[MAX_RESPONSE_LEN];
|
||||
int rc;
|
||||
int numBytes;
|
||||
char command[MAX_COMMAND_LEN];
|
||||
pish_stats_t *stats = (pish_stats_t *)ptimer->data;
|
||||
pish_command_t *pish = (pish_command_t *)cmd->data;
|
||||
|
||||
if (!me) return NULL;
|
||||
|
||||
me->numMsgs = 0;
|
||||
me->totalMsgLength = 0;
|
||||
me->msgCounter = 0;
|
||||
|
||||
event_start(ptcx, &stats->connect);
|
||||
ptcx->sock = connectSocket(ptcx, &pish->hostInfo, "tcp");
|
||||
event_stop(ptcx, &stats->connect);
|
||||
if (BADSOCKET(ptcx->sock)) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->connect.errs++;
|
||||
returnerr(debugfile, "POP3 Couldn't connect to %s: %s\n",
|
||||
pish->hostInfo.hostName, neterrstr());
|
||||
}
|
||||
myfree (me);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (gf_abortive_close) {
|
||||
if (set_abortive_close(ptcx->sock) != 0) {
|
||||
returnerr (debugfile, "POP3: WARNING: Could not set abortive close\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* READ connect response from server */
|
||||
event_start(ptcx, &stats->banner);
|
||||
numBytes = readResponse(ptcx, ptcx->sock, respBuffer, sizeof(respBuffer));
|
||||
event_stop(ptcx, &stats->banner);
|
||||
if (numBytes <= 0) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->banner.errs++;
|
||||
returnerr(debugfile,"POP3 Error reading banner: %s\n",
|
||||
neterrstr());
|
||||
}
|
||||
doPop3Exit (ptcx, me);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* LOGIN
|
||||
*/
|
||||
|
||||
rc = popLogin(ptcx, cmd, ptimer, ptcx->sock);
|
||||
if (rc != 0) {
|
||||
doPop3Exit (ptcx, me);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* send a STAT */
|
||||
sprintf(command, "STAT%s", CRLF);
|
||||
event_start(ptcx, &stats->cmd);
|
||||
rc = doPopCommandResponse(ptcx, ptcx->sock, command, respBuffer, sizeof(respBuffer));
|
||||
event_stop(ptcx, &stats->cmd);
|
||||
if (rc == -1) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->cmd.errs++;
|
||||
}
|
||||
doPop3Exit (ptcx, me);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* parse number of msgs out of buffer */
|
||||
if (!sscanf(respBuffer, "+OK %d %d", &me->numMsgs, &me->totalMsgLength)) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->cmd.errs++;
|
||||
returnerr(debugfile,"POP3 Error parsing STAT response, %s: %s\n",
|
||||
respBuffer, neterrstr());
|
||||
}
|
||||
doPop3Exit (ptcx, me);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
D_PRINTF(debugfile,"STAT shows %d msgs of %d total bytes\n",
|
||||
me->numMsgs, me->totalMsgLength);
|
||||
return me;
|
||||
}
|
||||
|
||||
int
|
||||
doPop3Loop(ptcx_t ptcx, mail_command_t *cmd, cmd_stats_t *ptimer, void *mystate)
|
||||
{
|
||||
doPOP3_state_t *me = (doPOP3_state_t *)mystate;
|
||||
char command[MAX_COMMAND_LEN];
|
||||
char respBuffer[MAX_RESPONSE_LEN];
|
||||
int rc, numBytes;
|
||||
pish_stats_t *stats = (pish_stats_t *)ptimer->data;
|
||||
pish_command_t *pish = (pish_command_t *)cmd->data;
|
||||
|
||||
if (me->msgCounter >= me->numMsgs) return -1; /* done, close */
|
||||
|
||||
/* retr the msgs */
|
||||
/* send the RETR command */
|
||||
sprintf(command, "RETR %d%s", ++me->msgCounter, CRLF);
|
||||
event_start(ptcx, &stats->msgread);
|
||||
rc = sendCommand(ptcx, ptcx->sock, command);
|
||||
if (rc == -1) {
|
||||
event_stop(ptcx, &stats->msgread);
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->msgread.errs++;
|
||||
returnerr(debugfile,"POP3 Error sending RETR %d command: %s\n",
|
||||
me->msgCounter, neterrstr());
|
||||
}
|
||||
doPop3Exit (ptcx, me);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* read msg */
|
||||
numBytes = retrMsg(ptcx, NULL, 0 , ptcx->sock);
|
||||
event_stop(ptcx, &stats->msgread);
|
||||
|
||||
if (numBytes <= 0) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->msgread.errs++;
|
||||
returnerr(debugfile,"POP3 Error retrieving msg %d: %s\n",
|
||||
me->msgCounter, neterrstr());
|
||||
}
|
||||
doPop3Exit (ptcx, me);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* if we're not told to leave mail on server, delete the message */
|
||||
if (!(pish->flags & leaveMailOnServer)) {
|
||||
/* send the DELE command */
|
||||
sprintf(command, "DELE %d%s", me->msgCounter, CRLF);
|
||||
event_start(ptcx, &stats->cmd);
|
||||
rc = doPopCommandResponse(ptcx, ptcx->sock, command, respBuffer, sizeof(respBuffer));
|
||||
event_stop(ptcx, &stats->cmd);
|
||||
if (rc == -1) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->cmd.errs++;
|
||||
}
|
||||
doPop3Exit (ptcx, me);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
doPop3End(ptcx_t ptcx, mail_command_t *cmd, cmd_stats_t *ptimer, void *mystate)
|
||||
{
|
||||
doPOP3_state_t *me = (doPOP3_state_t *)mystate;
|
||||
char command[MAX_COMMAND_LEN];
|
||||
char respBuffer[MAX_RESPONSE_LEN];
|
||||
int rc;
|
||||
pish_stats_t *stats = (pish_stats_t *)ptimer->data;
|
||||
|
||||
if (BADSOCKET(ptcx->sock)) return; /* closed by previous error */
|
||||
|
||||
/* send QUIT */
|
||||
sprintf(command, "QUIT%s", CRLF);
|
||||
event_start(ptcx, &stats->logout);
|
||||
rc = doPopCommandResponse(ptcx, ptcx->sock, command, respBuffer, sizeof(respBuffer));
|
||||
event_stop(ptcx, &stats->logout);
|
||||
if (rc == -1) {
|
||||
if (gf_timeexpired < EXIT_FAST) {
|
||||
stats->logout.errs++; /* counted twice? */
|
||||
}
|
||||
}
|
||||
doPop3Exit (ptcx, me);
|
||||
}
|
||||
|
||||
void
|
||||
doPop3Exit (ptcx_t ptcx, doPOP3_state_t *me)
|
||||
{
|
||||
if (!BADSOCKET(ptcx->sock))
|
||||
NETCLOSE(ptcx->sock);
|
||||
ptcx->sock = BADSOCKET_VALUE;
|
||||
|
||||
myfree (me);
|
||||
}
|
||||
@@ -1,397 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
* Mike Blakely
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#include "bench.h"
|
||||
|
||||
#ifdef USE_LRAND48_R /* also AIX (only when using threads)*/
|
||||
|
||||
struct drand48_data drand48data;
|
||||
|
||||
/* should verify that the struct drand48_data can be shared between threads */
|
||||
void
|
||||
osf_srand48_r(unsigned int seed)
|
||||
{
|
||||
srand48_r(seed, &drand48data);
|
||||
}
|
||||
|
||||
|
||||
long
|
||||
osf_lrand48_r(void)
|
||||
{
|
||||
long ret;
|
||||
|
||||
lrand48_r(&drand48data, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* __OSF1__ */
|
||||
|
||||
#ifdef _WIN32
|
||||
/* close socket library at exit() time */
|
||||
void sock_cleanup(void) {
|
||||
WSACleanup();
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
/* neither sleep or usleep re-start if interrupted */
|
||||
void
|
||||
MS_sleep(unsigned int secs)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
Sleep(secs * 1000);
|
||||
#else
|
||||
struct timeval sleeptime;
|
||||
|
||||
/*D_PRINTF(stderr, "MS_sleep(%d)\n", secs);*/
|
||||
|
||||
sleeptime.tv_sec = secs;
|
||||
sleeptime.tv_usec = 0;
|
||||
if (select( (int)NULL, (fd_set *)NULL, (fd_set *)NULL, (fd_set *)NULL,
|
||||
&sleeptime ) < 0) {
|
||||
D_PRINTF (stderr, "MS_sleep %lu returned early\n", secs);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
MS_usleep(unsigned int microsecs)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
Sleep(microsecs / 1000);
|
||||
#else
|
||||
struct timeval sleeptime;
|
||||
|
||||
/*D_PRINTF(stderr, "MS_usleep(%d)\n", microsecs);*/
|
||||
|
||||
sleeptime.tv_sec = USECS_2_SECS(microsecs);
|
||||
sleeptime.tv_usec = microsecs % USECINSEC;
|
||||
if (select( (int)NULL, (fd_set *)NULL, (fd_set *)NULL, (fd_set *)NULL,
|
||||
&sleeptime ) < 0) {
|
||||
D_PRINTF (stderr, "MS_usleep %lu returned early\n", microsecs);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* strerror() */
|
||||
#ifndef HAVE_STRERROR
|
||||
/* strerror is not available on SunOS 4.1.3 and others */
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
extern int errno;
|
||||
|
||||
char *strerror(int errnum)
|
||||
{
|
||||
if (errnum<sys_nerr) {
|
||||
return(sys_errlist[errnum]);
|
||||
}
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
#endif /* strerror() */
|
||||
|
||||
/* stub routines for NT */
|
||||
|
||||
#ifdef WIN32
|
||||
#include <winsock.h>
|
||||
#include <process.h>
|
||||
|
||||
int getpid(void) {
|
||||
|
||||
return GetCurrentThreadId();
|
||||
}
|
||||
|
||||
#include <sys/timeb.h> /* For prototype of "_ftime()" */
|
||||
/*
|
||||
* gettimeofday() -- gets the current time in elapsed seconds and
|
||||
* microsends since GMT Jan 1, 1970.
|
||||
*
|
||||
* ARGUMENTS: - Pointer to a timeval struct to return the time into
|
||||
*
|
||||
* RETURN CODES: - 0 on success
|
||||
* -1 on failure
|
||||
*/
|
||||
int gettimeofday(struct timeval *curTimeP)
|
||||
{
|
||||
struct _timeb localTime;
|
||||
|
||||
if (curTimeP == (struct timeval *) NULL) {
|
||||
errno = EFAULT;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the elapsed time since Jan 1, 1970 by first
|
||||
* obtaining the elapsed time from the system using the
|
||||
* _ftime(..) call and then convert to the "timeval"
|
||||
* equivalent.
|
||||
*/
|
||||
|
||||
_ftime(&localTime);
|
||||
|
||||
curTimeP->tv_sec = localTime.time;
|
||||
curTimeP->tv_usec = localTime.millitm * 1000;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
void
|
||||
crank_limits(void)
|
||||
{}
|
||||
|
||||
void
|
||||
setup_signal_handlers(void)
|
||||
{}
|
||||
|
||||
int
|
||||
sysdep_thread_create(THREAD_ID *id, thread_fn_t tfn, void *arg)
|
||||
{
|
||||
if (_beginthread(tfn, NT_STACKSIZE, arg) == -1) {
|
||||
errexit(stderr, "_beginthread failed: %d", GetLastError());
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sysdep_thread_join(THREAD_ID id, int *pstatus)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else /* !_WIN32 */
|
||||
|
||||
#define MAX_TRYFDS (64*1024)
|
||||
|
||||
void
|
||||
crank_limits(void)
|
||||
{
|
||||
struct rlimit rlim;
|
||||
int cur_lim;
|
||||
int rc;
|
||||
|
||||
#ifdef __OSF1__
|
||||
D_PRINTF(stderr, "attempting to enable support for up to 64k file descriptors\n");
|
||||
|
||||
rc = setsysinfo(SSI_FD_NEWMAX, NULL, 0, NULL, 1);
|
||||
if (rc == -1) {
|
||||
perror("setsysinfo()");
|
||||
}
|
||||
#endif /* __OSF1__ */
|
||||
|
||||
D_PRINTF(stderr, "attempting to increase our hard limit (up to %d)\n", MAX_TRYFDS);
|
||||
|
||||
rc = getrlimit(RLIMIT_NOFILE, &rlim);
|
||||
if (rc == -1) {
|
||||
returnerr(stderr, "getrlimit()");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
for (cur_lim = rlim.rlim_max; cur_lim < MAX_TRYFDS; cur_lim += 1024) {
|
||||
rlim.rlim_max = cur_lim;
|
||||
|
||||
rc = setrlimit(RLIMIT_NOFILE, &rlim);
|
||||
if (rc == -1) {
|
||||
D_PRINTF (stderr, "setrlimit(RLIMIT_NOFILE, [rlim_max=%d]): errno=%d: %s\n",
|
||||
rlim.rlim_max, errno, strerror(errno));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
D_PRINTF(stderr, "attempting to increase our soft limit\n");
|
||||
|
||||
rc = getrlimit(RLIMIT_NOFILE, &rlim);
|
||||
if (rc == -1) {
|
||||
returnerr(stderr, "getrlimit()");
|
||||
exit(-1);
|
||||
}
|
||||
rlim.rlim_cur = rlim.rlim_max;
|
||||
|
||||
rc = setrlimit(RLIMIT_NOFILE, &rlim);
|
||||
if (rc == -1) {
|
||||
D_PRINTF (stderr, "setrlimit(RLIMIT_NOFILE, [rlim_cur=%d]): errno=%d: %s\n",
|
||||
rlim.rlim_cur, errno, strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
getrlimit(RLIMIT_NOFILE, &rlim);
|
||||
if (rlim.rlim_cur < 256) { /* show if lower than docs suggest */
|
||||
returnerr (stderr, "RLIMIT_NOFILE = %d. max processes/threads ~ %d\n",
|
||||
rlim.rlim_cur, rlim.rlim_cur-10);
|
||||
} else {
|
||||
D_PRINTF (stderr, "RLIMIT_NOFILE = %d. max processes/threads ~ %d\n",
|
||||
rlim.rlim_cur, rlim.rlim_cur-10);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nullHandler(int sig)
|
||||
{
|
||||
/* Dont do anything, (trap SIGPIPE) */
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
alarmHandler(int sig)
|
||||
{
|
||||
/* Dont do anything, mainly break system calls */
|
||||
if (gf_timeexpired < EXIT_SOON) gf_timeexpired = EXIT_SOON;
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
hupHandler(int sig)
|
||||
{
|
||||
if (gf_timeexpired < EXIT_SOON) { /* first time, go to clean stop */
|
||||
beginShutdown ();
|
||||
} else if (gf_timeexpired < EXIT_FAST) { /* second time, faster */
|
||||
gf_timeexpired = EXIT_FAST;
|
||||
} else if (gf_timeexpired < EXIT_FASTEST) { /* second time, fastest */
|
||||
gf_timeexpired = EXIT_FASTEST;
|
||||
} else { /* third time, exit */
|
||||
exit (sig);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 /* not used */
|
||||
/* Received a signal that a child process has exited */
|
||||
void
|
||||
childHandler(int sig)
|
||||
{
|
||||
int status;
|
||||
|
||||
/*D_PRINTF(stderr, "A child process has exited\n" );*/
|
||||
while (wait3(&status, WNOHANG, (struct rusage *)0) > 0) {
|
||||
/* do nothing */
|
||||
/*D_PRINTF(stderr, "wait3() says %d died\n", status);;*/
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
setup_signal_handlers(void)
|
||||
{
|
||||
/* We will loop until the alarm goes off (should abort system calls). */
|
||||
#ifdef __LINUX__
|
||||
{ /* setup signal handler */
|
||||
struct sigaction sig;
|
||||
sig.sa_flags = 0;
|
||||
sig.sa_restorer = 0;
|
||||
sigemptyset (&sig.sa_mask);
|
||||
|
||||
sig.sa_handler = alarmHandler;
|
||||
sigaction (SIGALRM, &sig, NULL);
|
||||
|
||||
sig.sa_handler = hupHandler;
|
||||
sigaction (SIGHUP, &sig, NULL);
|
||||
sigaction (SIGTERM, &sig, NULL);
|
||||
|
||||
sig.sa_handler = nullHandler;
|
||||
sigaction (SIGPIPE, &sig, NULL);
|
||||
|
||||
}
|
||||
#else
|
||||
sigset(SIGALRM, alarmHandler);
|
||||
sigset(SIGHUP, hupHandler);
|
||||
sigset(SIGTERM, hupHandler);
|
||||
sigset(SIGPIPE, nullHandler);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
sysdep_thread_create(THREAD_ID *id, thread_fn_t tfn, void *arg)
|
||||
{
|
||||
#ifdef USE_PTHREADS
|
||||
int ret;
|
||||
pthread_attr_t attr;
|
||||
|
||||
if ((ret=pthread_attr_init(&attr)) != 0) {
|
||||
returnerr(stderr, "pthread_attr_init() ret=%d errno=%d: %s\n",
|
||||
ret, errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if 0 /* the default thread attributes */
|
||||
pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
|
||||
pthread_attr_setstackaddr(&attr, NULL); /* allocated by system */
|
||||
pthread_attr_setstacksize(&attr, NULL); /* 1 MB */
|
||||
pthread_attr_setschedparam(&attr, _PARENT_); /* priority of parent */
|
||||
pthread_attr_setschedpolicy(&attr, SCHED_OTHER); /* determined by system */
|
||||
/* also have SCHED_FIFO and SCHED_RR */
|
||||
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
|
||||
#endif
|
||||
#ifdef __AIX__
|
||||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_UNDETACHED);
|
||||
#else
|
||||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
|
||||
#endif
|
||||
|
||||
#ifdef THREADS_SCOPE_SYSTEM
|
||||
/* bound threads, one thread per LWP */
|
||||
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
|
||||
#endif
|
||||
|
||||
if ((ret=pthread_create(id, &attr, tfn, arg)) != 0) {
|
||||
returnerr(stderr, "pthread_create() failed ret=%d errno=%d: %s\n",
|
||||
ret, errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if ((ret=pthread_attr_destroy(&attr)) != 0) {
|
||||
returnerr(stderr, "pthread_attr_destroy() ret=%d errno=%d: %s\n",
|
||||
ret, errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
sysdep_thread_join(THREAD_ID id, int *pstatus)
|
||||
{
|
||||
int ret;
|
||||
|
||||
for (;;) {
|
||||
errno = 0;
|
||||
*pstatus = 0;
|
||||
if ((ret = pthread_join(id, (void **)pstatus)) == 0)
|
||||
break;
|
||||
D_PRINTF(stderr, "pthread_join(%d) error ret=%d status=%d: errno=%d: %s\n",
|
||||
id, ret, *pstatus, errno, strerror(errno));
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* WIN32 */
|
||||
@@ -1,202 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
* Mike Blakely
|
||||
* David Shak
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
#ifndef __SYSDEP_H__
|
||||
#define __SYSDEP_H__
|
||||
|
||||
/* include config.h, output from autoconf */
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#ifndef __CONFIG_H__
|
||||
#define __CONFIG_H__
|
||||
/* borrow config.h from gnuplot. Should build our own */
|
||||
#include "gnuplot/config.h"
|
||||
#endif
|
||||
#else
|
||||
/* Modern OSes have these */
|
||||
#define HAVE_SNPRINTF 1
|
||||
#define HAVE_STRERROR 1
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <winsock.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifdef __OSF1__
|
||||
#include <sys/sysinfo.h> /* for setsysinfo() */
|
||||
#endif
|
||||
|
||||
/* MAXHOSTNAMELEN is undefined on some systems */
|
||||
#ifndef MAXHOSTNAMELEN
|
||||
#define MAXHOSTNAMELEN 64
|
||||
#endif
|
||||
|
||||
/* SunOS doesn't define NULL */
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
/* encapsulation of minor UNIX/WIN NT differences */
|
||||
#ifdef _WIN32
|
||||
#define NETREAD(sock, buf, len) recv(sock, buf, len, 0)
|
||||
#define NETWRITE(sock, buf, len) send(sock, buf, len, 0)
|
||||
#define NETCLOSE(sock) closesocket(sock)
|
||||
#define OUTPUT_WRITE(sock, buf, len) write(sock, buf, len)
|
||||
#define BADSOCKET(sock) ((sock) == INVALID_SOCKET)
|
||||
#define BADSOCKET_ERRNO(sock) BADSOCKET(sock)
|
||||
#define BADSOCKET_VALUE INVALID_SOCKET
|
||||
#define S_ADDR S_un.S_addr
|
||||
#define GET_ERROR WSAGetLastError()
|
||||
#define SET_ERROR(err) WSASetLastError(err)
|
||||
|
||||
/* NT gettimeofday() doesn't support USE_TIMEZONE (yet) */
|
||||
#include <time.h>
|
||||
#define GETTIMEOFDAY(timeval, tz) gettimeofday(timeval)
|
||||
|
||||
typedef unsigned short NETPORT;
|
||||
#define SRANDOM srand
|
||||
#define RANDOM rand
|
||||
#define PROGPATH "c:\\mailstone\\mailclient"
|
||||
#define FILENAME_SIZE 256
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
#define SIGCHLD 0 /* dummy value */
|
||||
#define SIGALRM 0 /* dummy value */
|
||||
typedef int pid_t;
|
||||
typedef unsigned short ushort;
|
||||
#define MAXPATHLEN 512
|
||||
|
||||
extern void sock_cleanup(void);
|
||||
|
||||
#define THREAD_RET void
|
||||
#define THREAD_ID int
|
||||
|
||||
#else /* not _WIN32 */
|
||||
|
||||
#define strnicmp(s1,s2,n) strncasecmp(s1,s2,n)
|
||||
|
||||
#define NETREAD(sock, buf, len) read(sock, buf, len)
|
||||
#define NETWRITE(sock, buf, len) write(sock, buf, len)
|
||||
#define NETCLOSE(sock) close(sock)
|
||||
#define OUTPUT_WRITE(sock, buf, len) write(sock, buf, len)
|
||||
#define BADSOCKET(sock) ((sock) < 0)
|
||||
#define BADSOCKET_ERRNO(sock) (BADSOCKET(sock) || errno)
|
||||
#define BADSOCKET_VALUE (-1)
|
||||
#define S_ADDR s_addr
|
||||
#define GET_ERROR errno
|
||||
#define SET_ERROR(err) (errno = (err))
|
||||
|
||||
#define GETTIMEOFDAY(timeval,tz) gettimeofday(timeval, NULL)
|
||||
|
||||
typedef unsigned short NETPORT;
|
||||
|
||||
#if defined (USE_LRAND48_R)
|
||||
extern void osf_srand48_r(unsigned int seed);
|
||||
extern long osf_lrand48_r(void);
|
||||
#define SRANDOM osf_srand48_r
|
||||
#define RANDOM osf_lrand48_r
|
||||
|
||||
#elif defined (USE_LRAND48)
|
||||
|
||||
#define SRANDOM srand48
|
||||
#define RANDOM lrand48
|
||||
|
||||
#else /* !USE_LRAND48 */
|
||||
|
||||
#define SRANDOM srandom
|
||||
#define RANDOM random
|
||||
|
||||
#endif /* USE_LRAND48_R */
|
||||
|
||||
#define PROGPATH "/mailstone/mailclient"
|
||||
#define FILENAME_SIZE 1024
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
typedef int SOCKET;
|
||||
#define min(a,b) (((a) < (b)) ? a : b)
|
||||
#define max(a,b) (((a) > (b)) ? a : b)
|
||||
|
||||
#define THREAD_RET void *
|
||||
#ifdef USE_PTHREADS
|
||||
#define THREAD_ID pthread_t
|
||||
#else
|
||||
#define THREAD_ID int
|
||||
#endif
|
||||
|
||||
#endif /* _WIN32 */
|
||||
|
||||
|
||||
typedef THREAD_RET (*thread_fn_t)(void *);
|
||||
|
||||
/* function prototypes */
|
||||
|
||||
extern void crank_limits(void);
|
||||
extern int sysdep_thread_create(THREAD_ID *id, thread_fn_t tfn, void *arg);
|
||||
extern int sysdep_thread_join(THREAD_ID id, int *pstatus);
|
||||
extern void setup_signal_handlers (void);
|
||||
|
||||
#ifdef _WIN32
|
||||
int getopt(int argc, char ** argv, char *opts);
|
||||
int getpid(void);
|
||||
int gettimeofday(struct timeval *curTimeP);
|
||||
int random_number(int max);
|
||||
SOCKET rexec(const char **hostname, NETPORT port, char *username, char *password,
|
||||
char *command, SOCKET *sockerr);
|
||||
|
||||
#else
|
||||
#ifdef NO_REXEC
|
||||
extern int rexec(char **, int, char *, char *, char *, int *);
|
||||
#endif
|
||||
#endif /* _WIN32 */
|
||||
|
||||
|
||||
#ifndef HAVE_STRERROR
|
||||
/* strerror() is not available on SunOS 4.x and others */
|
||||
char *strerror(int errnum);
|
||||
|
||||
#endif
|
||||
/* strerror() */
|
||||
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE -1
|
||||
#endif
|
||||
|
||||
#endif /* !__SYSDEP_H__ */
|
||||
@@ -1,73 +0,0 @@
|
||||
/* -*- Mode: C; c-file-style: "stroustrup"; comment-column: 40 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
* Marcel DePaolis <marcel@netcape.com>
|
||||
* Mike Blakely
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
/*
|
||||
Stuff that deals with timevals.
|
||||
*/
|
||||
#include "bench.h"
|
||||
|
||||
double
|
||||
timevaldouble(struct timeval *tin)
|
||||
{
|
||||
return ((double)tin->tv_sec + ((double)tin->tv_usec / USECINSEC));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
doubletimeval(const double tin, struct timeval *tout)
|
||||
{
|
||||
tout->tv_sec = (long)floor(tin);
|
||||
tout->tv_usec = (long)((tin - tout->tv_sec) * USECINSEC );
|
||||
}
|
||||
|
||||
/* Difference two timevals and return as a double (in seconds) */
|
||||
/* Could be a macro */
|
||||
double
|
||||
compdifftime_double(struct timeval *EndTime, struct timeval *StartTime)
|
||||
{
|
||||
/* doing the integeger differences first is supposed to prevent
|
||||
any loss in resolution (more important if we returned float instead) */
|
||||
double d = (EndTime->tv_sec - StartTime->tv_sec)
|
||||
+ ((double)(EndTime->tv_usec - StartTime->tv_usec)*(1.0/USECINSEC));
|
||||
|
||||
if (d < 0.0) {
|
||||
D_PRINTF (stderr, "Woa! compdifftime negative start %lu.%06lu end %lu.%06lu\n",
|
||||
StartTime->tv_sec, StartTime->tv_usec,
|
||||
EndTime->tv_sec, EndTime->tv_usec);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
38
mozilla/netwerk/cache/Makefile.in
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
DIRS = \
|
||||
public \
|
||||
memcache \
|
||||
filecache \
|
||||
mgr \
|
||||
build \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
33
mozilla/netwerk/cache/Makefile.win
vendored
Executable file
@@ -0,0 +1,33 @@
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
|
||||
DEPTH=..\..
|
||||
DIRS= \
|
||||
public \
|
||||
mgr \
|
||||
memcache \
|
||||
filecache \
|
||||
build \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
54
mozilla/netwerk/cache/build/Makefile.in
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
#
|
||||
|
||||
DEPTH = ../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = nkcache
|
||||
LIBRARY_NAME = nkcache
|
||||
IS_COMPONENT = 1
|
||||
|
||||
CPPSRCS = nsNetDataCacheModule.cpp
|
||||
|
||||
SHARED_LIBRARY_LIBS = \
|
||||
$(DIST)/lib/libnkcachemgr_s.a \
|
||||
$(DIST)/lib/libnkfilecache_s.a \
|
||||
$(DIST)/lib/libnkmemcache_s.a \
|
||||
$(DIST)/lib/libmozdbm_s.a \
|
||||
$(DIST)/lib/libxpcomio_s.a \
|
||||
$(NULL)
|
||||
|
||||
LOCAL_INCLUDES = \
|
||||
-I$(DEPTH)/netwerk/cache/memcache \
|
||||
-I$(DEPTH)/netwerk/cache/filecache \
|
||||
-I$(DEPTH)/netwerk/cache/mgr \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_DSO_LDOPTS = \
|
||||
$(MKSHLIB_FORCE_ALL) \
|
||||
$(SHARED_LIBRARY_LIBS) \
|
||||
$(MKSHLIB_UNFORCE_ALL) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
$(LIBRARY) $(SHARED_LIBRARY): $(SHARED_LIBRARY_LIBS) Makefile
|
||||
|
||||
51
mozilla/netwerk/cache/build/makefile.win
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=nkcache
|
||||
|
||||
MAKE_OBJ_TYPE=DLL
|
||||
DLLNAME=nkcache
|
||||
DLL=.\$(OBJDIR)\$(DLLNAME).dll
|
||||
|
||||
CPP_OBJS= \
|
||||
.\$(OBJDIR)\nsNetDataCacheModule.obj \
|
||||
$(NULL)
|
||||
|
||||
LLIBS= \
|
||||
$(DIST)\lib\nkcachemgr_s.lib \
|
||||
$(DIST)\lib\nkfilecache_s.lib \
|
||||
$(DIST)\lib\nkmemcache_s.lib \
|
||||
$(DIST)\lib\dbm32.lib \
|
||||
$(DIST)\lib\xpcom.lib \
|
||||
$(LIBNSPR)
|
||||
|
||||
INCS = $(INCS) \
|
||||
-I$(DEPTH)\netwerk\cache\memcache \
|
||||
-I$(DEPTH)\netwerk\cache\filecache \
|
||||
-I$(DEPTH)\netwerk\cache\mgr \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
install:: $(DLL)
|
||||
$(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin\components
|
||||
$(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).lib $(DIST)\lib
|
||||
|
||||