This is MailTOC_Dump.c in view mode; [Download] [Up]
/* MailTOC_Dump.c - Program to dump Mailbox table_of_contents to stdout.
Based on info provided by Chris Paris cap+@cmu.edu.
Get file "mailforward*.tar.Z" from the archive and see
index_files.rtf in it.
This should be run in a ~/Mailboxes/*.mbox directory where file
table_of_contents is in the current directory.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
typedef struct table_of_contents_header {
long magic; /* magic number: 0xd9758 */
long num_msgs; /* number of messages in mbox */
long mbox_time; /* the m_time of mbox */
float listview_height; /* height of upper section of split view containing list */
float llx; /* lower left X coordinate of window */
float lly; /* lower left Y coordinate */
float width; /* width of window */
float height; /* height of window */
} MailTocHeader;
typedef struct message_index {
long record_length; /* the length of this record, including this word */
long message_offset; /* offset in mbox where this message begins */
long message_length; /* length in bytes of this message in mbox */
long message_date; /* the date of this message */
char status; /* read, unread, deleted */
char msgtype; /* regular or NeXT mail */
char mystery[2]; /* I don't know what these are */
} MailMsgIndex;
main()
{
FILE *fp;
MailTocHeader header;
MailMsgIndex mindex;
int nread, i, c;
unsigned long year, month, day;
fp = fopen("table_of_contents", "r");
if(fp == NULL)
{
fprintf(stderr, "Can't open table_of_contents file.\n");
fprintf(stderr, "Run within a ~/Mailboxes/*.mbox directory.\n");
exit(1);
}
nread = fread(&header, (size_t)sizeof(MailTocHeader), 1, fp);
if(nread==0)
{
fprintf(stderr,"No header could be read.\n");
exit(2);
}
/* dump header info */
printf("Magic (should be 0xd9758): 0x%lx\n", header.magic);
printf("# of messages: %ld\n", header.num_msgs);
printf("Modification time of mbox: %s", ctime(&header.mbox_time));
printf("Height of message list view: %.1f\n",header.listview_height);
printf("Window Origin(x,y)=(%.f, %.f), Size(w,h)=(%.f, %.f)\n",
header.llx, header.lly, header.width, header.height);
/* Now, dump records for each message */
for(i=0; i<header.num_msgs; i++)
{
nread = fread(&mindex, (size_t)sizeof(MailMsgIndex), 1, fp);
if(nread == 0)
{
fprintf(stderr,"Premature EOF\n");
exit(3);
}
printf("---[%d]---\n", i+1);
printf("Record Length: %ld\n", mindex.record_length);
printf("Message Offset into mbox: %ld\n", mindex.message_offset);
printf("Message Length (bytes): %ld\n", mindex.message_length);
day = month = year = mindex.message_date;
year >>= 9;
month >>= 5; month &= 0xf;
day &= 0x1f;
printf("Message Date (Y-M-D): %d-%d-%d\n", year, month, day);
printf("Status: Read( ), Last-Read(>), Unread(*), Deleted(d): [%c]\n", mindex.status);
printf("NeXTmail(r) or regular ( ): [%c]\n",mindex.msgtype);
printf("Mystery byte-1: %d (dec), [%c]\n", (int)(mindex.mystery[0]), mindex.mystery[0]);
printf("Mystery byte-2: %d (dec), [%c]\n", (int)(mindex.mystery[1]), mindex.mystery[1]);
printf("From: ");
while((c=fgetc(fp)) != (int)'\0')
putchar(c);
printf("\nSubject: ");
while((c=fgetc(fp)) != (int)'\0')
putchar(c);
printf("\nAttachment Dir: ");
while((c=fgetc(fp)) != (int)'\0')
putchar(c);
printf("\n");
}
printf("---End of TOC---\n");
fclose(fp);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.