This is listmail.m in view mode; [Download] [Up]
/* -*-C-*- ******************************************************************************* * * File: listmail.m * RCS: /usr/local/sources/CVS/mailapp-utilities/listmail.m,v 1.5 1997/05/31 01:31:30 tom Exp * Description: List the contents of a Mail.app table_of_contents * Author: Carl Edman * Created: Fri Mar 12 18:21:23 1993 * Modified: Sat Nov 30 23:29:31 1996 Tom Hageman <tom@basil.icce.rug.nl> * Language: Objective C * Package: mailapp-utilities * Status: First release. * * (C) Copyright 1993, but otherwise this file is perfect freeware. * ******************************************************************************* */ #import <libc.h> #import <errno.h> //#import <stdlib.h> //#import <stdio.h> //#import <string.h> //#import <time.h> #import <regex.h> //#import <sys/file.h> //#import <sys/param.h> //#import <sys/types.h> //#import <sys/stat.h> #import <defaults/defaults.h> #import "mailutil.h" #import "mailtoc.h" #import "optutil.h" #define USAGE "\ Usage: %s [-nv][-t][-p prefix][-H|-V] mbox...\n" #define HELP "\ -n ignore mailbox locks, list regardless\n\ -v talkative mode\n\ -t show total number of messages\n\ -p prefix prepend prefix to mbox, table_of_contents inside .mbox\n\ -V show version\n\ -H this help\n\ " char line[LINELEN]; int main(int ac,char *av[]) { int c,width; int verboseflg=0,nowaitflg=0,countonlyflg=0,lockedflg; FILE *tocf; char *p; struct table_of_contents_header *toch=0; struct message_index *mi=0; int status=EXIT_SUCCESS; char *mbox="mbox",*table_of_contents="table_of_contents"; set_progname(av[0]); while((c=getopt(ac,av,"nvtp:VH"))!=EOF) switch(c) { case 'v': verboseflg++; break; case 'n': nowaitflg++; break; case 't': countonlyflg++; break; case 'p': mbox=malloc(strlen(optarg)+strlen("mbox")+1); sprintf(mbox, "%smbox", optarg); table_of_contents=malloc(strlen(optarg)+strlen("table_of_contents")+1); sprintf(table_of_contents, "%stable_of_contents", optarg); break; case 'V': status=EXIT_VERSION; break; case 'H': status=EXIT_HELP; break; case '?': default: status=EXIT_USAGE; } if (status==EXIT_SUCCESS && optind>=ac) status=EXIT_USAGE; handle_usage_help_version(status, USAGE, HELP); for(;optind<ac;optind++) { int priority; time_t s,t; if (verboseflg) fprintf(stderr,"Entering %s...\n",av[optind]); if (cd_mbox(av[optind],0)) goto next; lockedflg=lock_mbox(nowaitflg); if ((tocf=fopen(table_of_contents,"rb"))==NULL) { fprintf(stderr,"%s: %s: opening: %s\n",progname(),av[optind],strerror(errno)); goto unlock; } toch=get_table_of_contents_header(tocf,0); if (!toch) { fprintf(stderr,"%s: %s: invalid table_of_contents\n",progname(),av[optind]); goto unlock; } if (countonlyflg) { printf("%d\n",toch->num_msgs); goto unlock; } // XXX wishlist: countall -- message count per category. printf("Table of contents (magic=%d):\n",toch->magic); printf("Number of messages:%5d Modification Time:%25s",toch->num_msgs, ctime(&toch->mbox_time)); if (toch->mbox_time!=mtime(mbox)) { s=mtime(mbox); printf("(!=%25s)",ctime(&s)); } printf("\nAt (%.2f,%.2f) %.2fx%.2f(%.2f)\n",toch->window.origin.x, toch->window.origin.y,toch->window.size.width,toch->window.size.height, toch->list); for(c=toch->num_msgs,width=0;c>0;) { width++; c/=10; } for(c=0;c<toch->num_msgs;c++) { if ((mi=get_message_index(tocf))==0) { fprintf(stderr,"%s: %s: reading mbox entries: %s\n",progname(),av[optind],(errno?strerror(errno):"invalid")); goto unlock; } printf("%c%c%c%c%*d %8d %5d/%7d %s:%s",mi->status,mi->msgtype,mi->encrypted,mi->sync,width,c+1,mi->mes_date,mi->mes_length,mi->mes_offset,message_from(mi),message_subject(mi)); if (*(p=message_reference(mi))) { t=message_attachtime(mi); s=mtime(p); printf("(%s:%d@%25s", p, message_attachsize(mi),ctime(&t)); if (t!=s) printf("!= %25s",ctime(&s)); printf(")"); } if ((priority=message_priority(mi))>0) { printf("(pri=%d)",priority); } printf("\n"); free(mi); mi=0; } unlock: if (tocf!=NULL) fclose(tocf); if (!lockedflg) unlock_mbox(); next: if (toch) { free(toch); toch=0; } if (mi) { free(mi); mi=0; } uncd_mbox(); } exit(EXIT_SUCCESS); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.