Daniel O'Connor
e7201963d0
Staticise a bunch of functions so I get some understanding of what is needed where.
2012-08-31 12:13:20 +09:30
Daniel O'Connor
0dd2145ed4
assert that the port number matches between calls to overlay_interface_init_any()
2012-08-24 15:21:23 +09:30
Andrew Bettison
27a0a6eeb5
Introduce struct __sourceloc
...
Replaces (const char *file, unsigned int line, const char *function) arguments
to all logging functions, simplifies malloc/free tracking code in
overlay_buffer.c and Rhizome manifest alloc/free tracking in rhizome_bundle.c.
Use __HERE__ macro instead of (__FILE__, __LINE__, __FUNCTION__) everywhere.
Special __NOWHERE__ macro is equivalent to (NULL, 0, NULL).
Declare net.c functions in new "net.h" header, so log.c doesn't have to pull
in the entire "serval.h" just to use write_str().
Facilitates progress on issue #2 .
2012-08-23 12:31:07 +09:30
Jeremy Lakeman
60a82eb251
Improve logging
2012-08-14 16:31:29 +09:30
Jeremy Lakeman
fd111a4d1f
Listen to INADDR_ANY on OSX, otherwise we can't hear broadcasts
2012-08-09 13:32:08 +09:30
Andrew Bettison
12d8bc0c12
Use new typedef time_ms_t everywhere
2012-08-09 12:14:32 +09:30
Andrew Bettison
858c6c3efc
Improve logging to diagnose dnaprotocol test failure
2012-08-03 19:08:44 +09:30
Andrew Bettison
03da89225d
Add xprintf() extensible stream formatter
...
Use it to replace open_memstream(3) in logServalPacket() -- not available on
Mac OS X
2012-08-03 16:44:05 +09:30
Andrew Bettison
9ede55ab4c
Fix DEBUG_packet_visualise() log output
2012-08-03 13:12:54 +09:30
Andrew Bettison
f37ec5af09
Reduce use of stderr in many places
...
serval_packetvisualise() is now replaced by DEBUG_packet_visualise() which uses
logging system not stderr (so now it will appear in Android log).
Replaced several fprintf(stderr,...) with DEBUGF(...).
Command line only prints a full help message on "help" command -- a command
parse failure simply informs the user about the "help" command.
2012-08-01 17:54:02 +09:30
Andrew Bettison
76cfb7beae
Fix bug failed dnaprotocol tests non-deterministically
...
Appending to the dummy interface file was altering the read offset position, so
very many receive packets were being lost.
2012-07-31 17:49:24 +09:30
Andrew Bettison
24b05eaeaa
Fix bug in self-announcements
...
On first tick, do not send s1 = 0, but s1 = s2 - 1 (1 ms window)
2012-07-31 16:21:29 +09:30
Andrew Bettison
ddc17434c4
Fix next-hop logic for case of no interfaces up
2012-07-30 18:35:28 +09:30
Andrew Bettison
240be25793
Replace overlay_gettime_ms() with gettime_ms()
2012-07-30 17:22:38 +09:30
Jeremy Lakeman
6e7c2196ba
Close interfaces on socket errors or when not detected
2012-07-25 16:53:44 +09:30
Jeremy Lakeman
74095e5356
Correctly display interface ip addresses on android
2012-07-25 14:53:53 +09:30
Jeremy Lakeman
ddba8033e4
Refactor packet envelope and sid abbreviation reading and writing
2012-07-17 15:30:50 +09:30
Jeremy Lakeman
5e915bcc09
Schedule packet sending
2012-07-13 12:18:50 +09:30
Jeremy Lakeman
d36ba78afe
Refactor packet construction and sending
2012-07-13 12:18:50 +09:30
Jeremy Lakeman
27c24f377e
Add deadline time for alarm prioritisation
2012-07-13 12:18:45 +09:30
Jeremy Lakeman
35b4ba8594
Schedule interface ticks per interface
2012-07-13 12:13:46 +09:30
Andrew Bettison
d111f763c7
Fix bugs revealed by 'rhizomeprotocol' test
...
Was not transmitting actual HTTP server port in rhizome announcements, was
always transmitting port 4110.
When trying for a free HTTP server port, sometimes bind() succeeds but listen()
fails with EADDRINUSE, so new logic to deal with that.
2012-07-12 12:10:59 +09:30
Jeremy Lakeman
ef8c1dd981
Simplify next interface tick calculation
2012-07-05 15:56:42 +09:30
Andrew Bettison
451e517c02
Clean up last #warning compiler message
2012-07-04 10:49:31 +09:30
Andrew Bettison
72769e162b
Replace overlay_render_sid_prefix() with alloca_tohex()
...
To eliminate timebomb bugs caused by rotor wraparound
2012-07-04 10:30:46 +09:30
Andrew Bettison
2c87039307
Replace overlay_render_sid() with alloca_tohex_sid()
...
To eliminate timebomb bugs caused by rotor wraparound
2012-07-03 17:59:30 +09:30
Andrew Bettison
78a8aaca16
Code improvements while debugging 'dnaprotocol' tests
...
Use ssize_t and size_t where required by system calls
More stringent checking of errors from system calls
Log the offset when writing to dummy interface file
Clean up many WHY/INFO/DEBUG statements
Convert many fprintf(stderr,...) to DEBUGF()
2012-07-03 15:36:51 +09:30
Andrew Bettison
8020ea3b74
Merge branch 'eventscheduler' into master
...
Conflicts:
commandline.c
monitor.c
overlay.c
overlay_interface.c
overlay_packetformats.c
rhizome_fetch.c
rhizome_http.c
rhizome_packetformats.c
serval.h
server.c
testdefs.sh
testframework.sh
tests/dnaprotocol
tests/server
2012-07-03 10:26:22 +09:30
Jeremy Lakeman
132d3a6f9b
rename profiling structure
2012-07-02 16:04:00 +09:30
Jeremy Lakeman
e705696896
separate statistics gathering from the scheduler structure
2012-07-02 15:20:30 +09:30
Jeremy Lakeman
89566e4d3d
Refactor how functions are scheduled or file handes are watched
2012-07-02 13:19:54 +09:30
Andrew Bettison
fc8df7d5d4
Config options for tick duration
2012-07-02 12:26:01 +09:30
Andrew Bettison
b9836af8a2
Fix debug logging in overlay_interface.c
...
Also fix bug that closed the logfile when forking the server process.
2012-06-28 17:34:21 +09:30
Andrew Bettison
a5ba1ecacd
Clean up debugging code
...
Only use DEBUG inside "if (debug & DEBUG_BLAH)", not INFO or WARN or WHY!
INFO messages for starting/stopping servald server.
2012-06-28 15:37:36 +09:30
Jeremy Lakeman
29cba17891
Fix rhizome transfers
2012-06-27 16:54:42 +09:30
gardners
1897aa2eef
only handle one packet per call to help stats gathering and fairness.
2012-06-25 15:46:34 +09:30
gardners
0c0e5b73e9
reduced debugging output.
2012-06-25 14:46:55 +09:30
gardners
3b6a004cc9
new event scheduler almost working, but after a while can stop
...
calling overlay_check_ticks alarm for some reason, which causes
queues to congest and bad things to generally happen.
2012-06-22 17:30:21 +09:30
gardners
3e88400e16
cleaned up some debugging.
2012-06-22 16:06:47 +09:30
gardners
895b5873f0
fixed bug cpu time wasting bug for dummynets.
2012-06-22 16:06:46 +09:30
gardners
b675e8eefd
removed debugging
2012-06-22 16:06:46 +09:30
gardners
91bccec71d
various fixes related to event scheduler.
...
server main loop is now just fd_poll()
2012-06-22 16:05:50 +09:30
gardners
7ea0c2f3bf
fixed bug in dummynet interface handling with new event scheduler.
2012-06-22 16:05:49 +09:30
gardners
5dc6d122a5
significant progress towards clean callback scheduler for poll()
...
events and timed callbacks.
2012-06-22 16:05:49 +09:30
gardners
2d718a297f
reversed changes that broke DNA tests. Improved dnaprotocol
...
test script slightly.
2012-06-21 17:02:36 +09:30
gardners
136a7bcf56
fixed bug with absolute-path dummynet files.
...
added pid of producer to dummynet packets.
2012-06-21 16:36:38 +09:30
gardners
5d3e9a21f7
fixed bug with interface specifications to allow - in dummynet paths.
2012-06-21 16:36:37 +09:30
gardners
500b9f9f28
fixed a memory leak, more to find.
2012-06-21 11:33:43 +09:30
Jeremy Lakeman
926d4296c4
Added overall timer for main loop, minor tweaks to order and freq. of processes
2012-06-21 11:33:43 +09:30
gardners
b48fdb6567
added deeper timing checks to reveal that rhizome advertisements
...
are the slowest part -- need to add caching of manifests so that
we don't hit the database every interface tick.
2012-06-21 11:33:43 +09:30
gardners
0dd5845cdd
added instrumentation to detect when servald spends more than 5ms doing
...
anything. Reports which bit of the overlay mesh main loop the time was
spent in, to help track it down.
2012-06-15 15:13:45 +09:30
Daniel O'Connor
e8c648c724
Remove reference to non existent variable.
2012-06-15 15:09:21 +09:30
Daniel O'Connor
c5a9321880
Improve debug output (translate IPs & ports into human readable things).
...
Revert change to use src_addr as this will break other platforms and needs more thought.
Reformat overlay_interface_discover.
2012-06-15 15:09:21 +09:30
Daniel O'Connor
c2411780a9
Cleanup overlay_check_ticks() and overlay_interface_register().
...
- Remove [f]printf()s.
- Reduce nested if's.
- Add glorious whitespace.
2012-06-08 18:29:27 +09:30
Daniel O'Connor
86c5e6945f
Don't force signedness for name in overlay_interface_register().
...
I can't see any point to forcing the signedness, it causes warnings on platforms with a signed-char by default.
2012-06-08 17:01:50 +09:30
Daniel O'Connor
ea9993dc91
Fix detection on OSX and make detection smarter.
...
- Fix lsif() on OSX.
- Make lsif() smarter and avoid non-broadcast and no AF_INET addresses.
- Don't run multiple interface detectors, run one at a time until one works.
- Factor out HAVE_IFADDRS_H code into a separate function into lsif.c with the other interface detection routines.
- Prefer HAVE_IFADDRS_H (random bias..)
2012-06-08 16:36:33 +09:30
Daniel O'Connor
8882515d03
Fix compilation on OSX.
...
- /proc/net/route is Linux only.
- lsif() will work anywhere SIOCGIFCONF is defined.
- Abstract namespace UNIX domain sockets are Linux only.
- Rework code to reduce indent levels.
2012-05-28 15:00:54 +09:30
gardners
30e53f963c
fixed various manifest synchronisation bugs, including probably
...
the main one that was stopping meshms (large manifests would
practically never get advertised under certain (common) conditions).
2012-05-27 08:31:48 +02:00
gardners
082b517fc9
improved debugging of interface connections.
2012-05-22 10:00:06 +09:30
gardners
4ddb7a5572
fixed bug in overlay_gettime_ms() (start time was 32bits not 64bits,
...
so strange behaviour resulted, breaking dna number lookup).
2012-05-18 12:55:15 +09:30
gardners
fa8825a3ec
try to reuse interface binding socket addresses instead of failing.
2012-05-17 13:14:16 +09:30
Andrew Bettison
f90b21ec78
Implement rhizome config options
...
rhizome.datastore_path - if not set, reverts to serval instance path
rhizome.enable - if not set, defaults to true
2012-05-15 12:56:10 +09:30
Andrew Bettison
d11258cefc
Overhaul debug flags
...
Config debug flags are now represented as individual items, eg:
servald config set debug.verbose yes
servald config set debug.rhizome yes
instead of aggregated, eg:
servald config set debug verbose,rhizome <-- no longer works
Added a debug flag "debug.all" that can be set and cleared, over which
individual flag sets/clears take priority.
Slimmed down dna.c by moving some globals and functions to the files where they
are used.
Default command line (help message) is now the new style, not the deprecated
style.
2012-05-14 18:37:32 +09:30
Andrew Bettison
e746557a08
Fix bug in overlay_gettime_ms()
...
The sequence start time was only getting set in overlay_interface_init(), which
was not always called, or was called after overlay_gettime_ms() had already
been used.
Added FATALF(), FATAL() and FATAL_perror() macros.
Removed a bunch of debug statements no longer needed in monitor.c and server.c.
2012-05-11 10:38:46 +09:30
Andrew Bettison
881576212c
Fix all trivial compiler warnings
2012-05-10 18:08:59 +09:30
Andrew Bettison
836f8332e8
Replace perror() with WHY_perror()
...
Puts more diagnostics to Android log
2012-05-08 14:53:34 +09:30
Andrew Bettison
cbc367b1f5
Rewrite server start/status/stop commands
...
Now correctly probes for server process existence using kill(pid, 0)
Status command does not dump config (use "config get" instead)
Output uses JNI cli output fields
Stop command uses 5 Hz wakeup, not busy wait while server exits
2012-05-07 13:49:38 +09:30
gardners
7b520e7a49
fixed various bugs with priorty dispatch of voice traffic.
...
some debug tweaking etc.
2012-05-07 08:31:53 +09:30
gardners
6718d06421
cleaned up debug output.
2012-05-04 02:40:54 +09:30
gardners
98ea86bde0
added new /proc/net/route method to find interfaces on android
...
(would you believe that using ifconfig to READ about interfaces
requires ROOT on android).
should also help for interfaces with multiple addresses.
2012-05-03 22:46:00 +09:30
gardners
82ca3dde5d
impoved debugging and operation of interface detection
...
(since it has suddenly decided to fail)
2012-05-03 17:15:05 +09:30
gardners
c9e429e36b
and another fd leak.
2012-05-02 02:33:38 +09:30
gardners
cf500085b4
fixed file descriptor leak when trying to bind to an interface.
2012-05-02 02:32:37 +09:30
gardners
da494c7124
removed debugging output
2012-05-01 05:26:28 +09:30
gardners
c9863fe11e
lots of fixes to get overlay mesh routing working on linux with
...
real network interfaces and no dummy interfaces. neighbour discovery
now seems to work.
2012-04-29 11:56:47 +09:30
gardners
5497b8fd0d
fixed broadcast listening bug.
2012-04-28 15:20:06 +09:30
gardners
4c498afd19
changed macro used to select interface listing code
2012-04-28 12:29:29 +09:30
gardners
2ab32197a7
Put new linux-specific interface listing routine in that is needed
...
for android, where the portable method isn't easily available.
2012-04-28 12:25:19 +09:30
gardners
ec94f6c12f
fixed bug in queue handling.
...
removed some debugging.
2012-04-20 19:26:25 +09:30
gardners
5c52c8e274
trying to find memory corruption bug, probably queue handling
...
related.
2012-04-20 17:14:04 +09:30
gardners
e7e8b2d630
fixed bug in RFS size patching.
...
A lot of debug output tweaks to track the problem down.
2012-04-16 06:06:43 +09:30
gardners
b55f945133
fixed packet dequeue bug (mdp ping has no duplicate replies now).
...
cleaned up debug output.
2012-04-15 00:02:54 +09:30
gardners
2581e9fe4c
Revamped dequeuing of TXd frames.
...
Now almost works (queues don't stay full of junk), although
mdp ping still gets a duplicate reply for 2-hop pings.
2012-04-14 23:12:45 +09:30
gardners
c37d83bddd
forwarding of overlay frames substantially in place, but requires
...
testing.
2012-04-14 10:56:03 +09:30
gardners
02e1b0f723
fixed bugs in dequeuing (or lack thereof) of broadcast frames and
...
unicast frames at the right time.
2012-04-14 10:14:43 +09:30
gardners
9398f94a22
Cleaned up debug output.
2012-04-14 09:39:14 +09:30
gardners
ca7924f134
Removed debugging output.
2012-04-14 09:35:35 +09:30
gardners
d808534a1e
Fixed some comments to make code easier to follow, and remove a
...
note for an issue that has been fixed.
2012-04-14 06:59:12 +09:30
gardners
283b29af6b
Improved packet tx and rx debugging and made it more logical.
2012-04-14 06:38:11 +09:30
gardners
167c59d50d
Added debug option to suppress rhizome traffic to make it easier
...
to see what is going on.
Similarly there is now a debug option to show outgoing packets.
2012-04-14 06:26:20 +09:30
gardners
0cb3e6e60b
Added code to properly direct both broadcast and unicast packets
...
to the correct interface(s). An issue with the node lookup is
preventing it from working at present, however.
2012-04-14 04:05:05 +09:30
Andrew Bettison
a338c2f0f9
Refactor instance path handling
...
- handle buffer limits when forming path names within instance dir
- uniform use of serval_instancepath()
2012-03-29 14:07:07 +10:30
gardners
6759a26720
Cleaned out some debugging output after tracking down and fixing
...
memory corruption bug. Next challenge is to find out why broadcast
MDP packets are not getting dispatched properly (is trying to treat
broadcast address as unicast address it seems).
2012-03-23 07:06:57 +10:30
gardners
13d1d3084e
Various fixes to track down memory handling bugs.
...
Fixed one free-before-time bug with queuing MDP frames.
Some heap corruption bug seems to remain.
2012-03-22 16:33:25 +10:30
gardners
c7dd475d50
Further work on MDP, including dispatching low-priority data when
...
it can fit in frames. A nasty bug in queue code needs fixing.
Also, we only send tick frames at present, and need to add code
for dispatching packets at other times (bandwidth allowance permitting).
So the whole bandwidth management code needs to get finished.
2012-03-22 08:26:19 +10:30
gardners
70497df7b5
More work on MDP. Removed some debug fluff.
...
Added framework for MDP ping, and some work towards MDP port binding
and sending packets with option to wait for reply. MDP server
doesn't yet support port binding, and client doesn't yet support
reading replies.
2012-03-19 16:06:34 +10:30
gardners
1eb4c34015
Renamed mphlr.h to serval.h
...
(also some temporary debugging has been added in some places)
2012-02-23 12:45:42 +10:30
gardners
6397fa70d9
overlay interface file descriptors now marked close-on-exec so that
...
if we get a sigabort or segmentation violation and restart ourselves,
we don't wind up with stuck/lost sockets.
2012-02-23 11:57:46 +10:30
gardners
5cc6079c0f
Move from recvfrom() to recvmsg() so that we can get packet TTLs on
...
reception. Other changes associated with overlay mesh.
2012-02-05 16:15:19 +10:30
gardners
f862ba0af6
Rhizome file transfer via http getting close
...
(send side needs to send file body)
2012-01-13 17:21:06 +10:30
gardners
7bcc852279
Fixed bug with non-blocking call to connect() for integrated http client.
...
Cleaned up some debugging stuff.
2012-01-12 17:02:22 +10:30
gardners
bf9f8559f1
Various debug fiddles and conversion from select() to poll()
...
(although poll() still doesn't let us monitor ordinary files
which is silly.)
2012-01-12 16:47:24 +10:30
gardners
cb174a71f6
fixed queue management bugs.
2012-01-10 18:31:14 +10:30
gardners
44c0765981
Various debugging code cleanups.
...
Fixed some address resolution bugs (for when sender address is not
fully known).
There is still a bug in dequeuing packets though it seems.
2012-01-10 17:21:26 +10:30
gardners
800f8d41eb
Revamped debug/verbosity control to use flags for functions of interest
...
instead of general verbosity ramp.
2012-01-10 15:56:40 +10:30
gardners
3b6ce80f7e
Fixed cpu eating bug due to time calculation based on wrong epoch.
2012-01-10 14:11:54 +10:30
gardners
9156a68c7f
Added 2nd implementation of serval packet decoder for aiding debugging
...
of packet formation and decoding.
Fixed time calculation bug (duplicate time functions based off different
epochs).
Various debugging fiddles and tweaks.
2012-01-10 14:05:26 +10:30
gardners
23ee957169
Various minor tweaks to debugging and related things.
...
Fixed major memory handling error in neighbour structure allocation.
2012-01-09 16:28:44 +10:30
gardners
ba645687f6
Progress towards overlay mode advertising rhizome bundles.
...
(but some evil memory corruption error if overlay mode and
rhizome are both enabled.)
2012-01-09 04:57:13 +10:30
gardners
0868e30caa
Fixed issues with recognition of valid packet formats.
2012-01-09 04:30:23 +10:30
gardners
f0d5cd172e
Fixed responding to legacy requests from overlay mode.
2012-01-09 04:19:52 +10:30
gardners
16fb3a3f61
Added missing GPL license statements.
2011-12-21 20:25:05 +10:30
gardners
8aa57edee3
Added code to add node advertisements to interface tick packets.
...
Looks like it works. No code to decode it yet.
2011-09-13 04:52:52 +09:30
gardners
26f0b36fa1
Added framework for advertising node reachability.
2011-09-13 03:33:45 +09:30
gardners
a91c5d29c3
added code to display overlay mesh route table (incomplete)
...
fixed bug with recording routes from packets with unresolvable addresses.
2011-09-12 23:49:55 +09:30
gardners
b6ce25ab24
Believe I have found and stemmed the memory corruption bug, although
...
the trigger (poor packet header decoding/address extraction) remains.
2011-09-07 11:26:26 +09:30
gardners
7947485705
Android JNI/NDK build bug fixes suggested by Kris.
2011-09-05 15:01:14 +09:30
gardners
67e822f1ff
Fixed timing out of queued frames.
2011-09-05 13:19:00 +09:30
gardners
37c0955494
More little fixes, especially initialising of overlay_buffers in
...
overlay_payload structures.
2011-09-05 12:34:54 +09:30
gardners
cbb1939241
Fixed various compiler warnings.
...
Change overlay_frame payload to use an overlay_buffer structure for
consistency and ease of payload construction.
Added some sanity checking to peer score calculation.
Getting closer to being able to TX acks to selfannouncements.
Other little things to accomplish these.
2011-09-05 12:19:53 +09:30
gardners
1d6d744067
More work towards overlay mesh.
...
Added single byte append to overlay_buffer type.
Added source interface to self-announce packets.
Probably other stuff, too.
2011-09-04 06:36:39 +09:30
gardners
32a5f03073
Various single-instance variable processing fixes for DNA.
...
Further work on overlay mesh routing.
2011-08-29 16:20:27 +09:30
gardners
857bf9c11e
All interfaces now use a common synchronised tick-clock so that we can
...
more easily keep track of node reachability.
2011-08-20 19:06:15 +09:30
gardners
b075b51c43
Merged overlay_payload and overlay_frame structures to just overlay_frame
...
which is now used for both encapsulation and decapsulation.
Improved payload length encoding scheme to be shorter for most payload
lengths.
selfannouncement frames now get directed to stub functions for
implementation.
2011-08-17 10:52:17 +09:30
gardners
cf778e1efd
Various further work on overlay mesh.
...
Now resolves some kinds of abbreviated address, and queues up
the need to remind peers of abbreviation schemes it does not support.
2011-08-15 12:51:00 +02:00
gardners
9d4666f9d4
Work towards address abbreviation framework.
2011-08-14 17:58:27 +02:00
gardners
0cf6e545c4
Fixed select() problems with dummy interfaces and EOF reporting.
...
Dummy interfaces now work.
Supressed lots of debug messages.
2011-08-14 10:36:39 +02:00
gardners
ec1fe22e93
Added support for using a dummy interface to allow testing of multiple mesh
...
nodes on the same machine. Also handly for linking to unusual interfaces
such as the UHF radio dongles we are planning.
2011-08-13 13:17:49 +02:00
gardners
c8229c8517
More work towards handling overlay or DNA packets.
...
handling of sender address and sockets to use is still a big fat mess
and likely to be broken.
2011-08-12 21:34:38 +02:00
gardners
7e30d62b79
Cleaned up various compiler warnings. Added packet parser framework for
...
handling overlay frames.
2011-08-12 21:05:11 +02:00
gardners
9108fd5c59
Broadcast on each interface now works, at least for OSX.
2011-08-12 09:58:25 +02:00
gardners
b8e8a78828
Revamped interface management code for overlay mode.
...
Now just specify list of interfaces and their characteristics.
Addresses get configured automatically.
2011-08-12 09:47:29 +02:00
gardners
5f1f510be5
overlay mesh now sends basic self-announcements.
2011-08-12 08:34:56 +02:00
gardners
2ff8541049
Woot! overlay mode now emits regular tick frames on interfaces it knows about.
...
Still doesn't know about broadcast properly or a pile of other things, oh, and
the frames are completely empty, but none the less, we are now sending frames.
2011-08-09 12:45:24 +08:00
gardners
92768cdcd0
core of overlay mode getting closer.
...
Compiles. With -N start to try to send regular packets.
2011-08-08 22:41:46 +08:00
gardners
6e172c76c9
Fixed broadcast address discovery to work on Mac.
...
Fixed Linux assumptions.
Added parsing of overlay mesh interface specification from command line.
Separated overlay mesh code out into several files.
Overlay mesh is still far from working, but the infrastructure is coming together.
2011-08-08 16:11:05 +09:30