1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00
Commit Graph

233 Commits

Author SHA1 Message Date
Jelmer Vernooij
d4de4c2d21 r12608: Remove some unused #include lines.
(This used to be commit 70e7449318)
2007-10-10 13:49:03 -05:00
Jelmer Vernooij
2cd5ca7d25 r12542: Move some more prototypes out to seperate headers
(This used to be commit 0aca5fd513)
2007-10-10 13:47:55 -05:00
Jelmer Vernooij
acd6a086b3 r12510: Change the DCE/RPC interfaces to take a pointer to a
dcerpc_interface_table struct rather then a tuple of interface
name, UUID and version.

This removes the requirement for having a global list of DCE/RPC interfaces,
except for these parts of the code that use that list explicitly
(ndrdump and the scanner torture test).

This should also allow us to remove the hack that put the authservice parameter
in the dcerpc_binding struct as it can now be read directly from
dcerpc_interface_table.

I will now modify some of these functions to take a dcerpc_syntax_id
structure rather then a full dcerpc_interface_table.
(This used to be commit 8aae0f168e)
2007-10-10 13:47:48 -05:00
Jelmer Vernooij
d8e35f8828 r12498: Eliminate INIT_OBJ_FILES and ADD_OBJ_FILES. We were not using
the difference between these at all, and in the future the
fact that INIT_OBJ_FILES include smb_build.h will be sufficient to
have recompiles at the right time.
(This used to be commit b24f2583ed)
2007-10-10 13:47:45 -05:00
Stefan Metzmacher
a5b6b170a3 r12265: as all server_service modules are specified in smbd/config.mk
follow this rule for the winbind one too

metze
(This used to be commit 2ace7e0d2d)
2007-10-10 13:47:25 -05:00
Andrew Tridgell
111a920fdb r12116: got rid of composite_trigger_done() and composite_trigger_error(), and
instead make the normal composite_done() and composite_error()
functions automatically trigger a delayed callback if the caller has
had no opportunity to setup a async callback

this removes one of the common mistakes in writing a composite function
(This used to be commit f9413ce792)
2007-10-10 13:47:11 -05:00
Stefan Metzmacher
150848248a r12014: free the irpc_request structure with the irpc_call_recv functions,
to match all other _recv functions we have

metze
(This used to be commit bd4f85ab5f)
2007-10-10 13:46:59 -05:00
Tim Potter
b9b59fa798 r11968: More warning fixes. We're on track to getting to double digits for
the number of warnings generated now.
(This used to be commit d479f2d760)
2007-10-10 13:46:52 -05:00
Stefan Metzmacher
a1c8fe7ce2 r11828: split out the async helper function into a new subsystem WB_HELPER
to use it in torture tests too

metze
(This used to be commit 364b092355)
2007-10-10 13:46:35 -05:00
Volker Lendecke
ddc632378a r11825: Fix a debug msg
(This used to be commit fc6458d0d4)
2007-10-10 13:46:35 -05:00
Volker Lendecke
a6852523d6 r11812: Convert winbind to the async bind routines. Also remove tridge's hack for the
winbind "bug" :-)

Volker
(This used to be commit fb9a3c7ef3)
2007-10-10 13:46:32 -05:00
Volker Lendecke
f2dedc629c r11809: Make dcerpc_bind_auth async.
This also removes dcerpc_bind_auth_password, the only user of
dcerpc_bind_auth. And this was not only passwords anyway.

Andrew Bartlett, as usual: Please take a close look.

Thanks,

Volker
(This used to be commit 2ff2dae3d0)
2007-10-10 13:46:31 -05:00
Volker Lendecke
f7732560ee r11727: Minor cleanup
(This used to be commit 681451af72)
2007-10-10 13:46:18 -05:00
Tim Potter
0eeedb97a5 r11626: Fix unhandled enum in case statement warnings by noting appropriately
that some values aren't handled.  The remaining warnings I think are
actual bugs or required functionality that is missing (mostly lack of
server side Unix extensions).
(This used to be commit 03c7da27a0)
2007-10-10 13:46:01 -05:00
Volker Lendecke
69307693dc r11528: Separate finding dcs from initializing a domain. Makes it easier to possibly
support cldap and other stuff in the future.

This temporarily disables wbinfo -t, but that will come back soon.

