diff options
author | Michael Forney <mforney@mforney.org> | 2019-11-20 01:22:06 -0800 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2019-11-21 16:26:37 -0500 |
commit | f4b0d09e3f782511b99626104ca960dd5decd4b8 (patch) | |
tree | a7d7b4550e803624c9f33562ba89c0358b2019fe | |
parent | Zero temporary SASL PLAIN buffer (diff) | |
download | pounce-f4b0d09e3f782511b99626104ca960dd5decd4b8.tar.gz pounce-f4b0d09e3f782511b99626104ca960dd5decd4b8.zip |
Declare globals as extern in headers, and define in source file
Otherwise, each source file that includes the header gets its own definition, and according to the C standard (C99 6.9p5): > If an identifier declared with external linkage is used in an > expression (other than as part of the operand of a sizeof operator > whose result is an integer constant), somewhere in the entire > program there shall be exactly one external definition for the > identifier Most compilers use the .bss section for zero data, but if it uses .data instead, or if -Wl,--warn-common is used, this will cause a linking error.
-rw-r--r-- | bounce.c | 2 | ||||
-rw-r--r-- | bounce.h | 10 | ||||
-rw-r--r-- | client.c | 3 | ||||
-rw-r--r-- | state.c | 3 |
4 files changed, 13 insertions, 5 deletions
diff --git a/bounce.c b/bounce.c index 908a1cb..d4b6175 100644 --- a/bounce.c +++ b/bounce.c @@ -41,6 +41,8 @@ #include "bounce.h" +bool verbose; + static void hashPass(void) { char *pass = getpass("Password: "); byte rand[12]; diff --git a/bounce.h b/bounce.h index 0e12aa5..17cf5b6 100644 --- a/bounce.h +++ b/bounce.h @@ -110,7 +110,7 @@ static inline const char *capList(enum Cap caps) { return buf; } -bool verbose; +extern bool verbose; void ringAlloc(size_t len); void ringProduce(const char *line); @@ -134,8 +134,8 @@ void serverSend(const char *ptr, size_t len); void serverFormat(const char *format, ...) __attribute__((format(printf, 1, 2))); -char *clientPass; -char *clientAway; +extern char *clientPass; +extern char *clientAway; struct Client *clientAlloc(struct tls *tls); void clientFree(struct Client *client); bool clientError(const struct Client *client); @@ -146,8 +146,8 @@ void clientFormat(struct Client *client, const char *format, ...) size_t clientDiff(const struct Client *client); void clientConsume(struct Client *client); -bool stateNoNames; -enum Cap stateCaps; +extern bool stateNoNames; +extern enum Cap stateCaps; void stateLogin( const char *pass, bool sasl, const char *plain, const char *nick, const char *user, const char *real diff --git a/client.c b/client.c index d6b7b16..9ff192e 100644 --- a/client.c +++ b/client.c @@ -30,6 +30,9 @@ #include "bounce.h" +char *clientPass; +char *clientAway; + static size_t active; enum Need { diff --git a/state.c b/state.c index 154e16d..a661ce7 100644 --- a/state.c +++ b/state.c @@ -25,6 +25,9 @@ #include "bounce.h" +bool stateNoNames; +enum Cap stateCaps; + typedef void Handler(struct Message *msg); static void require(const struct Message *msg, bool origin, size_t len) { |