In file included from client_userauth.c:58: client_userauth.c.x:516: syntax error before "gss_name_t" client_userauth.c.x:516: warning: no semicolon at end of struct or union client_userauth.c.x:517: warning: type defaults to `int' in declaration of `ctx'client_userauth.c.x:517: warning: data definition has no type or storage class client_userauth.c.x: In function `do_client_gssapi_state_mark': client_userauth.c.x:528: dereferencing pointer to incomplete type client_userauth.c.x:529: dereferencing pointer to incomplete type client_userauth.c.x:530: dereferencing pointer to incomplete type client_userauth.c.x: At top level: client_userauth.c.x:537: sizeof applied to an incomplete type
(Since the error contained gss_name_t, I'm assuming you tried the gss-lsh branch, and I hope it is OK to provide support for it on this list.)
Dennis Heuer dh@onclick.org writes:
In file included from client_userauth.c:58: client_userauth.c.x:516: syntax error before "gss_name_t" client_userauth.c.x:516: warning: no semicolon at end of struct or union client_userauth.c.x:517: warning: type defaults to `int' in declaration of `ctx'client_userauth.c.x:517: warning: data definition has no type or storage class client_userauth.c.x: In function `do_client_gssapi_state_mark': client_userauth.c.x:528: dereferencing pointer to incomplete type client_userauth.c.x:529: dereferencing pointer to incomplete type client_userauth.c.x:530: dereferencing pointer to incomplete type client_userauth.c.x: At top level: client_userauth.c.x:537: sizeof applied to an incomplete type
Did configure find your GSS library? See if WITH_GSS is defined in config.h.
This point out a problem with the GABA header creation: how can I make the GABA stuff respect #if WITH_GSS? If someone doesn't have WITH_GSS, the gss header files won't be included, and gss_name_t won't be defined when the generated client_userauth.h is parsed. The types aren't used when WITH_GSS is 0, so they shouldn't be extracted by the GABA stuff. Perhaps GABA should run the file through CPP?
Simon Josefsson jas@extundo.com writes:
(Since the error contained gss_name_t, I'm assuming you tried the gss-lsh branch, and I hope it is OK to provide support for it on this list.)
That's perfectly ok with me. I'm sorry I haven't yet had the time to look into your gss code carefully and integrate it into my own tree.
This point out a problem with the GABA header creation: how can I make the GABA stuff respect #if WITH_GSS? If someone doesn't have WITH_GSS, the gss header files won't be included, and gss_name_t won't be defined when the generated client_userauth.h is parsed. The types aren't used when WITH_GSS is 0, so they shouldn't be extracted by the GABA stuff. Perhaps GABA should run the file through CPP?
I've been considering doing some kind of preprocessing on GABA expressions earlier, but so far I have been able to get by without that. The easiest way is to put the code that depends on WITH_GSS in a separate file, layouted like this:
#if HAVE_CONFIG_H #include "config.h" #endif
#if WITH_GSS #include <gss.h>
#include "gss.c.x"
/* GABA: (class (name gss_foo) (vars (name . gss_name_t))) */
/* Various functions using gss_foo */ ...
#endif /* WITH_GSS */
The file zlib.c is an example of that. I think it make sense also for other reasons to isolate dependencies on special libraries into separate files. A different and uglier way is to use dummy definitions:
#if HAVE_CONFIG_H #include "config.h" #endif
#if WITH_GSS #include <gss.h> #else /* Dummy definitions */ typdef int gss_name_t; #endif
#include "gss.c.x"
/* GABA: (class (name gss_foo) (vars (name . gss_name_t))) */
#if WITH_GSS /* Code that depends on real gss definitions */ ... #endif /* WITH_GSS */
As for adding proper cpp support to GABA, one way of doing that is introducing a new keyword "condition". It would be used like
/* GABA: (class (name gss_foo) (condition "WITH_GSS") (vars (name . gss_name_t))) */
When this expression is processed by gaba.scm, it should emit "#if WITH_GSS"/#endif-guards around all the generated declarations and definitions. Such a hack would go into the process-class function in src/scm/gaba.scm (the code would need a little more restructuring to get cpp conditions not only for expressions of type "class", but also for "meta", "struct" and "expr"). An untested patch included below ;-)
Regards, /Niels
Index: src/scm/gaba.scm =================================================================== RCS file: /cvsroot/lsh/lsh/src/scm/gaba.scm,v retrieving revision 1.15 diff -u -a -r1.15 gaba.scm --- src/scm/gaba.scm 23 Feb 2003 18:08:58 -0000 1.15 +++ src/scm/gaba.scm 16 Aug 2003 10:42:24 -0000 @@ -121,7 +121,7 @@ (for-each (lambda (o) (cond ((procedure? o) (o level)) ((list? o) (apply out (+ 1 level) o)) - (else (display o)))) + ((not (null? o)) (display o)))) args))
; This isn't very optimal @@ -443,6 +443,7 @@
(define (process-class attributes) (let* ((name (get 'name attributes cadr)) + (condition (get 'condition attributes cadr)) (super (get 'super attributes cadr)) (vars (preprocess-vars name (get 'vars attributes cdr))) (meta (get 'meta attributes cadr)) @@ -453,6 +454,7 @@ (free-function (make-free-function name vars))) ; (werror "baar\n") (c-append (class-annotate name super meta) + (and condition (c-append "#if " condition "\n")) "#ifndef GABA_DEFINE\n" (make-instance-struct name super vars) (if meta @@ -467,7 +469,8 @@ (or free-function "") (make-class name super mark-function free-function meta methods) - "#endif /* !GABA_DECLARE */\n\n")))) + "#endif /* !GABA_DECLARE */\n\n" + (and condition (c-append "#endif /* " condition " */\n")) ))))
(define (process-meta attributes) (let ((name (get 'name attributes cadr))
nisse@lysator.liu.se (Niels Möller) writes:
The file zlib.c is an example of that. I think it make sense also for other reasons to isolate dependencies on special libraries into separate files.
This sounded like a good idea, but when I tried it I couldn't get it to work. The gss classes are derived from client_userauth classes, and the only way to get access to them I could think of was to include client_userauth.c.x in the new client_gssapi.c.x, but this didn't work (the classes reference structures defined in client_user.c, and I got multiple definitions of static functions when linking applications).
As for adding proper cpp support to GABA, one way of doing that is introducing a new keyword "condition".
So I'm now using this instead.
Dennis, please try http://josefsson.org/gss/releases/lsh-gss-2003-08-16.tar.gz and see if it works better. You still have to make sure your GSS library is installed properly, if you do want GSS support, though.
Thanks, Simon
Simon Josefsson jas@extundo.com writes:
The file zlib.c is an example of that. I think it make sense also for other reasons to isolate dependencies on special libraries into separate files.
This sounded like a good idea, but when I tried it I couldn't get it to work. The gss classes are derived from client_userauth classes, and the only way to get access to them I could think of was to include client_userauth.c.x in the new client_gssapi.c.x,
The right way, for this approach, would be to move the declarations of the classes you need to the header file client_userauth.h (and generate a corresponding client_userauth.h.x).
As for adding proper cpp support to GABA, one way of doing that is introducing a new keyword "condition".
So I'm now using this instead.
Nice to here that it works.
Regards, /Niels