Try an ldap bind using gss-spnego. This got me krb5 binds against "our" w2k3
and a trusted w2k, although with some memleaks from krb5 and a BAD_OPTION
tgs-rep error.

Volker
(This used to be commit d14948fdf6)
2007-10-10 13:45:49 -05:00
Volker Lendecke
6b6a739eca r11517: Cleanup time, this looks larger than it is. This mainly gets rid of
wb_domain_request, now that we have queued rpc requests.

Volker
(This used to be commit 848522d1b6)
2007-10-10 13:45:47 -05:00
Volker Lendecke
4bb85c2939 r11423: Add some TALLOC_CTX
(This used to be commit a043ef33dc)
2007-10-10 13:45:36 -05:00
Volker Lendecke
5ca7979b2c r11422: Remove unused args
(This used to be commit d5aef4e2f9)
2007-10-10 13:45:35 -05:00
Andrew Bartlett
55c6d93184 r11413: More comments, plus always check (and update) the credentials chain,
regardless the authentication result on a particular user.

Andrew Bartlett
(This used to be commit 2ee7ed000e)
2007-10-10 13:45:34 -05:00
Andrew Bartlett
ceff9881e4 r11412: These comments may not be much, but my eyes scan code with even
minimal comments much better (much like volker scans code of less than
80 cols better ;-)

Andrew Bartlett
(This used to be commit 8800e9b5b0)
2007-10-10 13:45:34 -05:00
Andrew Bartlett
0f44011f6f r11411: Add to Samba4 the Samba3 patch I just posted for machine account
logins (changing the winbindd interface).

Clean up the wbsrv_samba3_async_epilogue() handling, as it was mixing
auth and other replies, such that all replies were having the auth
error strings set.  We now do a better job of filling in the right
errors in the right places.

Andrew Bartlett
(This used to be commit 8ed975df52)
2007-10-10 13:45:33 -05:00
Andrew Bartlett
17f8b87cb0 r11374: On request from VL, put the plaintext auth patch in.
I still have some gremlins that get in the my way in testing this.

Andrew Bartlett
(This used to be commit 3353e906ad)
2007-10-10 13:45:28 -05:00
Stefan Metzmacher
228e07a6fe r11276: fix compiler warnings
metze
(This used to be commit 2f1930fb62)
2007-10-10 13:45:12 -05:00
Volker Lendecke
d6e070b74a r11274: Start a connection attempt to the DC's port 389. To do this properly, make
socket_connect and ldap_connect properly async.

Volker
(This used to be commit bcc71fc1de)
2007-10-10 13:45:12 -05:00
Volker Lendecke
28a3bc645b r11267: Fix a memleak and an uninitialized variable. Andrew Bartlett, this was the one
I sent to you. Sorry for bothering you.

Volker
(This used to be commit 3a9f2291ae)
2007-10-10 13:45:10 -05:00
Volker Lendecke
e2e2bb9245 r11263: Some cleanup
(This used to be commit 4fe3c9871b)
2007-10-10 13:45:10 -05:00
Jelmer Vernooij
4c5a4a7e02 r11244: Relative path names in .mk files
(This used to be commit 24e1030090)
2007-10-10 13:45:06 -05:00
Jelmer Vernooij
f4d590662e r11214: Remove scons files (see http://lists.samba.org/archive/samba-technical/2005-October/043443.html)
(This used to be commit 7fffc5c917)
2007-10-10 13:45:03 -05:00
Volker Lendecke
1e60499880 r11193: Implement wbinfo -m
(This used to be commit 12a800bc85)
2007-10-10 13:44:59 -05:00
Volker Lendecke
0e6fefac49 r11192: Too many contexts around... :-)
(This used to be commit 134e104c3f)
2007-10-10 13:44:59 -05:00
Volker Lendecke
0f51ae83f0 r11181: Implement wbinfo -s and wbinfo --user-sids. The patch is so large because
--user-sids required the extension to trusted domains.

Implement "winbind sealed pipes" parameter for debugging purposes.

Volker
(This used to be commit 3821a17bdb)
2007-10-10 13:44:57 -05:00
Volker Lendecke
d68319431e r11095: Implement wb_getuserdomgroups.
Tridge, if you have the time, you might want to look at a problem I'm having
with unix domain stream sockets. From a comment in this commit:

	/* Using composite_trigger_error here causes problems with the client
	 * socket. Linux 2.6.8 gives me a ECONNRESET on the next read after
	 * writing the reply when I don't wait the 100 milliseconds. */

