diff -u -r -N xpbiff/Imakefile xpbiff-new/Imakefile --- xpbiff/Imakefile 1994-10-24 16:06:53.000000000 +0900 +++ xpbiff-new/Imakefile 2003-09-25 11:22:43.000000000 +0900 @@ -49,8 +49,8 @@ #endif #ifdef SOLARIS - UCBLIBDIR = UcbLibDir - UCBLIB = -lucb -lelf + UCBLIBDIR = $(UcbLibDir) + UCBLIB = -lelf #endif INCLUDES = -I$(TOP)/X11 -I$(AUDIOINCDIR) diff -u -r -N xpbiff/LocPixmap.c xpbiff-new/LocPixmap.c --- xpbiff/LocPixmap.c 1994-10-25 09:46:23.000000000 +0900 +++ xpbiff-new/LocPixmap.c 2003-09-24 20:29:17.000000000 +0900 @@ -197,6 +197,7 @@ } /* this if-clause is redundant, but necessary to avoid bus error */ + attributes.valuemask=0L; if (pixmap == NULL && i!=2 && i!=4 && XpmReadFileToPixmap (dpy, root, fn, &pixmap, &pixmap_mask, &attributes)!= XpmSuccess) diff -u -r -N xpbiff/config.h xpbiff-new/config.h --- xpbiff/config.h 1994-10-19 14:56:25.000000000 +0900 +++ xpbiff-new/config.h 2003-09-25 11:43:18.000000000 +0900 @@ -8,7 +8,7 @@ /* * For X11R6 */ -#undef X11R6 +#define X11R6 /* * For System V @@ -19,7 +19,7 @@ * For Solaris */ #undef SOLARIS -#undef UcbLibDir -L/usr/ucblib +/* #define UcbLibDir -L/usr/ucblib */ /* * For slow work station @@ -42,7 +42,7 @@ * For Shape Extension */ -#undef SHAPE +#define SHAPE /* * Check Environment Variable MAIL for check file @@ -52,45 +52,49 @@ /* * Set Local Spool pathname */ -#undef SPOOLPATH "/usr/mail" +#define SPOOLPATH "/var/mail" /* * For X pixmap */ -#undef XPM -#undef DepXpmLib /usr/local/lib/libXpm.a +#define XPM +/* #define DepXpmLib /usr/local/lib/libXpm.a*/ /* * For using I18N Xaw */ -#undef XI18N +#define XI18N /* If you use X11R6, these settings below are not necessary */ +/* #undef DepXawLib /usr/local/lib/I18N/libXaw.a #undef DepXwcharLib /usr/local/lib/I18N/libXwchar.a #undef Xi18nLibDir -L/usr/local/lib/I18N \ -L/usr/local/lib #undef Xi18nIncDir -I/usr/local/X11/include +*/ /* * Convert JIS to Japanese EUC */ -#undef JCONVERT +#define JCONVERT #undef GUESS_JIS /* * Process MIME header, charset=ISO-2022-JP, base 64 encoding */ -#undef ISO_2022_JP +#define ISO_2022_JP /* * For SUN Audio */ #undef SUN_AUDIO -#undef AudioIncDir /usr/demo/SOUND +/* #undef AudioIncDir /usr/demo/SOUND */ /* * For YOUBIN Service */ -#undef YOUBIN -#undef YoubinBinDir /usr/local/bin -#undef YOUBIN_DEFAULT_SERVER_HOST "server" +#define YOUBIN +#define YOUBIN3 +#define YoubinBinDir /usr/local/bin +#define YOUBIN_PROG_NAME "youbin3" +#define YOUBIN_DEFAULT_SERVER_HOST "pop" diff -u -r -N xpbiff/patchlevel.h xpbiff-new/patchlevel.h --- xpbiff/patchlevel.h 1993-10-25 11:20:17.000000000 +0900 +++ xpbiff-new/patchlevel.h 2007-03-23 18:22:42.000000000 +0900 @@ -1,5 +1,5 @@ -#define PATCHLEVEL 0 +#define PATCHLEVEL 1 diff -u -r -N xpbiff/xpbiff.c xpbiff-new/xpbiff.c --- xpbiff/xpbiff.c 1994-10-27 15:42:52.000000000 +0900 +++ xpbiff-new/xpbiff.c 2008-07-30 12:54:01.000000000 +0900 @@ -115,7 +115,10 @@ #include #include +#include #include +#include +#include #include #ifdef YOUBIN @@ -130,6 +133,12 @@ #include /* For isspace() */ #include #include +#include +#ifdef __FreeBSD__ +#ifndef SIGCLD +#define SIGCLD SIGCHLD +#endif +#endif #include #endif /* YOUBIN */ @@ -157,7 +166,11 @@ #else /* YOUBIN */ +#ifdef YOUBIN_PROG_NAME +#define CHILD_PROGRAM_NAME YOUBIN_PROG_NAME +#else #define CHILD_PROGRAM_NAME "youbin" +#endif #define MESS_LEN 256 /* Max message length. */ #define HEADER_LEN (MESS_LEN + (80 * (3 + 7))) @@ -182,14 +195,14 @@ %<{subject}\nSubject: %{subject}%>' -file" #endif -XtCallbackProc quit(); +XtCallbackProc quit(Widget w, XEvent *event, String *params, Cardinal *nparams); void redraw_window(); #ifdef SHAPE void shape_window(); #endif -XtCallbackProc redraw_callback(); -XtCallbackProc BreakPopup(); -XtCallbackProc popup_again(); +XtCallbackProc redraw_callback(Widget w, XEvent *event, String *params, Cardinal *nparams); +XtCallbackProc BreakPopup(Widget w, XtPointer client_data, XtPointer call_data); +XtCallbackProc popup_again(Widget widget, caddr_t client_data, caddr_t call_data); void PopupMailHeader(); void AnimateBiff(); @@ -244,9 +257,36 @@ char *prog_name; /* This program name. */ char child_process[MAXPATHLEN + 1]; static int exit_hundler(); +static void sig_cld(); + +/* + * Compatibility of non-blocking wait. + * + * USE_POSIX_WAIT: waitpid() is available. + * Otherwise: BSD's wait3() available. + */ + +#ifdef _POSIX_SOURCE +#define USE_POSIX_WAIT +#endif + +#if (defined(SYSV) || defined(sun)) && !defined(USE_POSIX_WAIT) +#define USE_POSIX_WAIT +#endif + +#if defined(USE_POSIX_WAIT) +#include /* For waitpid(). */ +#define WAITPID(pid, status, options) waitpid((pid), (status), (options)) +#else /* !defined(USE_POSIX_WAIT) */ +/* Note, the first argument of waitpid() which means pid is is always -1. */ +#define WAITPID(pid, status, options) wait3((status), (options), NULL) +#endif /* !defined(USE_POSIX_WAIT) */ + +#include /* For wait3(). */ #endif /* YOUBIN */ + /* * widget tree: * @@ -257,11 +297,8 @@ GC gcArrive, gcNo, gcAnimate, gcAnimateBack; #ifdef XPM -Pixmap arrivePixmaps[2], noPixmaps[2]; #define arrivePixmap arrivePixmaps[0] #define noPixmap noPixmaps[0] -#else -Pixmap arrivePixmap, noPixmap; #endif Pixmap workPixmap; int width, height; @@ -271,19 +308,10 @@ #ifndef YOUBIN XtIntervalId polling_id; #endif -Pixel colors[4]; #ifndef YOUBIN char spool_path[100]; -int polling_time; #endif -int popup_time; -Boolean raise; -Boolean stay_raised; -Boolean animate; -Boolean popup; -Boolean bell; -Boolean popdown; unsigned int Arrive_pixmap_width, Arrive_pixmap_height; unsigned int Arrive_pixmap_depth; @@ -291,26 +319,6 @@ unsigned int No_pixmap_width, No_pixmap_height; unsigned int No_pixmap_depth; -Boolean mono; -String popupGeometry; - -#ifndef YOUBIN -String prefers; - -String spoolPath; -#endif - -#ifdef MHSCAN -Boolean mhscan; -String scanCommand; -String scanCommandPath; -#endif - -#ifdef SHAPE -Boolean shape; -Pixmap noPixmapMask, arrivePixmapMask; -#endif - static String fallback_resources[] = { "*info_base.hSpace: 0", "*info_base.vSpace: 0", @@ -324,86 +332,122 @@ NULL }; -#ifdef SUN_AUDIO -String mail_sndfile; -int volume; +#ifdef YOUBIN +XtIntervalId timeout_id; #endif +typedef struct _appRes { +#ifdef XPM + Pixmap arrivePixmaps[2], noPixmaps[2]; +#else + Pixmap arrivePixmap, noPixmap; +#endif /* Def: XPM */ + Pixel colors[4]; +#ifndef YOUBIN + int polling_time; + String prefers; + String spoolPath; +#endif /* Not def: YOUBIN */ + Boolean mono; + String popupGeometry; + int popup_time; + Boolean xpraise; + Boolean stay_raised; + Boolean animate; + Boolean popup; + Boolean bell; + Boolean popdown; #ifdef YOUBIN -Boolean use_pipe; -String server; -Boolean preserve; -XtIntervalId timeout_id; + Boolean use_pipe; + String server; + Boolean preserve; #endif +#ifdef MHSCAN + Boolean mhscan; + String scanCommand; + String scanCommandPath; +#endif +#ifdef SHAPE + Boolean shape; + Pixmap noPixmapMask, arrivePixmapMask; +#endif +#ifdef SUN_AUDIO + String mail_sndfile; + int volume; +#endif +} AppResourcesRec, *AppResources; +static AppResourcesRec appResources; /* application specific resources */ + +#define offset(f) XtOffset(struct _appRes *, f) static XtResource resources[] = { {"arrivePixmap", "ArrivePixmap", RPixmap2, sizeof(Pixmap2), - (Cardinal)&arrivePixmap, XtRString, "None"}, + offset(arrivePixmap), XtRString, "None"}, {"nomailPixmap", "NomailPixmap", RPixmap2, sizeof(Pixmap2), - (Cardinal)&noPixmap, XtRString, "None"}, + offset(noPixmap), XtRString, "None"}, {"nomailForeground", "NomailForeground", XtRPixel, sizeof(Pixel), - (Cardinal)&colors[0], XtRString, "black"}, + offset(colors[0]), XtRString, "black"}, {"nomailBackground", "NomailBackground", XtRPixel, sizeof(Pixel), - (Cardinal)&colors[1], XtRString, "cyan"}, + offset(colors[1]), XtRString, "cyan"}, {"arriveForeground", "ArriveForeground", XtRPixel, sizeof(Pixel), - (Cardinal)&colors[2], XtRString, "yellow"}, + offset(colors[2]), XtRString, "yellow"}, {"arriveBackground", "ArriveBackground", XtRPixel, sizeof(Pixel), - (Cardinal)&colors[3], XtRString, "red"}, + offset(colors[3]), XtRString, "red"}, #ifndef YOUBIN {"pollingTime", "PollingTime", XtRInt, sizeof(int), - (Cardinal)&polling_time, XtRImmediate, (XtPointer)15000}, + offset(polling_time), XtRImmediate, (XtPointer)15000}, {"prefer", "Prefer", XtRString, sizeof(String), - (Cardinal)&prefers, XtRString, (XtPointer)"From Subject"}, + offset(prefers), XtRString, (XtPointer)"From Subject"}, {"spoolPath", "SpoolPath", XtRString, sizeof(String), - (Cardinal)&spoolPath, XtRString, None}, + offset(spoolPath), XtRString, None}, #endif {"mono", "Mono", XtRBoolean, sizeof(Boolean), - (Cardinal)&mono, XtRImmediate, (XtPointer)False}, + offset(mono), XtRImmediate, (XtPointer)False}, {"popupGeometry", "PopupGeometry", XtRString, sizeof(String), - (Cardinal)&popupGeometry, XtRString, NULL}, - {"raise", "Raise", XtRBoolean, sizeof(Boolean), - (Cardinal)&raise, XtRImmediate, (XtPointer)True}, + offset(popupGeometry), XtRString, NULL}, + {"xpraise", "Raise", XtRBoolean, sizeof(Boolean), + offset(xpraise), XtRImmediate, (XtPointer)True}, {"stayRaised", "StayRaised", XtRBoolean, sizeof(Boolean), - (Cardinal)&stay_raised, XtRImmediate, (XtPointer)False}, + offset(stay_raised), XtRImmediate, (XtPointer)False}, {"animate", "Animate", XtRBoolean, sizeof(Boolean), - (Cardinal)&animate, XtRImmediate, (XtPointer)True}, + offset(animate), XtRImmediate, (XtPointer)True}, {"popup", "Popup", XtRBoolean, sizeof(Boolean), - (Cardinal)&popup, XtRImmediate, (XtPointer)True}, + offset(popup), XtRImmediate, (XtPointer)True}, {"popupTime", "PopupTime", XtRInt, sizeof(int), - (Cardinal)&popup_time, XtRImmediate, (XtPointer)15000}, + offset(popup_time), XtRImmediate, (XtPointer)15000}, {"bell", "Bell", XtRBoolean, sizeof(Boolean), - (Cardinal)&bell, XtRImmediate, (XtPointer)True}, + offset(bell), XtRImmediate, (XtPointer)True}, {"popdown", "Popdown", XtRBoolean, sizeof(Boolean), - (Cardinal)&popdown, XtRImmediate, (XtPointer)True}, + offset(popdown), XtRImmediate, (XtPointer)True}, #ifdef YOUBIN {"pipe", "Pipe", XtRBoolean, sizeof(Boolean), - (Cardinal)&use_pipe, XtRString, "false"}, + offset(use_pipe), XtRString, "false"}, {"server", "Server", XtRString, sizeof(String), - (Cardinal)&server, XtRString, YOUBIN_DEFAULT_SERVER_HOST}, + offset(server), XtRString, YOUBIN_DEFAULT_SERVER_HOST}, {"preserve", "preserve", XtRBoolean, sizeof(Boolean), - (Cardinal)&preserve, XtRString, "true"}, + offset(preserve), XtRString, "true"}, #endif #ifdef MHSCAN {"mhscan", "Mhscan", XtRBoolean, sizeof(Boolean), - (Cardinal)&mhscan, XtRImmediate, (XtPointer)False}, + offset(mhscan), XtRImmediate, (XtPointer)False}, {"scanCommand", "ScanCommand", XtRString, sizeof(String), - (Cardinal)&scanCommand, XtRString, DEFAULT_SCAN_COMMAND}, + offset(scanCommand), XtRString, DEFAULT_SCAN_COMMAND}, {"scanCommandPath", "ScanCommandPath", XtRString, sizeof(String), - (Cardinal)&scanCommandPath, XtRString, DEFAULT_SCAN_COMMAND_PATH}, + offset(scanCommandPath), XtRString, DEFAULT_SCAN_COMMAND_PATH}, #endif #ifdef SHAPE {"shape", "Shape", XtRBoolean, sizeof(Boolean), - (Cardinal)&shape, XtRImmediate, (XtPointer)False}, + offset(shape), XtRImmediate, (XtPointer)False}, {"arrivePixmapMask", "ArrivePixmapMask", XtRBitmap, sizeof(Pixmap), - (Cardinal)&arrivePixmapMask, XtRBitmap, None}, + offset(arrivePixmapMask), XtRBitmap, None}, {"nomailPixmapMask", "NomailPixmapMask", XtRBitmap, sizeof(Pixmap), - (Cardinal)&noPixmapMask, XtRBitmap, None}, + offset(noPixmapMask), XtRBitmap, None}, #endif #ifdef SUN_AUDIO {"mailSndFile", "MailSndFile", XtRString, sizeof(String), - (Cardinal)&mail_sndfile, XtRString, None}, + offset(mail_sndfile), XtRString, None}, {"volume", "Volume", XtRInt, sizeof(int), - (Cardinal)&volume, XtRString, "33"}, + offset(volume), XtRString, "33"}, #endif }; @@ -461,6 +505,7 @@ #ifdef JCONVERT static Locale_ent locale_list[] = { {"ja_JP.EUC", EUC}, + {"ja_JP.eucJP", EUC}, {"ja_JP.SJIS", SJIS}, {"ja_JP.jis7", JIS}, {"ja_JP.jis8", JIS}, @@ -659,12 +704,12 @@ convertArgs, XtNumber(convertArgs)); #endif - XtGetApplicationResources(toplevel, (caddr_t) NULL, + XtGetApplicationResources(toplevel, (XtPointer)&appResources, resources, XtNumber(resources), NULL, 0); - if (mono == True) { - colors[0] = colors[3] = BlackPixelOfScreen(XtScreen(toplevel)); - colors[1] = colors[2] = WhitePixelOfScreen(XtScreen(toplevel)); + if (appResources.mono == True) { + appResources.colors[0] = appResources.colors[3] = BlackPixelOfScreen(XtScreen(toplevel)); + appResources.colors[1] = appResources.colors[2] = WhitePixelOfScreen(XtScreen(toplevel)); } #ifndef YOUBIN @@ -672,20 +717,20 @@ #endif #ifdef XPM - if (arrivePixmapMask == None) - arrivePixmapMask = arrivePixmaps[1]; - if (noPixmapMask == None) - noPixmapMask = noPixmaps[1]; + if (appResources.arrivePixmapMask == None) + appResources.arrivePixmapMask = appResources.arrivePixmaps[1]; + if (appResources.noPixmapMask == None) + appResources.noPixmapMask = appResources.noPixmaps[1]; #endif #ifdef SHAPE - if (shape == True + if (appResources.shape == True && !XShapeQueryExtension(XtDisplay(toplevel), &dummy, &dummy)) - shape = False; + appResources.shape = False; #endif - if (noPixmap == None) { - noPixmap = XCreatePixmapFromBitmapData + if (appResources.noPixmap == None) { + appResources.noPixmap = XCreatePixmapFromBitmapData (XtDisplay(toplevel), RootWindowOfScreen(XtScreen(toplevel)), no_bits, no_width, no_height, 1, 0, 1); No_pixmap_width = no_width; @@ -695,14 +740,14 @@ else { Window r; unsigned int x, y, bw; - XGetGeometry(XtDisplay(toplevel), noPixmap, + XGetGeometry(XtDisplay(toplevel), appResources.noPixmap, &r, &x, &y, &No_pixmap_width, &No_pixmap_height, &bw, &No_pixmap_depth); } - if (arrivePixmap == None) { - arrivePixmap = XCreatePixmapFromBitmapData + if (appResources.arrivePixmap == None) { + appResources.arrivePixmap = XCreatePixmapFromBitmapData (XtDisplay(toplevel), RootWindowOfScreen(XtScreen(toplevel)), arrive_bits, arrive_width, arrive_height, 1, 0, 1); @@ -713,7 +758,7 @@ else { Window r; unsigned int x, y, bw; - XGetGeometry(XtDisplay(toplevel), arrivePixmap, + XGetGeometry(XtDisplay(toplevel), appResources.arrivePixmap, &r, &x, &y, &Arrive_pixmap_width, &Arrive_pixmap_height, &bw, &Arrive_pixmap_depth); @@ -741,14 +786,14 @@ /* Get graphic context */ - values.foreground = colors[0]; - values.background = colors[1]; + values.foreground = appResources.colors[0]; + values.background = appResources.colors[1]; values.graphics_exposures = False; gcNo = XtGetGC(toplevel, GCForeground | GCBackground | GCGraphicsExposures, &values); - values.foreground = colors[2]; - values.background = colors[3]; + values.foreground = appResources.colors[2]; + values.background = appResources.colors[3]; values.graphics_exposures = False; gcArrive = XtGetGC(toplevel, GCForeground | GCBackground | GCGraphicsExposures, @@ -760,13 +805,13 @@ Arrive_pixmap_width, Arrive_pixmap_height, DefaultDepthOfScreen(XtScreen(toplevel))); - values.foreground = colors[2]; + values.foreground = appResources.colors[2]; values.graphics_exposures = False; gcAnimate = XtGetGC(toplevel, GCForeground | GCGraphicsExposures, &values); - values.foreground = colors[3]; + values.foreground = appResources.colors[3]; values.graphics_exposures = False; gcAnimateBack = XtGetGC(toplevel, GCForeground | GCGraphicsExposures, @@ -777,9 +822,9 @@ polling_id = XtAppAddTimeOut(app_con, (unsigned long) polling_time, Polling, NULL); #else /* YOUBIN */ - if (server == NULL) { + if (appResources.server == NULL) { gethostname(serv_name, sizeof(serv_name)); - server = serv_name; + appResources.server = serv_name; } /* make new process group */ @@ -789,9 +834,15 @@ exit(EXIT_FAILURE); } - if (use_pipe == False) { + if (appResources.use_pipe == False) { + signal(SIGCLD, sig_cld); +#ifdef YOUBIN3 + sprintf(child_process, "%s/%s -o5 -b From:,Subject: -s %s", + BINDIR, CHILD_PROGRAM_NAME, appResources.server); +#else sprintf(child_process, "%s/%s -b -s %s", BINDIR, CHILD_PROGRAM_NAME, server); +#endif if ((pfile = popen(child_process, "r")) == NULL) { perror("popen"); exit(EXIT_FAILURE); @@ -831,21 +882,21 @@ { if (current_status == ARRIVE) { if (Arrive_pixmap_depth == 1) - XCopyPlane(XtDisplay(toplevel), arrivePixmap, XtWindow(biff), + XCopyPlane(XtDisplay(toplevel), appResources.arrivePixmap, XtWindow(biff), gcArrive, 0, 0, Arrive_pixmap_width, Arrive_pixmap_height, 0, 0, 1); else - XCopyArea(XtDisplay(toplevel), arrivePixmap, XtWindow(biff), + XCopyArea(XtDisplay(toplevel), appResources.arrivePixmap, XtWindow(biff), gcArrive, 0, 0, Arrive_pixmap_width, Arrive_pixmap_height, 0, 0); } else { if (No_pixmap_depth == 1) - XCopyPlane(XtDisplay(toplevel), noPixmap, XtWindow(biff), + XCopyPlane(XtDisplay(toplevel), appResources.noPixmap, XtWindow(biff), gcNo, 0, 0, No_pixmap_width, No_pixmap_height, 0, 0, 1); else - XCopyArea(XtDisplay(toplevel), noPixmap, XtWindow(biff), + XCopyArea(XtDisplay(toplevel), appResources.noPixmap, XtWindow(biff), gcNo, 0, 0, No_pixmap_width, No_pixmap_height, 0, 0); } } @@ -853,9 +904,9 @@ #ifdef SHAPE void shape_window() { - if (shape == True) { + if (appResources.shape == True) { if (current_status == ARRIVE) { - if (arrivePixmapMask == None) { + if (appResources.arrivePixmapMask == None) { XRectangle rect; rect.x = rect.y = 0; rect.width = Arrive_pixmap_width; @@ -866,11 +917,11 @@ } else XShapeCombineMask(XtDisplay(toplevel), XtWindow(toplevel), - ShapeBounding, 0, 0, arrivePixmapMask, + ShapeBounding, 0, 0, appResources.arrivePixmapMask, ShapeSet); } else { - if (noPixmapMask == None) { + if (appResources.noPixmapMask == None) { XRectangle rect; rect.x = rect.y = 0; rect.width = No_pixmap_width; @@ -881,7 +932,7 @@ } else XShapeCombineMask(XtDisplay(toplevel), XtWindow(toplevel), - ShapeBounding, 0, 0, noPixmapMask, + ShapeBounding, 0, 0, appResources.noPixmapMask, ShapeSet); } } @@ -919,7 +970,7 @@ mail_header = GetMailHeader(); XtResizeWidget(toplevel, Arrive_pixmap_width, Arrive_pixmap_height, 1); XtResizeWidget(biff, Arrive_pixmap_width, Arrive_pixmap_height, 0); - if (raise == True) + if (xpraise == True) XRaiseWindow(XtDisplay(toplevel), XtWindow(toplevel)); if (animate == True) AnimateBiff(); @@ -943,7 +994,7 @@ BreakPopup(toplevel, (XtPointer) NULL, (XtPointer) NULL); XtResizeWidget(toplevel, Arrive_pixmap_width, Arrive_pixmap_height, 1); XtResizeWidget(biff, Arrive_pixmap_width, Arrive_pixmap_height, 0); - if (raise == True) + if (xpraise == True) XRaiseWindow(XtDisplay(toplevel), XtWindow(toplevel)); if (animate == True) AnimateBiff(); @@ -959,7 +1010,7 @@ } else { mail_size = file_stat.st_size; - if (raise == True && stay_raised == False) + if (xpraise == True && stay_raised == False) XLowerWindow(XtDisplay(toplevel), XtWindow(toplevel)); if (popup == True) BreakPopup(toplevel, (XtPointer) NULL, (XtPointer) NULL); @@ -974,7 +1025,7 @@ #ifdef SHAPE shape_window(); #endif - if (raise == True && stay_raised == False) + if (xpraise == True && stay_raised == False) XLowerWindow(XtDisplay(toplevel), XtWindow(toplevel)); if (popup == True) BreakPopup(toplevel, (XtPointer) NULL, (XtPointer) NULL); @@ -995,7 +1046,7 @@ double r, angle, t1, t2, t3, t4; #ifdef SHAPE - if(shape == True) { + if(appResources.shape == True) { XRectangle rect; rect.x = rect.y = 0; rect.width = Arrive_pixmap_width; @@ -1038,9 +1089,9 @@ /* Create Popup Shell */ - if (popupGeometry != NULL) { + if (appResources.popupGeometry != NULL) { arg_count = 0; - XtSetArg(args[arg_count], XtNgeometry, popupGeometry); + XtSetArg(args[arg_count], XtNgeometry, appResources.popupGeometry); arg_count++; } else { @@ -1068,10 +1119,10 @@ info_base = XtCreateManagedWidget("info_base", boxWidgetClass, header, args, arg_count); - if (popdown == True) { + if (appResources.popdown == True) { popdown_button = XtCreateManagedWidget("popdown_button", commandWidgetClass, info_base, NULL, ZERO); - XtAddCallback(popdown_button, XtNcallback, BreakPopup, (XtPointer) NULL); + XtAddCallback(popdown_button, XtNcallback, (XtCallbackProc) BreakPopup, (XtPointer) NULL); } arg_count = 0; XtSetArg(args[arg_count], XtNlabel, head); @@ -1092,7 +1143,7 @@ char *p; #ifdef MHSCAN - if (mhscan && (p = mh_scan()) != NULL) + if (appResources.mhscan && (p = mh_scan()) != NULL) return p; #endif return read_headers(); @@ -1135,7 +1186,7 @@ mail_header = GetMailHeader(); XtResizeWidget(toplevel, Arrive_pixmap_width, Arrive_pixmap_height, 1); XtResizeWidget(biff, Arrive_pixmap_width, Arrive_pixmap_height, 0); - if (raise == True) + if (xpraise == True) XRaiseWindow(XtDisplay(toplevel), XtWindow(toplevel)); if (animate == True) AnimateBiff(); @@ -1155,7 +1206,7 @@ mail_header = GetMailHeader(); if (popup == True && showing_header) BreakPopup(toplevel, (XtPointer) NULL, (XtPointer) NULL); - if (raise == True) + if (xpraise == True) XRaiseWindow(XtDisplay(toplevel), XtWindow(toplevel)); redraw_window(); #ifdef SHAPE @@ -1422,9 +1473,11 @@ { char kanji = False, kana = False; char *dst = src; + char *lim; if (src) { - while(*src) { + lim = src + strlen(src); + while(*src && dst < lim) { if (*src == 27) { if (*(src+1) == '$' && (*(src+2) == '@' || *(src+2) == 'B')) { src += 3; @@ -1469,8 +1522,11 @@ *dst++ = (*src++ | 128); } else if ((kana == True) || (*src & 128)) { - *dst++ = 142; - *dst++ = (*src++ | 128); + if(dst + 1 < lim) { + *dst++ = 142; + *dst++ = (*src++ | 128); + } else + break; } else *dst++ = *src++; @@ -1697,29 +1753,29 @@ hbuf = hbufp = NULL; hbuf_size = hbuf_rest = 0; } - if (scanCommand != NULL && scanCommand[0] != '\0' + if (appResources.scanCommand != NULL && appResources.scanCommand[0] != '\0' && scan_command == NULL) { char* p; p = scan_command = (char*) malloc(sizeof(spool_path) + 10 - + (scanCommandPath != NULL ? strlen(scanCommandPath) : 0) - + strlen(scanCommand)); - if (scanCommand[0] != '/' - && scanCommandPath != NULL && scanCommandPath[0] != '\0') { - strcpy(p, scanCommandPath); + + (appResources.scanCommandPath != NULL ? strlen(appResources.scanCommandPath) : 0) + + strlen(appResources.scanCommand)); + if (appResources.scanCommand[0] != '/' + && appResources.scanCommandPath != NULL && appResources.scanCommandPath[0] != '\0') { + strcpy(p, appResources.scanCommandPath); p += strlen(p) - 1; if (*p ++ != '/') { *p ++ = '/'; *p = '\0'; } } - strcat(p, scanCommand); + strcat(p, appResources.scanCommand); strcat(p, " "); strcat(p, spool_path); } else { - mhscan = False; + appResources.mhscan = False; } - if (mhscan && (fp = popen(scan_command, "r")) != NULL) { + if (appResources.mhscan && (fp = popen(scan_command, "r")) != NULL) { while ((c = getc(fp)) != EOF) put_in(c); put_in('\0'); @@ -1741,7 +1797,7 @@ return hbuf; } } - mhscan = False; + appResources.mhscan = False; return NULL; } #endif @@ -1756,7 +1812,7 @@ Audio_filehdr *au_hdr; audio_info_t ais; - if (mail_sndfile) { + if (appResources.mail_sndfile) { audiofd = open( "/dev/audio", O_WRONLY | O_NDELAY ); if (audiofd < 0) { @@ -1774,7 +1830,7 @@ } /* re-initialize */ AUDIO_INITINFO(&ais); - ais.play.gain = volume; + ais.play.gain = appResources.volume; if( ioctl( audiofd, AUDIO_SETINFO, &ais ) ) { fprintf(stderr, "%s: Problem setting /dev/audio info.\n", "Mailbox widget"); @@ -1782,11 +1838,11 @@ return; } - filefd = open(mail_sndfile, O_RDONLY); + filefd = open(appResources.mail_sndfile, O_RDONLY); if (filefd < 0) { fprintf(stderr, "%s: Couldn't play file \"%s\"\n", - "Mailbox widget", mail_sndfile); + "Mailbox widget", appResources.mail_sndfile); close(audiofd); return; } @@ -1818,7 +1874,7 @@ if (rn < 0) { fprintf(stderr, "%s: Error reading from file \"%s\"\n", - "Mailbox widget", mail_sndfile); + "Mailbox widget", appResources.mail_sndfile); close(audiofd); close(filefd); return; @@ -1845,7 +1901,7 @@ close(filefd); } else - XBell (display, volume); + XBell (display, appResources.volume); #else /* !SUN_AUDIO */ XBell (display, 0); #endif /* SUN_AUDIO */ @@ -1869,9 +1925,8 @@ struct stat file_stat; int len; long date; /* unused */ - static char buff[HEADER_LEN]; + static char buff[HEADER_LEN+1]; char *cp, *cp2; - long strtol(); if ((len = read(*fid, buff, HEADER_LEN)) == 0) { /* Erros occurs in child process. */ @@ -1883,12 +1938,12 @@ prog_name, child_process); exit(EXIT_FAILURE); } - + buff[len] = '\0'; mail_size = (int)strtol(buff, &cp, 10); if (mail_size > saved_mail_size) { /* NEW mail */ - if (popup == True || *cp == ' ') { + if (appResources.popup == True || *cp == ' ') { date = strtol(cp, &cp2, 10); if (*cp2 == '\0' || isspace(*cp2)) { get_mail_header((*cp2 == '\0') ? NULL : (cp2 + 1)); @@ -1898,30 +1953,31 @@ current_status = ARRIVE; XtResizeWidget(toplevel, Arrive_pixmap_width, Arrive_pixmap_height, 1); XtResizeWidget(biff, Arrive_pixmap_width, Arrive_pixmap_height, 0); - if (popup == True) { + if (appResources.popup == True) { BreakPopup(toplevel, (XtPointer) NULL, (XtPointer) NULL); } - if (raise == True) { + if (appResources.xpraise == True) { XRaiseWindow(XtDisplay(toplevel), XtWindow(toplevel)); } - if (animate == True && mail_header != NULL) { + if (appResources.animate == True && mail_header != NULL) { AnimateBiff(); } redraw_window(); #ifdef SHAPE shape_window(); #endif - if (popup == True) { + if (appResources.popup == True) { if (mail_header != NULL) { PopupMailHeader(mail_header); - if (popup_time) + if (appResources.popup_time) XtAppAddTimeOut(XtWidgetToApplicationContext(toplevel), - (unsigned long) popup_time, BreakPopup, NULL); + (unsigned long) appResources.popup_time, + (XtTimerCallbackProc) BreakPopup, NULL); } } XSync(XtDisplay(toplevel), 0); - if (bell == True) { + if (appResources.bell == True) { beep(XtDisplay(toplevel), 0); } } else if (mail_size < saved_mail_size){ @@ -1934,10 +1990,10 @@ #ifdef SHAPE shape_window(); #endif - if (popup == True) { + if (appResources.popup == True) { BreakPopup(toplevel, (XtPointer) NULL, (XtPointer) NULL); } - if (raise == True && stay_raised == False) { + if (appResources.xpraise == True && appResources.stay_raised == False) { XLowerWindow(XtDisplay(toplevel), XtWindow(toplevel)); } free(mail_header); @@ -1957,24 +2013,29 @@ char *cp; int header_count = 0; char tmp[HEADER_LEN]; - char *strtok(); char *new_header; if (buf == NULL) return; strcpy(tmp, buf); cp = strtok(tmp, "\n"); while(cp != NULL) { - if (strncmp("From:", cp, strlen("From:")) == 0) { + if (strncmp("From:", cp, 5) == 0) { from = cp; + if (from[strlen(from)-1] == '\r') { + from[strlen(from)-1] = '\0'; + } header_count++; - } else if (strncmp("Subject:", cp, strlen("Subject:")) == 0) { + } else if (strncmp("Subject:", cp, 8) == 0) { subject = cp; + if (subject[strlen(subject)-1] == '\r') { + subject[strlen(subject)-1] = '\0'; + } header_count++; } if (header_count > 1 || *cp == '\0') break; cp = strtok(NULL, "\n"); } - if (preserve == False) { + if (appResources.preserve == False) { free(mail_header); mail_header = NULL; } @@ -2024,16 +2085,17 @@ if (current_status == ARRIVE) { redraw_window(); - if (popup == True) { + if (appResources.popup == True) { BreakPopup(toplevel, (XtPointer) NULL, (XtPointer) NULL); if (mail_header != NULL) { PopupMailHeader(mail_header); } - if (popup_time) + if (appResources.popup_time) XtAppAddTimeOut(XtWidgetToApplicationContext(toplevel), - (unsigned long) popup_time, BreakPopup, NULL); + (unsigned long) appResources.popup_time, + (XtTimerCallbackProc) BreakPopup, NULL); } - if (raise == True) { + if (appResources.xpraise == True) { XRaiseWindow(XtDisplay(toplevel), XtWindow(toplevel)); } #ifdef SHAPE @@ -2049,4 +2111,27 @@ { kill(0, SIGTERM); /* kill all the children */ } + +static void +sig_cld() +{ + pid_t pid; + +#ifdef USE_POSIX_WAIT + int status; +#elif defined(__FreeBSD__) + int status; +#else /* not USE_POSIX_WAIT */ + union wait status; +#endif /* not USE_POSIX_WAIT */ + + pid = WAITPID(-1, &status, WNOHANG); + fprintf(stderr, "%s: Catch signal CLD\n", prog_name); + + if (0 < pid) { + exit(EXIT_FAILURE); /* Should print child status? */ + } + signal(SIGCLD, sig_cld); +} + #endif /* YOUBIN */