MAILSTREAM *dummy_open (MAILSTREAM *stream) { int fd; char err[MAILTMPLEN],tmp[MAILTMPLEN]; struct stat sbuf; /* OP_PROTOTYPE call */ if (!stream) return &dummyproto; err[0] = '\0'; /* no error message yet */ /* can we open the file? */ if (!dummy_file (tmp,stream->mailbox)) sprintf (err,"Can't open this name: %.80s",stream->mailbox); else if ((fd = open (tmp,O_RDONLY,NIL)) < 0) { /* no, error unless INBOX */ if (compare_cstring (stream->mailbox,"INBOX")) sprintf (err,"%.80s: %.80s",strerror (errno),stream->mailbox); } else { /* file had better be empty then */ fstat (fd,&sbuf); /* sniff at its size */ close (fd); if (sbuf.st_size) /* bogus format if non-empty */ sprintf (err,"%.80s (file %.80s) is not in valid mailbox format", stream->mailbox,tmp); } if (err[0]) { /* if an error happened */ mm_log (err,stream->silent ? WARN : ERROR); return NIL; } else if (!stream->silent) { /* only if silence not requested */ mail_exists (stream,0); /* say there are 0 messages */ mail_recent (stream,0); /* and certainly no recent ones! */ stream->uid_validity = time (0); } stream->inbox = T; /* note that it's an INBOX */ return stream; /* return success */ }
long dummy_ping (MAILSTREAM *stream) { MAILSTREAM *test; /* time to do another test? */ if (time (0) >= ((time_t) (stream->gensym + 30))) { /* has mailbox format changed? */ if ((test = mail_open (NIL,stream->mailbox,OP_PROTOTYPE)) && (test->dtb != stream->dtb) && (test = mail_open (NIL,stream->mailbox,NIL))) { /* preserve some resources */ test->original_mailbox = stream->original_mailbox; stream->original_mailbox = NIL; test->sparep = stream->sparep; stream->sparep = NIL; test->sequence = stream->sequence; mail_close ((MAILSTREAM *) /* flush resources used by dummy stream */ memcpy (fs_get (sizeof (MAILSTREAM)),stream, sizeof (MAILSTREAM))); /* swap the streams */ memcpy (stream,test,sizeof (MAILSTREAM)); fs_give ((void **) &test);/* flush test now that copied */ /* make sure application knows */ mail_exists (stream,stream->recent = stream->nmsgs); } /* still hasn't changed */ else stream->gensym = time (0); } return T; }
MAILSTREAM *news_open (MAILSTREAM *stream) { long i,nmsgs; char *s,tmp[MAILTMPLEN]; struct direct **names; /* return prototype for OP_PROTOTYPE call */ if (!stream) return &newsproto; if (stream->local) fatal ("news recycle stream"); /* build directory name */ sprintf (s = tmp,"%s/%s",(char *) mail_parameters (NIL,GET_NEWSSPOOL,NIL), stream->mailbox + 6); while (s = strchr (s,'.')) *s = '/'; /* scan directory */ if ((nmsgs = scandir (tmp,&names,news_select,news_numsort)) >= 0) { mail_exists (stream,nmsgs); /* notify upper level that messages exist */ stream->local = fs_get (sizeof (NEWSLOCAL)); LOCAL->dirty = NIL; /* no update to .newsrc needed yet */ LOCAL->dir = cpystr (tmp); /* copy directory name for later */ /* make temporary buffer */ LOCAL->buf = (char *) fs_get ((LOCAL->buflen = MAXMESSAGESIZE) + 1); LOCAL->name = cpystr (stream->mailbox + 6); for (i = 0; i < nmsgs; ++i) { stream->uid_last = mail_elt (stream,i+1)->private.uid = atoi (names[i]->d_name); fs_give ((void **) &names[i]); } s = (void *) names; /* stupid language */ fs_give ((void **) &s); /* free directory */ LOCAL->cachedtexts = 0; /* no cached texts */ stream->sequence++; /* bump sequence number */ stream->rdonly = stream->perm_deleted = T; /* UIDs are always valid */ stream->uid_validity = 0xbeefface; /* read .newsrc entries */ mail_recent (stream,newsrc_read (LOCAL->name,stream)); /* notify if empty newsgroup */ if (!(stream->nmsgs || stream->silent)) { sprintf (tmp,"Newsgroup %s is empty",LOCAL->name); mm_log (tmp,WARN); } }