This is in winbind/wb_cmd_userdomgroups.c:93.

The problem I have is that I can not *immediately* send an error reply to the
client because the next receive fails. Waiting 100 milliseconds helps. It
might also be a problem with epoll(), I don't really know.

I'd appreciate if you took a brief look at this, maybe I'm doing something
wrong.

Thanks,

Volker
(This used to be commit 3e535cce74)
2007-10-10 13:44:48 -05:00
Volker Lendecke
17355fbbd4 r11094: Connect to SAM, implement getdcname
(This used to be commit a14398715e)
2007-10-10 13:44:48 -05:00
Volker Lendecke
42ececdfae r11093: Implement wb_queue_domain_send: If the domain is not yet initialized, do that
first. And if a request is being processed, queue it. This correctly survived
3 endless loops with wbinfo's doing different things while starting up smbd.

The number of indirections starts to become a bit scary, but what can you do
without a decent programming language that provides closures :-)

One thing that we might consider is to auto-generate async rpc requests that
return composite_context structs instead of rpc_requests. Otherwise I'd have
to write a lot of wrappers like composite_netr_LogonSamLogon_send.

The alternative would be to write two versions of wb_queue_domain_send which I
would like to avoid. This is cluttered enough already.

Volker
(This used to be commit 66c1b674f9)
2007-10-10 13:44:48 -05:00
Volker Lendecke
d102d5ab57 r11082: Fix a segfault
(This used to be commit 576a724bf1)
2007-10-10 13:44:45 -05:00
Volker Lendecke
0aa0c5340f r11070: Fix a cut&paste error, now wbinfo can properly separate domain and user...
Volker
(This used to be commit 6e4f774a49)
2007-10-10 13:44:44 -05:00
Volker Lendecke
207a6bf397 r11068: Fix pam_auth_crap, remove the sync code. I don't know what it was when I
tested it, but I can not reproduce the problem I had with abartlett's initial
implementation anymore.

Fix a bug found using valgrind.

Volker
(This used to be commit 0c6c71ae3c)
2007-10-10 13:44:44 -05:00
Volker Lendecke
0a82914049 r10941: Hmmm. Making that fn static is more correct.
(This used to be commit eaf347bdea)
2007-10-10 13:39:44 -05:00
Volker Lendecke
67580434cf r10936: Commit work in progress: wb_pam_auth_crap made async. This does not work yet,
but the version before did not either, so we're not worse than before.

One thing this does better is to call the domain init code if it's not there
yet.

Volker
(This used to be commit 35bcfb185b)
2007-10-10 13:39:44 -05:00
Volker Lendecke
d617556ef5 r10878: Reply to some comments by tridge and metze:
* rename the composite helper functions from comp_* to composite_*

* Move the lsa initialization to wb_connect_lsa.c

* Equip smb_composite_connect with a fallback_to_anonymous

The latter two simplify wb_init_domain.c quite a bit.

Volker
(This used to be commit deb127e04e)
2007-10-10 13:39:39 -05:00
Volker Lendecke
8a3c865581 r10859: Make the flow a bit clearer
(This used to be commit 66c90483b4)
2007-10-10 13:39:37 -05:00
Volker Lendecke
12fb2fc09e r10853: Convert wbinfo -n to properly init the domain.
Volker
(This used to be commit 512ae49270)
2007-10-10 13:39:36 -05:00
Volker Lendecke
9e5d44d567 r10852: Continuation-based programming can become a bit spaghetti...
Initialize a domain structure properly. Excerpt from wb_init_domain.c:

/*
 * Initialize a domain:
 *
 * - With schannel credentials, try to open the SMB connection with the machine
 *   creds. Fall back to anonymous.
 *
 * - If we have schannel creds, do the auth2 and open the schannel'ed netlogon
 *   pipe.
 *
 * - Open LSA. If we have machine creds, try to open with ntlmssp. Fall back
 *   to schannel and then to anon bind.
 *
 * - With queryinfopolicy, verify that we're talking to the right domain
 *
 * A bit complex, but with all the combinations I think it's the best we can
 * get. NT4, W2k3SP1 and W2k all have different combinations, but in the end we
 * have a signed&sealed lsa connection on all of them.
 *
 * Is this overkill? In particular the authenticated SMB connection seems a
 * bit overkill, given that we do schannel for netlogon and ntlmssp for
 * lsa later on w2k3, the others don't do this anyway.
 */

