Hello,
so, I suggest the attached patch for a solution. It removes most compile
time warnings and makes xmotd to not crash (tested on stretch amd64).
Regards
Christoph
Remove compiler and linker warnings
Index: xmotd-1.17.3b/atom.c
===================================================================
--- xmotd-1.17.3b.orig/atom.c 2018-02-13 10:44:27.104309051 +0100
+++ xmotd-1.17.3b/atom.c 2018-02-13 10:44:27.096309028 +0100
@@ -29,6 +29,7 @@
*/
#include <stdio.h>
+#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <pwd.h>
Index: xmotd-1.17.3b/main.c
===================================================================
--- xmotd-1.17.3b.orig/main.c 2018-02-13 10:44:27.104309051 +0100
+++ xmotd-1.17.3b/main.c 2018-02-13 10:44:27.096309028 +0100
@@ -205,9 +205,10 @@
<Expose>: end-of-file()";
char *
-getTimeStampName()
+getTimeStampName(void)
{
static char buf[256];
+ int result;
sprintf(buf, "%s/%s", getenv("HOME"), app_res.stampfile);
@@ -215,10 +216,12 @@
{
char domainame[256];
- getdomainname(domainame, 256);
+ result = getdomainname(domainame, 256);
strcat(buf, ".");
- strcat(buf, domainame);
+
+ if (result == 0)
+ strcat(buf, domainame);
}
return(buf);
@@ -394,7 +397,7 @@
if ((dir = opendir(argv[i])))
{
- while (dp = readdir(dir))
+ while ((dp = readdir(dir)))
{
if (dp->d_ino == 0)
continue;
@@ -481,139 +484,21 @@
/* next check if any messages need to be displayed, if there
aren't any, go back to sleep; otherwise return to display
messages*/
- if(numsg=numFilesToDisplay(gargc, gargv)) return(numsg);
- }
-
-}
-
-
-main(argc, argv)
-int argc;
-char **argv;
-{
- extern Boolean atomExists(String);
- Display *display;
- register int i, start=0;
- int numsg;
-
-
- if ((argc > 1) && !(strcmp(argv[1],"-help")))
- {
- printUsage(argv[0]); /* and exit */
- }
-
- /* Test to see whether we are connected to an X display. If we
- aren't, we proceed in text-only mode: bare-bones functionality;
- output to stdout. Why bare-bones, I hear you asking? Well, X
- does all the command-line options parsing for me and I don't feel
- like duplicating all that code. So there.*/
-
- if((display=XOpenDisplay((char *)NULL))==NULL)
- {
-
- if(argc<2)
- {
- fprintf(stderr, "xmotd: ERROR, missing file.\n");
- printUsage(argv[0]); /* and exit */
- }
- else
- {
- extern void runInTextMode();
- runInTextMode(argc, argv); /* ...and exit... */
- }
-
- fprintf(stderr,"Never gets here!\n");
- exit(0); /* just in case */
-
- }
- else
- {
- XCloseDisplay(display);
- }
-
- /* we have to init the toolkit *before* we check the command-line so
- we can use X's parsing routines, since -geom options, etc. may be
- specified, in which case, the motd-filename is *not* the 2nd
- argument*/
- topLevel = XtVaAppInitialize(&app_con, "XMotd", options,
- XtNumber(options),
- &argc, argv, fallback_resources,
- NULL);
-
- XtGetApplicationResources(topLevel, (caddr_t) &app_res,
- resources, XtNumber(resources),
- (ArgList) NULL, (Cardinal) 0);
-
- if(argc<2)
- {
- fprintf(stderr,"xmotd: ERROR, missing file\n");
- printUsage(argv[0]); /* and exit */
- }
-
- if(app_res.paranoid && !app_res.warnfile)
- {
- fprintf(stderr,"xmotd: ERROR, specified \"-paranoid\" without \"-warnfile\"\n");
- printUsage(argv[0]); /* and exit */
- }
-
- strcpy(timeStamp, getTimeStampName());
-
- gargc=argc;
- gargv=argv;
-
- /* first figure out how many of the files supplied on the
- command-line we will be actually displaying; i.e. we only show
- the new ones (unless -always has been specified, in which case we
- show all of them)*/
- numsg=numFilesToDisplay(argc, argv);
-
- if(!app_res.periodic && !numsg)
- {
- /* if none of the messages need to be displayed and -wakeup not
- specified */
-
- XtDestroyApplicationContext(app_con);
- exit(0);
- }
-
- if(app_res.periodic) /*-wakeup or -timeout specified*/
- {
-
- /*ensure no other copies of xmotd are running*/
- if(atomExists(app_res.atomname)){
- XtDestroyApplicationContext(app_con);
- exit(0);
- }
-
- if(fork()) exit(0); /*we have to daemonize ourselves*/
- alreadyForked=1; /* make a note of it */
-
- if(!numsg)
- {
- /* if no messages to be displayed, we sleep */
- numsg=runSilentRunDeep(getAlarmTime(app_res.periodic));
- }
-
+ if((numsg=numFilesToDisplay(gargc, gargv))) return(numsg);
}
- createWidgets(numsg);
- nextMessage((Widget)NULL, (caddr_t)NULL, (caddr_t)NULL);
-
- XtAddEventHandler(topLevel, (EventMask)0, True,
- (XtEventHandler)_XEditResCheckMessages, 0);
-
- XtRealizeWidget(topLevel);
- XtAppMainLoop(app_con);
}
-createWidgets(int anymsg)
+void createWidgets(int anymsg)
{
- Widget form, paned, logo, mlabel, hline;
+ Widget form, logo, mlabel, hline;
XtTranslations shift1TransTable, tailTransTable;
Pixel fg, bg;
+ #ifdef MOTIF
Arg args[8];
int n;
+ #endif
#ifdef MOTIF
XmString xmstr;
@@ -805,3 +690,124 @@
}/* createWidgets*/
+
+int
+main(argc, argv)
+int argc;
+char **argv;
+{
+ extern Boolean atomExists(String);
+ Display *display;
+ int numsg;
+
+
+ if ((argc > 1) && !(strcmp(argv[1],"-help")))
+ {
+ printUsage(argv[0]); /* and exit */
+ }
+
+ /* Test to see whether we are connected to an X display. If we
+ aren't, we proceed in text-only mode: bare-bones functionality;
+ output to stdout. Why bare-bones, I hear you asking? Well, X
+ does all the command-line options parsing for me and I don't feel
+ like duplicating all that code. So there.*/
+
+ if((display=XOpenDisplay((char *)NULL))==NULL)
+ {
+
+ if(argc<2)
+ {
+ fprintf(stderr, "xmotd: ERROR, missing file.\n");
+ printUsage(argv[0]); /* and exit */
+ }
+ else
+ {
+ extern void runInTextMode();
+ runInTextMode(argc, argv); /* ...and exit... */
+ }
+
+ fprintf(stderr,"Never gets here!\n");
+ exit(0); /* just in case */
+
+ }
+ else
+ {
+ XCloseDisplay(display);
+ }
+
+ /* we have to init the toolkit *before* we check the command-line so
+ we can use X's parsing routines, since -geom options, etc. may be
+ specified, in which case, the motd-filename is *not* the 2nd
+ argument*/
+ topLevel = XtVaAppInitialize(&app_con, "XMotd", options,
+ XtNumber(options),
+ &argc, argv, fallback_resources,
+ NULL);
+
+ XtGetApplicationResources(topLevel, (caddr_t) &app_res,
+ resources, XtNumber(resources),
+ (ArgList) NULL, (Cardinal) 0);
+
+ if(argc<2)
+ {
+ fprintf(stderr,"xmotd: ERROR, missing file\n");
+ printUsage(argv[0]); /* and exit */
+ }
+
+ if(app_res.paranoid && !app_res.warnfile)
+ {
+ fprintf(stderr,"xmotd: ERROR, specified \"-paranoid\" without \"-warnfile\"\n");
+ printUsage(argv[0]); /* and exit */
+ }
+
+ strcpy(timeStamp, getTimeStampName());
+
+ gargc=argc;
+ gargv=argv;
+
+ /* first figure out how many of the files supplied on the
+ command-line we will be actually displaying; i.e. we only show
+ the new ones (unless -always has been specified, in which case we
+ show all of them)*/
+ numsg=numFilesToDisplay(argc, argv);
+
+ if(!app_res.periodic && !numsg)
+ {
+ /* if none of the messages need to be displayed and -wakeup not
+ specified */
+
+ XtDestroyApplicationContext(app_con);
+ exit(0);
+ }
+
+ if(app_res.periodic) /*-wakeup or -timeout specified*/
+ {
+
+ /*ensure no other copies of xmotd are running*/
+ if(atomExists(app_res.atomname)){
+ XtDestroyApplicationContext(app_con);
+ exit(0);
+ }
+
+ if(fork()) exit(0); /*we have to daemonize ourselves*/
+ alreadyForked=1; /* make a note of it */
+
+ if(!numsg)
+ {
+ /* if no messages to be displayed, we sleep */
+ numsg=runSilentRunDeep(getAlarmTime(app_res.periodic));
+ }
+
+ }
+
+ createWidgets(numsg);
+ nextMessage((Widget)NULL, (caddr_t)NULL, (caddr_t)NULL);
+
+ XtAddEventHandler(topLevel, (EventMask)0, True,
+ (XtEventHandler)_XEditResCheckMessages, 0);
+
+ XtRealizeWidget(topLevel);
+ XtAppMainLoop(app_con);
+
+ return 0;
+}
Index: xmotd-1.17.3b/textmode.c
===================================================================
--- xmotd-1.17.3b.orig/textmode.c 2018-02-13 10:44:27.104309051 +0100
+++ xmotd-1.17.3b/textmode.c 2018-02-13 10:44:27.096309028 +0100
@@ -40,6 +40,9 @@
#include <fcntl.h>
#include "maindefs.h"
+#include "prototypes.h"
+
+extern time_t motdChanged();
void
runInTextMode(argc, argv)
@@ -50,8 +53,6 @@
register int i, displayed=0;
float sleepPeriod=0.0;
- static int onceAlready;
-
static char buf[256], stampfile[256];
memset(buf, 0, 256);
memset(stampfile, 0, 256);
Index: xmotd-1.17.3b/xlogo.bm
===================================================================
--- xmotd-1.17.3b.orig/xlogo.bm 2018-02-13 10:44:27.104309051 +0100
+++ xmotd-1.17.3b/xlogo.bm 2018-02-13 12:06:52.182920103 +0100
@@ -1,5 +1,6 @@
#define xlogo_width 100
#define xlogo_height 100
+#ifndef HAVE_XPM
static char xlogo_bits[] = {
0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xfe,0xff,
0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xfc,0xff,0xff,0x07,
@@ -88,3 +89,4 @@
0xf1,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xf3,0xfc,
0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xf7,0xfe,0x03,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff};
+#endif
Index: xmotd-1.17.3b/xmotd.c
===================================================================
--- xmotd-1.17.3b.orig/xmotd.c 2018-02-13 10:44:27.104309051 +0100
+++ xmotd-1.17.3b/xmotd.c 2018-02-13 11:06:49.756282943 +0100
@@ -70,6 +70,7 @@
#include "maindefs.h"
#include "main.h"
+#include "prototypes.h"
extern time_t motdChanged();
extern messageptr freeMessage();
@@ -85,6 +86,70 @@
char *txtbuf; /* file is loaded into this malloc'd pointer */
+void
+displayMessage(char *filename)
+{
+ FILE *fp;
+ struct stat motdstat;
+ extern Widget text;
+
+/* fprintf(stderr,"displayMessage()\n"); */
+
+#ifdef MOTIF
+ XmString xmstr;
+#endif
+
+/* memset((char *)(&motdstat), 0, sizeof(struct stat));*/
+
+ if((fp=fopen(filename,"r"))==NULL) /* Read it in...*/
+ {
+ perror(filename);
+ return; /* no file by this name*/
+ }
+
+ stat(filename,&motdstat);
+ if(txtbuf) free(txtbuf);
+
+ txtbuf=(char *)calloc(1, (motdstat.st_size+1)*sizeof(char));
+
+ if(!txtbuf)
+ {
+ extern XtAppContext app_con;
+
+ perror("xmotd");
+ XtDestroyApplicationContext(app_con);
+ exit(2);
+ }
+
+ fread(txtbuf,(int)motdstat.st_size,1,fp);
+
+ fclose(fp);
+
+#ifdef MOTIF
+
+#ifdef HAVE_HTML
+
+ HTMLSetText(text,txtbuf,NULL,NULL,0,NULL,NULL);
+
+#else
+ XtVaSetValues(text, XmNvalue, txtbuf, NULL);
+#endif
+
+#else
+
+#ifdef HAVE_HTML
+
+ HTMLSetText(text,txtbuf,NULL,NULL,0,NULL,NULL);
+
+#else
+ XtVaSetValues(text, XtNstring, txtbuf, NULL);
+#endif
+
+#endif
+
+}/* displayMessage*/
+
+
void
/*ARGSUSED*/
nextMessage(Widget w, caddr_t call_data, caddr_t client_data)
@@ -170,8 +235,6 @@
void
revisitMessagesAndDisplay(int numsg)
{
- extern int gargc;
- extern char **gargv;
extern Widget topLevel, quit;
extern void Quit(Widget w, caddr_t call_data, caddr_t client_data);
@@ -203,70 +266,3 @@
XFlush(XtDisplay(topLevel));
}
-
-
-int
-displayMessage(char *filename)
-{
- FILE *fp;
- struct stat motdstat;
- extern Widget text;
-
-/* fprintf(stderr,"displayMessage()\n"); */
-
-#ifdef MOTIF
- XmString xmstr;
-#endif
-
-/* memset((char *)(&motdstat), 0, sizeof(struct stat));*/
-
- if((fp=fopen(filename,"r"))==NULL) /* Read it in...*/
- {
- perror(filename);
- return(0); /* no file by this name*/
- }
-
- stat(filename,&motdstat);
- if(txtbuf) free(txtbuf);
-
- txtbuf=(char *)calloc(1, (motdstat.st_size+1)*sizeof(char));
-
- if(!txtbuf)
- {
- extern XtAppContext app_con;
-
- perror("xmotd");
- XtDestroyApplicationContext(app_con);
- exit(2);
- }
-
- fread(txtbuf,(int)motdstat.st_size,1,fp);
-
- fclose(fp);
-
-#ifdef MOTIF
-
-#ifdef HAVE_HTML
-
- HTMLSetText(text,txtbuf,NULL,NULL,0,NULL,NULL);
-
-#else
- XtVaSetValues(text, XmNvalue, txtbuf, NULL);
-#endif
-
-#else
-
-#ifdef HAVE_HTML
-
- HTMLSetText(text,txtbuf,NULL,NULL,0,NULL,NULL);
-
-#else
- XtVaSetValues(text, XtNstring, txtbuf, NULL);
-#endif
-
-#endif
-
- return(1);
-
-}/* displayMessage*/
-
Index: xmotd-1.17.3b/Imakefile
===================================================================
--- xmotd-1.17.3b.orig/Imakefile 2018-02-13 10:44:27.104309051 +0100
+++ xmotd-1.17.3b/Imakefile 2018-02-13 10:44:27.096309028 +0100
@@ -60,7 +60,7 @@
SRCS = main.c xmotd.c changed.c textmode.c usage.c browser.c logo.c atom.c
OBJS = main.o xmotd.o changed.o textmode.o usage.o browser.o logo.o atom.o
- INCLS = maindefs.h appdefs.h main.h
+ INCLS = maindefs.h appdefs.h main.h prototypes.h
CDEBUGFLAGS = -g
MANSUFFIX = 8
Index: xmotd-1.17.3b/Makefile
===================================================================
--- xmotd-1.17.3b.orig/Makefile 2018-02-13 10:44:27.104309051 +0100
+++ xmotd-1.17.3b/Makefile 2018-02-13 10:44:27.096309028 +0100
@@ -497,7 +497,7 @@
SRCS = main.c xmotd.c changed.c textmode.c usage.c browser.c logo.c atom.c
OBJS = main.o xmotd.o changed.o textmode.o usage.o browser.o logo.o atom.o
- INCLS = maindefs.h appdefs.h main.h
+ INCLS = maindefs.h appdefs.h main.h prototypes.h
CDEBUGFLAGS = -g
MANSUFFIX = 8
Index: xmotd-1.17.3b/prototypes.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ xmotd-1.17.3b/prototypes.h 2018-02-13 10:46:01.608588566 +0100
@@ -0,0 +1,5 @@
+#ifndef _XMOTD_PROTOTYPES_H
+#define _XMOTD_PROTOTYPES_H
+void updateTimeStamp(char *motdfile);
+char * getTimeStampName(void);
+#endif