ports/69091: [Fix] mbone/imm does not build on FreeBSD
Samy Al Bahra
samy at kerneled.org
Thu Jul 15 10:50:24 UTC 2004
>Number: 69091
>Category: ports
>Synopsis: [Fix] mbone/imm does not build on FreeBSD
>Confidential: no
>Severity: critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Jul 15 10:50:23 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator: Samy Al Bahra
>Release: FreeBSD 5.2-CURRENT
>Organization:
Kerneled
>Environment:
>Description:
The mbone/imm port does not build on FreeBSD due to it's ancient
varargs.h usage. This fix provides a full solution by providing
a stdargs.h alternative to the routines requiring this functionality.
>How-To-Repeat:
Build unpatched mbone/imm port on FreeBSD.
>Fix:
Add the following file (patch-src::utils.c) to the files/ folder of
the port as an additional patch.
The patch may also be found here:
http://samy.kerneled.org/patches/imm-patch.diff
>Release-Note:
>Audit-Trail:
>Unformatted:
>>>>>>>>>>>>>>> Begin patch >>>>>>>>>>>>
--- src/utils.c.orig Thu Jul 15 12:37:25 2004
+++ src/utils.c Thu Jul 15 13:36:09 2004
@@ -20,7 +20,7 @@
* These notices must be retained in any copies of any part of this software.
******************************************************************************/
#include <stdio.h>
-#include <varargs.h>
+#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#ifdef __NetBSD__
@@ -40,47 +40,118 @@
/*----------------------------------------------------------------------------*/
-void warn( va_alist )
-va_dcl
+/* Allocate memory for format string buffers */
+int
+vfsalloc(char *fmt, va_list ap)
{
- va_list args;
- char *fmt;
+ char *s;
+ int i, n = 0, len = 0;
- va_start( args );
- fmt = va_arg( args, char * );
- fprintf( stderr, "Warning: " );
- vfprintf( stderr, fmt, args );
- va_end( args );
+ if (!fmt)
+ return 0;
+
+ s = strchr(fmt, '%');
+
+ while (s) {
+ ++s;
+ ++n;
+
+ switch (*s) {
+ case 'd':
+ i = va_arg(ap, int);
+ len += 1 + sizeof(int)<<1;
+ break;
+ case 's':
+ len += strlen(va_arg(ap, char *));
+ break;
+ }
+ s = strchr(s, '%');
+ }
+
+ len += strlen(fmt) - (2 * n);
+
+ return len;
+}
+
+void warn( char *fmt, ... )
+{
+ va_list ap;
+ char *buf, *s;
+ int len;
+
+ if (!fmt)
+ return;
+
+ va_start(ap, fmt);
+ if (!(len = vfsalloc(fmt, ap)))
+ return;
+ va_end(ap);
+
+ if (!(buf = malloc(len)))
+ return;
+
+ va_start(ap, fmt);
+ vsprintf(buf, fmt, ap);
+ va_end(ap);
+
+ fprintf(stderr, "Warning: %s\n", buf);
+ free(buf);
}
/*----------------------------------------------------------------------------*/
-void die( va_alist )
-va_dcl
+void die(char *fmt, ... )
{
- va_list args;
- char *fmt;
+ va_list ap;
+ char *buf, *s;
+ int len;
+
+ if (!fmt)
+ return;
+
+ va_start(ap, fmt);
+ if (!(len = vfsalloc(fmt, ap)))
+ return;
+ va_end(ap);
+
+ if (!(buf = malloc(len)))
+ return;
- va_start( args );
- fmt = va_arg( args, char * );
- fprintf( stderr, "Error: " );
- vfprintf( stderr, fmt, args );
- exit( 1 );
+ va_start(ap, fmt);
+ vsprintf(buf, fmt, ap);
+ va_end(ap);
+
+ fprintf(stderr, "Error: %s\n", buf);
+ free(buf);
+ exit(1);
}
/*----------------------------------------------------------------------------*/
-void fatal( va_alist )
-va_dcl
+void fatal(char *fmt, ... )
{
- va_list args;
- char *fmt;
+ va_list ap;
+ char *buf, *s;
+ int len;
+
+ if (!fmt)
+ return;
- va_start( args );
- fmt = va_arg( args, char * );
- fprintf( stderr, "Internal Error: " );
- vfprintf( stderr, fmt, args );
- exit( 2 );
+ va_start(ap, fmt);
+ if (!(len = vfsalloc(fmt, ap)))
+ return;
+ va_end(ap);
+
+ if (!(buf = malloc(len)))
+ return;
+
+ va_start(ap, fmt);
+ vsprintf(buf, fmt, ap);
+ va_end(ap);
+
+ fprintf(stderr, "Internal error: %s\n", buf);
+ free(buf);
+ exit(2);
}
/*----------------------------------------------------------------------------*/
@@ -142,21 +213,34 @@
/*----------------------------------------------------------------------------*/
-void mailmessage( va_alist )
-va_dcl
+void mailmessage(char *fmt, ... )
{
- va_list args;
- char *fmt;
+ va_list ap;
+ char *buf, s;
+ int len;
FILE *popen(), *fp;
char cmdline[80];
if (whome == NULL) whome = getlogin();
sprintf(cmdline,"%s %s",mailprog,whome);
fp = popen(cmdline,"w");
- va_start( args );
- fmt = va_arg( args, char * );
- fprintf( fp, "MNM Warning: " );
- vfprintf( fp, fmt, args );
- va_end( args );
+
+ if (!fmt)
+ return;
+
+ va_start(ap, fmt);
+ if (!(len = vfsalloc(fmt, ap)))
+ return;
+ va_end(ap);
+
+ if (!(buf = malloc(len)))
+ return;
+
+ va_start(ap, fmt);
+ vsprintf(buf, fmt, ap);
+ va_end(ap);
+
+ fprintf(fp, "MNM Warning: %s", buf);
+ free(buf);
pclose(fp);
}
More information about the freebsd-ports-bugs
mailing list