Thanks to Jeremy for his detective work, and to the Samba4 team for providing
such a great infrastructure.

Next step is to connect to SAM. Do it via LDAP if we can, fall back to samr
with all we have.

Volker
(This used to be commit 3e69fdc07c)
2007-10-10 13:39:36 -05:00
Volker Lendecke
b468ba1386 r10846: Create a "wbsrv_domain", change wb_finddcs to the style of the rest of the
async helpers.

Volker
(This used to be commit 10585ba4e8)
2007-10-10 13:39:35 -05:00
Andrew Bartlett
bc42531213 r10844: Add challenge-response authentication to Samba4's winbindd for VL.
Plaintext should be simple, but I'm going to do some infrustructure
work first.

Andrew Bartlett
(This used to be commit c9273729e4)
2007-10-10 13:39:35 -05:00
Volker Lendecke
5952157ad2 r10843: Reformatting
(This used to be commit ecaa70f63b)
2007-10-10 13:39:34 -05:00
Volker Lendecke
c8cb36f08d r10838: Get us an schannel'ed netlogon pipe.
Abartlet, now I think I need some assistance to implement the pam auth & crap
auth calls.

Volker
(This used to be commit 90a30c8b65)
2007-10-10 13:39:34 -05:00
Volker Lendecke
e0c11738ae r10834: Work in progress on winbind. With some helper routines the composite functions
start to look sane.

Question: What about providing all winbind commands as irpc interfaces that
are called from the samba3 compatibility layer? This way it would be easy for
other samba components to access its functionality. Does that make sense?

Volker
(This used to be commit 2a6b805385)
2007-10-10 13:39:33 -05:00
Volker Lendecke
b1b6eb7b67 r10825: Complete wbinfo -n
(This used to be commit 1afa893506)
2007-10-10 13:39:32 -05:00
Andrew Tridgell
2c3e4bdadf r10704: don't try to free the netlogon pipe twice
(This used to be commit 2c3a9f04db)
2007-10-10 13:39:22 -05:00
Andrew Tridgell
6bc8d37c20 r10700: removed volkers temporary timer hack now that freeing the netlogon
pipe is safe while inside a rpc callback
(This used to be commit 5d752a5194)
2007-10-10 13:39:21 -05:00
Volker Lendecke
012893cb42 r10691: This gets half-way to wbinfo -n. It acquires an lsa pipe, and does a
queryinfopolicy. Idea is to get a consistency check between that and our
notion of the domain name and sid, and take the lsa pipe as the holder of the
central smbcli_tree that netlogon and samr use as well.

Volker
(This used to be commit 126c80aefc)
2007-10-10 13:39:19 -05:00
Volker Lendecke
3fece92b9d r10687: Another one...
(This used to be commit d18f7edf92)
2007-10-10 13:39:19 -05:00
Volker Lendecke
788129610b r10686: Fix the build
(This used to be commit a7137fd3ec)
2007-10-10 13:39:19 -05:00
Volker Lendecke
ea262d130b r10685: Why wait 5 seconds...
(This used to be commit 820b4180dd)
2007-10-10 13:39:18 -05:00
Volker Lendecke
faf2ad667a r10684: Add a nasty hack for the failure case of wbinfo -t. Tridge has a proper fix
for it pending.

Also fix a bug with timed events: Don't call the same event recursively in the
handler's inner semi-async event loop.

Volker
(This used to be commit e38e50127a)
2007-10-10 13:39:18 -05:00
Volker Lendecke
e5c6a3e361 r10683: Samba3's wbinfo -t should give the correct answer now.
Tridge, if you have time, you might want to look at the segfault I was still
seeing. Now I store the handle to the netlogon pipe in the global winbind
state and free it on the next entry into check_machacc. The problem seems to
be that talloc_free()ing a pipe struct from within a callback function on that
pipe is not possible. I think I can live with that, but it has been not really
obvious. To reproduce the segfault you might want to look at putting a
talloc_free(state->getcreds->out.netlogon) into
wbsrv_samba3_check_machacc_receive_creds. This is called from a dcerpc
callback function.

