Hello,

Below are a small set of patches that should restore a full build of
ast-open to FreeBSD 9. I'm still quite new to iffe, though, so if
there are better ways to do what I've done below, please don't
hesitate to let me know. So much of my work (both professional and
personal) uses ast-open heavily, and this seems like the very least I
can do. To be clear, the build succeeds, but they don't cleanly pass
all regression tests.

I'm proceeding from the 2014 Mar 01 release, and I have applied the
patches that appeared on ast-developers from Nathen Weeks (see email
2014 Feb 05) and Werner Fink (2014 Feb 21). Those patches are not
included below.

At a glance, most of what's below simply looks like they're issues
that were covered up by definitions that are used on other OS's, which
is probably why they haven't been seen in so long. Hopefully, my
changes here don't break those other builds where ast-open is already
building cleanly.

Best regards,
Bob



== Standards and Functionality ==

--- ast.patched/src/lib/libast/features/standards       2013-08-27 
09:16:58.000000000 -0400
+++ ast.working/src/lib/libast/features/standards       2014-04-01 
17:42:42.000000000 -0400
@@ -1,5 +1,19 @@
 set stdio
-if tst note{ _GNU_SOURCE works }end compile{
+# In FreeBSD, definitions like _POSIX_SOURCE and such are used to *limit*
+# functionality to known API; they don't enable anything. The general intent in
+# BSD is to enable everything by default (effectively, providing the
+# _KITCHEN_SINK_SOURCE mentioned below). So we look for that here, but stay
+# careful that we don't get fooled by presence of FreeBSD that underpins some
+# subsystems in Mac OS X; there are other Apple-specific portability hacks
+# elsewhere we should not interfere with.
+if tst note{ FreeBSD }end compile{
+               #include <sys/param.h>
+               #if !defined(__FreeBSD__) || defined(APPLE)
+               #error not a FreeBSD system
+               #endif
+       }end {
+       }
+elif tst note{ _GNU_SOURCE works }end compile{
                #define _GNU_SOURCE 1
                #include <sys/types.h>
                #include <sys/stat.h>



== stdio and wchar ==

Ugh. This was annoying to hunt down. Because of conflicting
definitions of FILE in both AST and stdio, we fell into the trap of
trying to define the sfio structure as something else. The #define
below keeps it straight on FreeBSD, but it could be that
_STDFILE_DECLARED causes trouble for some other OS. Please let me
know if this hits someone.

--- ast.patched/src/lib/libast/features/wchar   2013-09-17 11:56:58.000000000 
-0400
+++ ast.working/src/lib/libast/features/wchar   2014-04-01 16:14:24.000000000 
-0400
@@ -6,6 +6,7 @@
 cat{
        #ifndef _AST_WCHAR_H
        #define _AST_WCHAR_H    1
+       #define _STDFILE_DECLARED
 }end
 
 lib    mbstowcs,wctomb,wcscmp,wcscoll,wcslen,wcstombs,wcsxfrm,wcwidth stdlib.h 
stdio.h wchar.h



== procfs and kvm ==

Support for /proc and kvm methods are a little deceiving, as there are
implementations out there that don't have the PIOCPSINFO ioctl or
other system structure members. The procfs code and the kvm code in
ast-open, as written, assumes a lot of those structures, so this patch
mostly just tightens up the criteria under which procfs or kvm will be
selected for use.

I know the responsible thing to do is to go back here and port the
code so that it works with a wider range of implementations of procfs
and/or kvm. For right now, though, this is enough to kill the "false
positives" in features that prevent compilation.

--- ast.patched/src/cmd/std/features/procfs     2011-12-13 16:12:59.000000000 
-0500
+++ ast.working/src/cmd/std/features/procfs     2014-04-01 16:10:22.000000000 
-0400
@@ -1,6 +1,6 @@
 hdr    kvm,procinfo,pstat,asm/param
 
-sys    procfs,sysctl
+sys    procfs,sysctl,user
 
 lib    getprocs
 lib    kvm_open,kvm_getprocs kvm.h sys/time.h sys/param.h sys/proc.h 
sys/sysctl.h -lkvm
@@ -10,7 +10,11 @@
 mem    procsinfo64.pi_pri procinfo.h
 mem    
prpsinfo.pr_clname,prpsinfo.pr_cstime,prpsinfo.pr_cstime.tv_sec,prpsinfo.pr_ctime,prpsinfo.pr_cutime,prpsinfo.pr_gid,prpsinfo.pr_lttydev,prpsinfo.pr_ntpid,prpsinfo.pr_pgid,prpsinfo.pr_pgrp,prpsinfo.pr_psargs,prpsinfo.pr_refcount,prpsinfo.pr_rssize,prpsinfo.pr_sid,prpsinfo.pr_sonproc,prpsinfo.pr_start,prpsinfo.pr_start.tv_sec,prpsinfo.pr_starttime,prpsinfo.pr_starttime.tv_sec,prpsinfo.pr_state,prpsinfo.pr_stime,prpsinfo.pr_tgrp,prpsinfo.pr_time,prpsinfo.pr_time.tv_sec,prpsinfo.pr_utime,prpsinfo.pr_zomb,prpsinfo.pr_pctcpu,prpsinfo.pr_cpu,prpsinfo.pr_lwp.pr_pctcpu,prpsinfo.pr_lwp.pr_cpu
 -D_STRUCTURED_PROC -Dprpsinfo=psinfo sys/types.h sys/procfs.h
 
+num    PIOCPSINFO
+
 typ    struct.prpsinfo -D_STRUCTURED_PROC -Dprpsinfo=psinfo sys/types.h 
sys/procfs.h
+typ    struct.kinfo_proc sys/types.h sys/procfs.h sys/user.h
+typ    struct.kp_proc sys/types.h sys/procfs.h sys/user.h
 
 tst    lib_info note{ info(2) kernel table api }end link{
        #include <info.h>
@@ -587,11 +591,11 @@
 #define PSS_METHOD             PSS_METHOD_getprocs
 #endif
 
-#if !PSS_METHOD && defined(_PS_dir)
+#if !PSS_METHOD && defined(_PS_dir) && (_PS_scan_binary || _num_PIOCPSINFO)
 #define PSS_METHOD             PSS_METHOD_procfs
 #endif
 
-#if !PSS_METHOD && _hdr_kvm && _sys_sysctl && _lib_kvm_open && 
_lib_kvm_getprocs
+#if !PSS_METHOD && _hdr_kvm && _sys_sysctl && _lib_kvm_open && 
_lib_kvm_getprocs && _typ_struct_kinfo_proc && _typ_struct_kp_proc
 #define PSS_METHOD             PSS_METHOD_kvm
 #endif

--- ast.patched/src/cmd/std/pss-kvm.c   2008-09-10 23:47:15.000000000 -0400
+++ ast.working/src/cmd/std/pss-kvm.c   2014-04-01 16:11:02.000000000 -0400
@@ -43,6 +43,9 @@
 #if _sys_proc
 #include <sys/proc.h>
 #endif
+#if _sys_user
+#include <sys/user.h>
+#endif
 #include <sys/sysctl.h>
 #include <sys/tty.h>
 


== ksh93 poll ==

Just a minor glitch in the comment for the _socketpair_devfd macro
that triggers an early end of its comment.

--- ast.patched/src/cmd/ksh93/features/poll     2013-06-26 11:20:14.000000000 
-0400
+++ ast.working/src/cmd/ksh93/features/poll     2014-04-01 17:59:32.000000000 
-0400
@@ -66,7 +66,7 @@
                return(1);
        }
 }end
-tst    socketpair_devfd -D_AST_INTERCEPT=0 note{ /proc/*/fd/N or /dev/fd/N 
handles socketpair() }end execute{
+tst    socketpair_devfd -D_AST_INTERCEPT=0 note{ /proc/.../fd/N or /dev/fd/N 
handles socketpair() }end execute{
        #include <ast.h>
        #include <fs3d.h>
        #include <sys/types.h>



== ksh93 macro.c ==

Looks like just a small typo? Or, perhaps, _fd_self_dir_fmt implies
the definition of _fd_pid_dir_fmt on some systems and I missed it? But
since I believe this is supposed to be a local process-centric view of
the file descriptors, I think this is safe even if that were true.
Otherwise, we could just fallback to using /dev/fd instead since that
works just fine on BSD.

--- ast.patched/src/cmd/ksh93/sh/macro.c        2013-09-30 14:18:13.000000000 
-0400
+++ ast.working/src/cmd/ksh93/sh/macro.c        2014-04-01 16:09:43.000000000 
-0400
@@ -2741,7 +2741,7 @@
                sfprintf(shp->stk, _fd_pid_dir_fmt, (long)getpid(), fd,"","");
 #else
 #   ifdef _fd_self_dir_fmt
-               sfprintf(shp->stk,_fd_pid_dir_fmt,fd,"","");
+               sfprintf(shp->stk,_fd_self_dir_fmt,fd,"","");
 #   else
                sfprintf(shp->stk,"/dev/fd/%d", fd);
 #   endif



== proto.c ==

It's not clear which error() is implied here. I saw the earlier
comment that proto is intended to be light on requiring other
libraries, so I just dropped in an obvious standalone version.

--- ast.patched/src/cmd/proto/proto.c   2012-02-21 00:54:40.000000000 -0500
+++ ast.working/src/cmd/proto/proto.c   2014-04-01 18:27:34.000000000 -0400
@@ -396,6 +396,15 @@
 
 #if !PROTO_STANDALONE
 #undef error
+void
+error( int xit, const char *msg, ... )
+{
+       va_list ap;
+       va_start( ap, msg );
+       vfprintf( stderr, msg, ap );
+       va_end( ap );
+       exit( xit );
+}
 #endif
 
 typedef struct Sufcom_s



== setlocale.c ==

Just a missing #include, no big deal.

--- ast.patched/src/lib/libast/comp/setlocale.c 2013-11-21 02:13:21.000000000 
-0500
+++ ast.working/src/lib/libast/comp/setlocale.c 2014-04-01 16:11:28.000000000 
-0400
@@ -38,6 +38,7 @@
 #include <namval.h>
 #include <iconv.h>
 #include <codeset.h>
+#include <errno.h>
 
 #if ( _lib_wcwidth || _lib_wctomb ) && _hdr_wctype
 #include <wctype.h>



== strexpr.c error() ==

Just cleaning up a local symbol conflict. error is already something
else in this code.

--- ast.patched/src/lib/libast/string/strexpr.c 1997-09-02 13:51:29.000000000 
-0400
+++ ast.working/src/lib/libast/string/strexpr.c 2014-04-01 17:11:17.000000000 
-0400
@@ -44,7 +44,7 @@
 #define peekchr(ex)    (*(ex)->nextchr)
 #define ungetchr(ex)   ((ex)->nextchr--)
 
-#define error(ex,msg)  return(seterror(ex,msg))
+#define err(ex,msg)    return(seterror(ex,msg))
 
 typedef struct                         /* expression handle            */
 {
@@ -87,7 +87,7 @@
        case 0:
                ungetchr(ex);
                if (!precedence) return(0);
-               error(ex, "more tokens expected");
+               err(ex, "more tokens expected");
        case '-':
                n = -expr(ex, 13);
                break;
@@ -113,17 +113,17 @@
                case 0:
                        goto done;
                case ')':
-                       if (!precedence) error(ex, "too many )'s");
+                       if (!precedence) err(ex, "too many )'s");
                        goto done;
                case '(':
                        n = expr(ex, 1);
                        if (getchr(ex) != ')')
                        {
                                ungetchr(ex);
-                               error(ex, "closing ) expected");
+                               err(ex, "closing ) expected");
                        }
                gotoperand:
-                       if (operand) error(ex, "operator expected");
+                       if (operand) err(ex, "operator expected");
                        operand = 1;
                        continue;
                case '?':
@@ -140,7 +140,7 @@
                                if (getchr(ex) != ':')
                                {
                                        ungetchr(ex);
-                                       error(ex, ": expected for ? operator");
+                                       err(ex, ": expected for ? operator");
                                }
                                if (n)
                                {
@@ -189,7 +189,7 @@
                        break;
                case '=':
                case '!':
-                       if (peekchr(ex) != '=') error(ex, "operator syntax 
error");
+                       if (peekchr(ex) != '=') err(ex, "operator syntax 
error");
                        if (precedence > 7) goto done;
                        getchr(ex);
                        x = expr(ex, 8);
@@ -237,7 +237,7 @@
                        if (precedence > 11) goto done;
                        x = expr(ex, 12);
                        if (c == '*') n *= x;
-                       else if (x == 0) error(ex, "divide by zero");
+                       else if (x == 0) err(ex, "divide by zero");
                        else if (c == '/') n /= x;
                        else n %= x;
                        break;
@@ -246,15 +246,15 @@
                        pos = --ex->nextchr;
                        if (isdigit(c)) n = strton(ex->nextchr, &ex->nextchr, 
NiL, 0);
                        else if (ex->convert) n = (*ex->convert)(ex->nextchr, 
&ex->nextchr, ex->handle);
-                       if (ex->nextchr == pos) error(ex, "syntax error");
+                       if (ex->nextchr == pos) err(ex, "syntax error");
                        goto gotoperand;
                }
                if (ex->errmsg) return(0);
-               if (!operand) error(ex, "operand expected");
+               if (!operand) err(ex, "operand expected");
        }
  done:
        ungetchr(ex);
-       if (!operand) error(ex, "operand expected");
+       if (!operand) err(ex, "operand expected");
        return(n);
 }
 


-- 
Bob Krzaczek, Chester F. Carlson Center for Imaging Science, RIT
phone +1-585-4757196, email k...@cis.rit.edu, icbm 43.08586N 77.67744W

Attachment: pgpRXjkX6_uDR.pgp
Description: PGP signature

_______________________________________________
ast-developers mailing list
ast-developers@lists.research.att.com
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to