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

Reply via email to