In particular if the check failed it would be nice if I could delete the pipe
directly and not post a different event to some winbind queue.

I tried to delete the pipe from a timed event triggered immediately, but this
also fails because the inner loop seems to hit the same event again, calling
it twice.

Volker
(This used to be commit 5436d77648)
2007-10-10 13:39:18 -05:00
Volker Lendecke
68c70ef396 r10677: Add smb_composite_connectmulti: Send out multiple SYN packets at once, use the
first one that replies correctly.

Add a talloc context to smb_composite_connect()

Volker
(This used to be commit 6b88de182e)
2007-10-10 13:39:17 -05:00
Volker Lendecke
33834e2dda r10675: Connect to the DC's IPC$
Volker
(This used to be commit c755788484)
2007-10-10 13:39:17 -05:00
Jelmer Vernooij
5058f4b9e8 r10586: Add MergedObject() builder. Default to Library() rather
then StaticLibrary()
(This used to be commit b53313dc51)
2007-10-10 13:39:08 -05:00
Stefan Metzmacher
98a7da2348 r10508: - implement WINBINDD_NETBIOS_NAME, WINBINDD_DOMAIN_NAME and WINBINDD_INFO
is there a way to test this calls?

vl: please review this

metze
(This used to be commit 85d4565fce)
2007-10-10 13:38:58 -05:00
Stefan Metzmacher
4b30e2bff7 r10506: set return data correctly
metze
(This used to be commit 37b5f6b417)
2007-10-10 13:38:57 -05:00
Stefan Metzmacher
ab4d635b92 r10504: - seperate implementation specific stuff, from the generic composite
stuff.
- don't use SMBCLI_REQUEST_* state's in the genreic composite stuff
- move monitor_fn to libnet.

NOTE: I have maybe found some bugs, in code that is dirrectly in DONE or ERROR
      state in the _send() function. I haven't fixed this bugs in this
      commit! We may need some composite_trigger_*() functions or so.
      And maybe some other generic helper functions...

metze
(This used to be commit 4527815a0a)
2007-10-10 13:38:57 -05:00
Volker Lendecke
9593101ec1 r10491: First step towards wbinfo -t: This issues a name request for the primary
domain and gets the DC's name via a mailslot call.

Metze, I renamed wbsrv_queue_reply to wbsrv_send_reply in accordance with
irpc_send_reply. Having _queue_ here and _send_ there is a bit confusing. And
as everything is async anyway, the semantics should not be too much of a
problem.

Volker
(This used to be commit 4637964b19)
2007-10-10 13:38:54 -05:00
Jelmer Vernooij
f3b412fbd6 r10438: Move portability functions to lib/replace/; replace now simply ensures
that a given set of (working) POSIX functions are available (without
prefixes to their names, etc). See lib/replace/README for a list.

Functions that behave different from their POSIX specification
(such as sys_select, sys_read, etc) have kept the sys_ prefix.
(This used to be commit 29919a7105)
2007-10-10 13:38:45 -05:00
Stefan Metzmacher
f59d435127 r10435: fill in the reference to the generic wbsrv_call in the wbsrv_samba3_call,
so that async function can use it.

metze
(This used to be commit 72302b5d3d)
2007-10-10 13:38:45 -05:00
Stefan Metzmacher
fdeff0fa50 r10434: add a short path to the event context that should be used for async replies
metze
(This used to be commit cc9579d085)
2007-10-10 13:38:45 -05:00
Stefan Metzmacher
bcf0615be5 r10426: - restructure the winbind server code a bit
- remove the echo test stuff
- abstract out the used protocol
- we have a seperate handler for the samba3 protocol now
- the backend can easy do async replies
  by setting WBSRV_CALL_FLAGS_REPLY_ASYNC in wbsrv_call
  and then call wbsrv_queue_reply() later

metze
(This used to be commit 32f3e68a56)
2007-10-10 13:38:44 -05:00
Volker Lendecke
0e2c62451d r10365: Use nsswitch/winbindd_nss.h in winbind/, update that file to the current 3_0
interface.

Volker
(This used to be commit 90f98e9be3)
2007-10-10 13:38:31 -05:00
Volker Lendecke
9a1ceab6d6 r10363: Nobody loudly screamed "noo", so commit the samba3 winbind interface to
samba4. Ok, maybe the silence is due to timezones, but what can you do... ;-)

