Re: cvs: /php3/functions imap.c
| From: | Thies C. Arntzen | Date: | Wed, 03 Nov 1999 21:15:14 +0000 |
| Subject: | Re: cvs: /php3/functions imap.c | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-12106@lists.php.net to get a copy of this message | ||
On Wed, 3 Nov 1999, Mark Musone wrote:
> i had rasmus specifically wait a day so we could get this in..
> it's all seperated in #ifdefs, so the majority of people wont even be
> coming close to this code...
ok -
i nearly "f... up" a release once with a last minute change - so i'm a bit
worried...
tc
>
>
> Mark
>
>
> > andrew,
> >
> > please don't break anything - we had planned to release 3.0.13 tomorrow...
> >
> > tc
> >
> >
> > On Wed, 3 Nov 1999, Andrew Skalski wrote:
> >
> > > askalski Wed Nov 3 11:02:04 1999 EDT
> > >
> > > Modified files:
> > > /php3/functions imap.c
> > > Log:
> > > more work on persistent imap connections
> > >
> > >
> > > Index: php3/functions/imap.c
> > > diff -u php3/functions/imap.c:1.71 php3/functions/imap.c:1.72
> > > --- php3/functions/imap.c:1.71 Mon Nov 1 11:45:36 1999
> > > +++ php3/functions/imap.c Wed Nov 3 11:02:03 1999
> > > @@ -33,7 +33,7 @@
> > > | Andrew Skalski <askalski@chek.com> |
> > > +----------------------------------------------------------------------+
> > > */
> > > -/* $Id: imap.c,v 1.71 1999/11/01 16:45:36 chagenbu Exp $ */
> > > +/* $Id: imap.c,v 1.72 1999/11/03 16:02:03 askalski Exp $ */
> > >
> > > #define IMAP41
> > >
> > > @@ -100,8 +100,10 @@
> > > MAILSTREAM *imap_stream;
> > > long flags;
> > > #ifdef OP_RELOGIN
> > > - /* AJS: busy flag for persistent connections */
> > > - unsigned char busy;
> > > + /* AJS: busy flag for persistent connections, pointers for chaining */
> > > + struct php3_imap_le_struct *next;
> > > + struct php3_imap_le_struct **prev;
> > > + char busy;
> > > #endif
> > > } pils;
> > >
> > > @@ -123,11 +125,11 @@
> > > struct php3_imap_message_struct *next;
> > > } MESSAGELIST;
> > >
> > > -MAILSTREAM *mail_close_it (pils *imap_le_struct);
> > > +void mail_close_it (pils *imap_le_struct);
> > > #ifdef OP_RELOGIN
> > > /* AJS: close persistent connection */
> > > -MAILSTREAM *mail_phalfclose_it (pils *imap_le_struct);
> > > -MAILSTREAM *mail_pclose_it (pils *imap_le_struct);
> > > +void mail_userlogout_it (pils *imap_le_struct);
> > > +void mail_nuke_chain (pils **headp);
> > > #endif
> > >
> > > /*
> > > @@ -224,8 +226,9 @@
> > > */
> > > int le_imap;
> > > #ifdef OP_RELOGIN
> > > -/* AJS: persistent connection type */
> > > +/* AJS: persistent connection type, chain pointer type */
> > > int le_pimap;
> > > +int le_pimapchain;
> > > #endif
> > > char imap_user[80]="";
> > > char imap_password[80]="";
> > > @@ -254,39 +257,39 @@
> > > unsigned long status_quota_all;
> > > #endif
> > >
> > > -MAILSTREAM *mail_close_it (pils *imap_le_struct)
> > > +void
> > > +mail_close_it (pils *imap_le_struct)
> > > {
> > > - MAILSTREAM *ret;
> > > - ret = mail_close_full (imap_le_struct->imap_stream,imap_le_struct->flags);
> > > + mail_close_full (imap_le_struct->imap_stream,imap_le_struct->flags);
> > > efree(imap_le_struct);
> > > - return ret;
> > > }
> > >
> > > #ifdef OP_RELOGIN
> > > /* AJS: stream close functions for persistent connections */
> > > -MAILSTREAM *mail_phalfclose_it (pils *imap_le_struct)
> > > +void
> > > +mail_userlogout_it (pils *imap_le_struct)
> > > {
> > > /* Close this user's session, putting the stream back
> > > * into AUTHENTICATE state. (Note that IMAP does not
> > > * support this behavior... yet)
> > > */
> > > imap_le_struct->busy = 0;
> > > - return mail_close_full(
> > > - imap_le_struct->imap_stream,
> > > - imap_le_struct->flags | CL_HALF);
> > > + mail_close_full(imap_le_struct->imap_stream,
> > > + imap_le_struct->flags | CL_HALF);
> > > }
> > >
> > > -MAILSTREAM *mail_pclose_it (pils *imap_le_struct)
> > > +void
> > > +mail_nuke_chain (pils **headp)
> > > {
> > > - /* Standard stream close, except that the imap_le_struct
> > > - * is free()'d rather than efree()'d.
> > > - */
> > > - MAILSTREAM *ret;
> > > - ret = mail_close_full(
> > > - imap_le_struct->imap_stream,
> > > - imap_le_struct->flags);
> > > - free(imap_le_struct);
> > > - return ret;
> > > + pils *node, *next;
> > > +
> > > + for (node = *headp; node; node = next) {
> > > + next = node->next;
> > > + mail_close(node->imap_stream);
> > > + free(node);
> > > + }
> > > +
> > > + free(headp);
> > > }
> > > #endif
> > >
> > > @@ -616,7 +619,8 @@
> > > le_imap = register_list_destructors(mail_close_it,NULL);
> > > #ifdef OP_RELOGIN
> > > /* AJS: destructors for persistent connections */
> > > - le_pimap = register_list_destructors(mail_phalfclose_it,mail_pclose_it);
> > > + le_pimap = register_list_destructors(mail_userlogout_it, NULL);
> > > + le_pimapchain = register_list_destructors(NULL, mail_nuke_chain);
> > > #endif
> > > return SUCCESS;
> > > }
> > > @@ -633,6 +637,8 @@
> > > long cl_flags=NIL;
> > > #ifdef OP_RELOGIN
> > > NETMBX netmbx;
> > > + char *hashed_details = NULL;
> > > + int hashed_details_length = 0;
> > > #endif
> > > int ind;
> > > int myargc=ARG_COUNT(ht);
> > > @@ -668,85 +674,128 @@
> > > }
> > >
> > > imap_stream = NIL;
> > > - le = NULL;
> > > if (persistent) {
> > > + list_entry *le = NULL;
> > > + list_entry new_le;
> > > + pils **headp, *node;
> > > + int need_update = 0;
> > > +
> > > + hashed_details_length = sizeof("imap_") + strlen(netmbx.host);
> > > + hashed_details = (char*) emalloc(hashed_details_length);
> > > + sprintf(hashed_details, "imap_%s", netmbx.host);
> > > +
> > > /* Check for an existing connection. */
> > > - if ((_php3_hash_find( plist,
> > > - netmbx.host,
> > > - strlen(netmbx.host) + 1,
> > > - (void**) &le) == FAILURE)
> > > - || (le->type != le_pimap))
> > > + if ( (_php3_hash_find(plist,
> > > + hashed_details,
> > > + hashed_details_length,
> > > + (void*) &le) == FAILURE) ||
> > > + (le->type != le_pimapchain))
> > > {
> > > le = NULL;
> > > }
> > >
> > > /* Re-use existing connection if available. */
> > > + node = NULL;
> > > + headp = NULL;
> > > if (le) {
> > > - imap_le_struct = (pils*) le->ptr;
> > > - if (imap_le_struct->busy) {
> > > - /* This connection is in use right now. */
> > > - le = NULL;
> > > - }
> > > - else {
> > > - /* Login with a new username/password. */
> > > - imap_stream = mail_open(
> > > - imap_le_struct->imap_stream,
> > > - mailbox->value.str.val,
> > > - flags | OP_RELOGIN);
> > > - if (imap_stream) {
> > > - /* Ping the stream to see if it is
> > > - * still good.
> > > - */
> > > - if (!mail_ping(imap_stream)) {
> > > - mail_close(imap_stream);
> > > - imap_stream = NIL;
> > > - }
> > > + headp = (pils**) le->ptr;
> > > +
> > > + /* find a non-busy connection */
> > > + for (node=*headp; node; node=node->next)
> > > + if (!node->busy)
> > > + break;
> > > + }
> > > +
> > > + /* If we found a node, do a relogin. */
> > > + if (node) {
> > > + imap_stream = mail_open(
> > > + node->imap_stream,
> > > + mailbox->value.str.val,
> > > + flags | OP_RELOGIN);
> > > + if (imap_stream) {
> > > + /* Ping the stream to see if it is
> > > + * still good.
> > > + */
> > > + if (!mail_ping(imap_stream)) {
> > > + mail_close(imap_stream);
> > > + imap_stream = NIL;
> > > }
> > > }
> > > }
> > >
> > > - /* Did we find a valid stream? */
> > > + /* Get a fresh stream if we don't have one yet. */
> > > if (imap_stream == NIL) {
> > > /* Open a new connection. */
> > > imap_stream = mail_open(
> > > NIL,
> > > mailbox->value.str.val,
> > > flags | OP_RELOGIN);
> > > - if (imap_stream == NIL) {
> > > - /* XXX if (le) { remove_from_hash; } */
> > > - RETURN_FALSE;
> > > + }
> > > +
> > > + /* Do we have a stream yet? If not, bail. */
> > > + if (imap_stream == NIL) {
> > > + if (node) {
> > > + /* unlink the node */
> > > + if ((*node->prev = node->next))
> > > + node->next->prev = node->prev;
> > > + free(node);
> > > + /* delete the hash entry if empty */
> > > + if (*headp == NULL)
> > > + _php3_hash_del(plist,
> > > + hashed_details,
> > > + hashed_details_length);
> > > }
> > > + efree(hashed_details);
> > > + RETURN_FALSE;
> > > + }
> > >
> > > - if (le) {
> > > - /* Reuse existing hash entry. */
> > > - imap_le_struct = (pils*) le->ptr;
> > > + /* Allocate a new node if none. */
> > > + if (node == NULL) {
> > > + /* Alloc new hash entry. */
> > > + node = malloc(sizeof(pils));
> > > + if (node == NULL) {
> > > + efree(hashed_details);
> > > + RETURN_FALSE;
> > > }
> > > - else {
> > > - /* Alloc new hash entry. */
> > > - imap_le_struct = malloc(sizeof(pils));
> > > - new_le.type = le_pimap;
> > > - new_le.ptr = imap_le_struct;
> > > +
> > > + /* Allocate headp if it does not exist. */
> > > + if (headp == NULL) {
> > > + headp = calloc(1, sizeof(*headp));
> > > + need_update = 1;
> > > }
> > > +
> > > + node->prev = headp;
> > > + node->next = *headp;
> > > + *headp = node;
> > > }
> > >
> > > - /* Initialize the imap_le_struct */
> > > - imap_le_struct->busy = 1;
> > > - imap_le_struct->imap_stream = imap_stream;
> > > - imap_le_struct->flags = cl_flags;
> > > -
> > > - /* Add to hash if not there already. */
> > > - if (!le && _php3_hash_update(
> > > - plist,
> > > - netmbx.host,
> > > - strlen(netmbx.host) + 1,
> > > - (void*) &new_le,
> > > - sizeof(list_entry),
> > > - NULL) == FAILURE)
> > > + /* Initialize the node. */
> > > + node->busy = 1;
> > > + node->imap_stream = imap_stream;
> > > + node->flags = cl_flags;
> > > +
> > > + /* Update the hash. */
> > > + new_le.type = le_pimapchain;
> > > + new_le.ptr = headp;
> > > + if ( need_update &&
> > > + _php3_hash_update(plist, hashed_details,
> > > + hashed_details_length, &new_le,
> > > + sizeof(new_le), NULL) == FAILURE)
> > > {
> > > - mail_close(imap_stream);
> > > - free(imap_le_struct);
> > > + /* unlink and free the new node */
> > > + if ((*node->prev = node->next))
> > > + node->next->prev = node->prev;
> > > + mail_close(node->imap_stream);
> > > + free(node);
> > > +
> > > + free(headp);
> > > + efree(hashed_details);
> > > RETURN_FALSE;
> > > }
> > > +
> > > + efree(hashed_details);
> > > +
> > > + imap_le_struct = node;
> > > }
> > > else {
> > > #endif
> > >
> > >
> > >
> > > --
> > > PHP Development Mailing List
> > > <http://www.php.net/>
> > > To unsubscribe, e-mail: php-dev-unsubscribe@lists.php.net
> > > For additional commands, e-mail: php-dev-help@lists.php.net
> > > To contact the list administrators, e-mail: php-list-admin@lists.php.net
> > >
> > >
> >
> >
> > Thies C. Arntzen "One Big-Mac, Small Fries and a Coke!"
> > Digital Collections Phone +49 40 235350 Fax +49 40 23535180
> > Hammerbrookstr. 93 20097 Hamburg / Germany
> >
> >
> > --
> > PHP Development Mailing List <http://www.php.net/>
> > To unsubscribe, e-mail: php-dev-unsubscribe@lists.php.net
> > For additional commands, e-mail: php-dev-help@lists.php.net
> > To contact the list administrators, e-mail: php-list-admin@lists.php.net
> >
>
>
Thies C. Arntzen "One Big-Mac, Small Fries and a Coke!"
Digital Collections Phone +49 40 235350 Fax +49 40 23535180
Hammerbrookstr. 93 20097 Hamburg / Germany