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