Volker
(This used to be commit 9a5d8f55ab)
2007-10-10 13:38:31 -05:00
Jelmer Vernooij
6812c73534 r10348: Add scons scripts for remaining subsystems. Most subsystems build now,
but final linking still fails (as does generating files asn1, et, idl and proto
files)
(This used to be commit 4f0d7f75b9)
2007-10-10 13:38:30 -05:00
Stefan Metzmacher
a8ec371a61 r10078: - add a 'struct data_blob_list_item'
- use this for the send_queue's of the different stream_servers
  to not redefine the same struct so often, and it maybe will be used
  in other places too

metze
(This used to be commit b6694f067a)
2007-10-10 13:37:51 -05:00
Andrew Tridgell
b3e493470f r7911: task_terminate() is defined in the macosx headers, so change the name
to task_server_terminate()
(This used to be commit a7447e25ac)
2007-10-10 13:18:48 -05:00
Jelmer Vernooij
66a52992ff r7850: Support mkdir() with just one parameter. Patch from
Steven Edwards <steven_ed4153@yahoo.com>.

I've moved the Win32-specific tests to win32.m4 so it does not
make any of the POSIX configure stuff more complicated.
(This used to be commit bf85fdd015)
2007-10-10 13:18:42 -05:00
Andrew Tridgell
bed7c9ec32 r5304: removed lib/socket/socket.h from includes.h
(This used to be commit b902ea546d)
2007-10-10 13:09:39 -05:00
Andrew Tridgell
35537c1255 r5302: fixed a compilation problem on solaris caused by the recent include
changes
(This used to be commit e7e015f79b)
2007-10-10 13:09:39 -05:00
Andrew Tridgell
e82aad1ce3 r5298: - got rid of pstring.h from includes.h. This at least makes it a bit
less likely that anyone will use pstring for new code

 - got rid of winbind_client.h from includes.h. This one triggered a
   huge change, as winbind_client.h was including system/filesys.h and
   defining the old uint32 and uint16 types, as well as its own
   pstring and fstring.
(This used to be commit 9db6c79e90)
2007-10-10 13:09:38 -05:00
Andrew Tridgell
131dc76d56 r5197: moved events code to lib/events/ (suggestion from metze)
(This used to be commit 7f54c8a339)
2007-10-10 13:09:30 -05:00
Andrew Tridgell
0798d54b4f r5195: most events don't need the time of the event, so save a gettimeofday() call
and just use timeval_current() when its actually needed
(This used to be commit 236403cc4d)
2007-10-10 13:09:30 -05:00
Andrew Tridgell
66170ef8b3 r5185: make all the events data structures private to events.c. This will
make it possible to add optimisations to the events code such as
keeping the next timed event in a sorted list, and using epoll for
file descriptor events.

I also removed the loop events code, as it wasn't being used anywhere,
and changed timed events to always be one-shot (as adding a new timed
event in the event handler is so easy to do if needed)
(This used to be commit d7b4b6de51)
2007-10-10 13:09:29 -05:00
Andrew Tridgell
26bf3063d3 r5122: fixed name of winbind stream ops
(This used to be commit 984c737c1b)
2007-10-10 13:09:24 -05:00
Andrew Tridgell
1447b9a8c1 r5104: - added support for task based servers. These are servers that within
themselves are run as a single process, but run as a child of the
  main process when smbd is run in the standard model, and run as part
  of the main process when in the single mode.

- rewrote the winbind template code to use the new task services. Also
  fixed the packet queueing

- got rid of event_context_merge() as it is no longer needed
(This used to be commit 339964a596)
2007-10-10 13:09:23 -05:00
Stefan Metzmacher
76b38d11fd r4729: add dummy "winbind" service
- this creates a new task and then starts a process_model "single"
  with service "winbind_task"

- that means with -M single everything is in one process

  with - M standard winbind is a seperate process but didn't fork for each connection
  with -M thread winbind is a seperate thread but didn't thread for each connection

- the dummy server listen s on /tmp/.winbind/echo
  and for better testing with telnet also on 127.0.255.1 port 55555

metze
(This used to be commit 5190f60ded)
2007-10-10 13:08:49 -05:00