Tue, 28 Aug 2012 18:36:35 +0200
Correct the paths of patched scripts, refine password generation,
mitigate fdatasync(2) detection problems, correct dependencies, remove
outdated autoconf components, correct conf file paths and attributes,
complete and correct log file rotation handing, and note warnings
useful for diagnosing builds.
1 Index: configure
2 --- configure.orig 2006-05-18 21:30:13 +0200
3 +++ configure 2008-12-25 18:48:51 +0100
4 @@ -3944,9 +3944,6 @@
6 fi
8 -if test "$ac_cv_c_compiler_gnu" = yes; then
9 - CFLAGS="-Wall -W ${CFLAGS}"
10 -fi
13 # Check whether --with-purecov or --without-purecov was given.
14 @@ -5125,7 +5122,7 @@
15 fi
17 saved_LIBS=$LIBS
18 - for dbname in db-4.4 db4.4 db44 db-4.3 db4.3 db43 db-4.2 db4.2 db42 db-4.1 db4.1 db41 db-4.0 db4.0 db-4 db40 db4 db-3.3 db3.3 db33 db-3.2 db3.2 db32 db-3.1 db3.1 db31 db-3 db30 db3 db
19 + for dbname in db
20 do
21 LIBS="$saved_LIBS -l$dbname"
22 cat >conftest.$ac_ext <<_ACEOF
23 @@ -5205,6 +5202,54 @@
24 fi
25 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
26 fi
27 + if test "$dblib" = "no"; then
28 + cat >conftest.$ac_ext <<_ACEOF
29 +/* confdefs.h. */
30 +_ACEOF
31 +cat confdefs.h >>conftest.$ac_ext
32 +cat >>conftest.$ac_ext <<_ACEOF
33 +/* end confdefs.h. */
34 +#include <db.h>
35 +int
36 +main ()
37 +{
38 +dbm_open(NULL, 0, 0, 0, NULL, NULL, NULL);
39 + ;
40 + return 0;
41 +}
42 +_ACEOF
43 +rm -f conftest.$ac_objext conftest$ac_exeext
44 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
45 + (eval $ac_link) 2>conftest.er1
46 + ac_status=$?
47 + grep -v '^ *+' conftest.er1 >conftest.err
48 + rm -f conftest.er1
49 + cat conftest.err >&5
50 + echo "$as_me:$LINENO: \$? = $ac_status" >&5
51 + (exit $ac_status); } &&
52 + { ac_try='test -z "$ac_c_werror_flag"
53 + || test ! -s conftest.err'
54 + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
55 + (eval $ac_try) 2>&5
56 + ac_status=$?
57 + echo "$as_me:$LINENO: \$? = $ac_status" >&5
58 + (exit $ac_status); }; } &&
59 + { ac_try='test -s conftest$ac_exeext'
60 + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
61 + (eval $ac_try) 2>&5
62 + ac_status=$?
63 + echo "$as_me:$LINENO: \$? = $ac_status" >&5
64 + (exit $ac_status); }; }; then
65 + BDB_LIBADD="$BDB_LIBADD -ldb"; dblib="berkeley"; dbname=db
66 +else
67 + echo "$as_me: failed program was:" >&5
68 +sed 's/^/| /' conftest.$ac_ext >&5
69 +
70 +dblib="no"
71 +fi
72 +rm -f conftest.err conftest.$ac_objext \
73 + conftest$ac_exeext conftest.$ac_ext
74 + fi
75 LIBS=$saved_LIBS
77 LDFLAGS=$BDB_SAVE_LDFLAGS
78 @@ -5882,7 +5927,7 @@
79 fi
81 saved_LIBS=$LIBS
82 - for dbname in db-4.4 db4.4 db44 db-4.3 db4.3 db43 db-4.2 db4.2 db42 db-4.1 db4.1 db41 db-4.0 db4.0 db-4 db40 db4 db-3.3 db3.3 db33 db-3.2 db3.2 db32 db-3.1 db3.1 db31 db-3 db30 db3 db
83 + for dbname in db
84 do
85 LIBS="$saved_LIBS -l$dbname"
86 cat >conftest.$ac_ext <<_ACEOF
87 @@ -5962,6 +6007,54 @@
88 fi
89 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
90 fi
91 + if test "$dblib" = "no"; then
92 + cat >conftest.$ac_ext <<_ACEOF
93 +/* confdefs.h. */
94 +_ACEOF
95 +cat confdefs.h >>conftest.$ac_ext
96 +cat >>conftest.$ac_ext <<_ACEOF
97 +/* end confdefs.h. */
98 +#include <db.h>
99 +int
100 +main ()
101 +{
102 +dbm_open(NULL, 0, 0, 0, NULL, NULL, NULL);
103 + ;
104 + return 0;
105 +}
106 +_ACEOF
107 +rm -f conftest.$ac_objext conftest$ac_exeext
108 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
109 + (eval $ac_link) 2>conftest.er1
110 + ac_status=$?
111 + grep -v '^ *+' conftest.er1 >conftest.err
112 + rm -f conftest.er1
113 + cat conftest.err >&5
114 + echo "$as_me:$LINENO: \$? = $ac_status" >&5
115 + (exit $ac_status); } &&
116 + { ac_try='test -z "$ac_c_werror_flag"
117 + || test ! -s conftest.err'
118 + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
119 + (eval $ac_try) 2>&5
120 + ac_status=$?
121 + echo "$as_me:$LINENO: \$? = $ac_status" >&5
122 + (exit $ac_status); }; } &&
123 + { ac_try='test -s conftest$ac_exeext'
124 + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
125 + (eval $ac_try) 2>&5
126 + ac_status=$?
127 + echo "$as_me:$LINENO: \$? = $ac_status" >&5
128 + (exit $ac_status); }; }; then
129 + BDB_LIBADD="$BDB_LIBADD -ldb"; dblib="berkeley"; dbname=db
130 +else
131 + echo "$as_me: failed program was:" >&5
132 +sed 's/^/| /' conftest.$ac_ext >&5
133 +
134 +dblib="no"
135 +fi
136 +rm -f conftest.err conftest.$ac_objext \
137 + conftest$ac_exeext conftest.$ac_ext
138 + fi
139 LIBS=$saved_LIBS
141 LDFLAGS=$BDB_SAVE_LDFLAGS
142 @@ -12005,20 +12098,20 @@
143 fi
145 LIB_SQLITE_DIR=$LIB_SQLITE
146 - LIB_SQLITE="$LIB_SQLITE -lsqlite"
147 + LIB_SQLITE="$LIB_SQLITE -lsqlite3"
149 if test -d ${with_sqlite}/include; then
150 CPPFLAGS="${CPPFLAGS} -I${with_sqlite}/include"
151 else
152 CPPFLAGS="${CPPFLAGS} -I${with_sqlite}"
153 fi
154 - echo "$as_me:$LINENO: checking for sqlite_open in -lsqlite" >&5
155 -echo $ECHO_N "checking for sqlite_open in -lsqlite... $ECHO_C" >&6
156 + echo "$as_me:$LINENO: checking for sqlite3_open in -lsqlite3" >&5
157 +echo $ECHO_N "checking for sqlite3_open in -lsqlite3... $ECHO_C" >&6
158 if test "${ac_cv_lib_sqlite_sqlite_open+set}" = set; then
159 echo $ECHO_N "(cached) $ECHO_C" >&6
160 else
161 ac_check_lib_save_LIBS=$LIBS
162 -LIBS="-lsqlite $LIB_SQLITE_DIR $LIBS"
163 +LIBS="-lsqlite3 $LIB_SQLITE_DIR $LIBS"
164 cat >conftest.$ac_ext <<_ACEOF
165 #line $LINENO "configure"
166 /* confdefs.h. */
167 @@ -12033,11 +12126,11 @@
168 #endif
169 /* We use char because int might match the return type of a gcc2
170 builtin and then its argument prototype would still apply. */
171 -char sqlite_open ();
172 +char sqlite3_open ();
173 int
174 main ()
175 {
176 -sqlite_open ();
177 +sqlite3_open ();
178 ;
179 return 0;
180 }
181 Index: lib/saslint.h
182 --- lib/saslint.h.orig 2006-04-18 22:25:45 +0200
183 +++ lib/saslint.h 2008-12-25 18:48:51 +0100
184 @@ -109,8 +109,6 @@
185 const char *appname;
186 } sasl_global_callbacks_t;
188 -extern sasl_global_callbacks_t global_callbacks;
189 -
190 typedef struct _sasl_external_properties
191 {
192 sasl_ssf_t ssf;
193 Index: lib/server.c
194 --- lib/server.c.orig 2006-05-17 18:46:13 +0200
195 +++ lib/server.c 2008-12-25 18:48:51 +0100
196 @@ -95,7 +95,7 @@
198 static mech_list_t *mechlist = NULL; /* global var which holds the list */
200 -sasl_global_callbacks_t global_callbacks;
201 +static sasl_global_callbacks_t global_callbacks;
203 /* set the password for a user
204 * conn -- SASL connection
205 @@ -477,16 +477,8 @@
206 return SASL_CONTINUE;
207 }
209 - /* get the path to the config file */
210 - getconfpath_cb = _sasl_find_getconfpath_callback( global_callbacks.callbacks );
211 - if (getconfpath_cb == NULL) return SASL_BADPARAM;
212 -
213 - /* getconfpath_cb->proc MUST be a sasl_getconfpath_t; if only C had a type
214 - system */
215 - result = ((sasl_getconfpath_t *)(getconfpath_cb->proc))(getconfpath_cb->context,
216 - &path_to_config);
217 - if (result != SASL_OK) goto done;
218 - if (path_to_config == NULL) path_to_config = "";
219 + result = SASL_OK;
220 + path_to_config = "@l_sysconfdir@";
222 next = path_to_config;
224 Index: plugins/sql.c
225 --- plugins/sql.c.orig 2006-04-07 15:42:16 +0200
226 +++ plugins/sql.c 2008-12-25 21:57:47 +0100
227 @@ -150,9 +150,15 @@
228 return -1;
229 }
230 if (value) {
231 - strncpy(value, row[0], size-2);
232 - value[size-1] = '\0';
233 - if (value_len) *value_len = strlen(value);
234 + unsigned long *col_lens;
235 + size_t col_len;
236 + col_lens = mysql_fetch_lengths(result);
237 + col_len = (size_t)col_lens[0];
238 + if (col_len > size - 1);
239 + col_len = size - 1;
240 + memcpy(value, row[0], col_len);
241 + value[col_len] = '\0';
242 + if (value_len) *value_len = col_len;
243 }
245 /* free result */
246 @@ -277,7 +283,7 @@
247 ExecStatusType status;
249 /* run the query */
250 - result = PQexec(conn, cmd);
251 + result = PQexecParams(conn, cmd, 0, NULL, NULL, NULL, NULL, 1);
253 /* check the status */
254 status = PQresultStatus(result);
255 @@ -298,6 +304,7 @@
256 row_count = PQntuples(result);
257 if (!row_count) {
258 /* umm nothing found */
259 + utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: no result found for query %s", cmd);
260 utils->log(NULL, SASL_LOG_NOTE, "sql plugin: no result found");
261 PQclear(result);
262 return -1;
263 @@ -310,9 +317,26 @@
264 /* now get the result set value and value_len */
265 /* we only fetch one because we don't care about the rest */
266 if (value) {
267 - strncpy(value, PQgetvalue(result,0,0), size-2);
268 - value[size-1] = '\0';
269 - if (value_len) *value_len = strlen(value);
270 + if (PQgetisnull(result, 0, 0)) {
271 + size_t col_len;
272 + col_len = strlen(SQL_NULL_VALUE);
273 + if (col_len > size - 1)
274 + col_len = size - 1;
275 + memcpy(value, SQL_NULL_VALUE, col_len);
276 + value[col_len] = '\0';
277 + if (value_len)
278 + *value_len = col_len;
279 + }
280 + else {
281 + size_t col_len;
282 + col_len = (size_t)PQgetlength(result, 0, 0);
283 + if (col_len > size - 1);
284 + col_len = size - 1;
285 + memcpy(value, PQgetvalue(result, 0, 0), col_len);
286 + value[col_len] = '\0';
287 + if (value_len)
288 + *value_len = col_len;
289 + }
290 }
292 /* free result */
293 @@ -342,7 +366,7 @@
294 #endif /* HAVE_PGSQL */
296 #ifdef HAVE_SQLITE
297 -#include <sqlite.h>
298 +#include <sqlite3.h>
300 static void *_sqlite_open(char *host __attribute__((unused)),
301 char *port __attribute__((unused)),
302 @@ -352,21 +376,23 @@
303 const char *database, const sasl_utils_t *utils)
304 {
305 int rc;
306 - sqlite *db;
307 + sqlite3 *db;
308 char *zErrMsg = NULL;
310 - db = sqlite_open(database, 0, &zErrMsg);
311 - if (db == NULL) {
312 + rc = sqlite3_open(database, &db);
313 + if (rc != SQLITE_OK) {
314 + zErrMsg = (char *)sqlite3_errmsg(db);
315 utils->log(NULL, SASL_LOG_ERR, "sql plugin: %s", zErrMsg);
316 - sqlite_freemem (zErrMsg);
317 + sqlite3_free (zErrMsg);
318 + sqlite3_close (db);
319 return NULL;
320 }
322 - rc = sqlite_exec(db, "PRAGMA empty_result_callbacks = ON", NULL, NULL, &zErrMsg);
323 + rc = sqlite3_exec(db, "PRAGMA empty_result_callbacks = ON", NULL, NULL, &zErrMsg);
324 if (rc != SQLITE_OK) {
325 utils->log(NULL, SASL_LOG_ERR, "sql plugin: %s", zErrMsg);
326 - sqlite_freemem (zErrMsg);
327 - sqlite_close(db);
328 + sqlite3_free (zErrMsg);
329 + sqlite3_close(db);
330 return NULL;
331 }
333 @@ -388,62 +414,67 @@
334 return 0;
335 }
337 -static int sqlite_my_callback(void *pArg, int argc __attribute__((unused)),
338 - char **argv,
339 - char **columnNames __attribute__((unused)))
340 -{
341 - char **result = (char**)pArg;
342 -
343 - if (argv == NULL) {
344 - *result = NULL; /* no record */
345 - } else if (argv[0] == NULL) {
346 - *result = strdup(SQL_NULL_VALUE); /* NULL IS SQL_NULL_VALUE */
347 - } else {
348 - *result = strdup(argv[0]);
349 - }
350 -
351 - return /*ABORT*/1;
352 -}
353 -
354 static int _sqlite_exec(void *db, const char *cmd, char *value, size_t size,
355 size_t *value_len, const sasl_utils_t *utils)
356 {
357 int rc;
358 - char *result = NULL;
359 - char *zErrMsg = NULL;
360 + sqlite3_stmt *stmt;
361 + const char *todo;
362 + size_t len;
364 - rc = sqlite_exec((sqlite*)db, cmd, sqlite_my_callback, (void*)&result, &zErrMsg);
365 - if (rc != SQLITE_OK && rc != SQLITE_ABORT) {
366 - utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: %s ", zErrMsg);
367 - sqlite_freemem (zErrMsg);
368 + rc = sqlite3_prepare((sqlite3*)db, cmd, (int)strlen(cmd), &stmt, &todo);
369 + if (rc != SQLITE_OK) {
370 + utils->log(NULL, SASL_LOG_DEBUG, "sql plugin error: %s", sqlite3_errmsg((sqlite3*)db));
371 return -1;
372 }
373 -
374 - if (rc == SQLITE_OK) {
375 + rc = sqlite3_step(stmt);
376 + if (rc != SQLITE_ROW && rc != SQLITE_DONE) {
377 + utils->log(NULL, SASL_LOG_DEBUG, "sql plugin error: %s", sqlite3_errmsg((sqlite3*)db));
378 + sqlite3_finalize(stmt);
379 + return -1;
380 + }
381 + if (sqlite3_column_count(stmt) == 0) {
382 /* no results (BEGIN, COMMIT, DELETE, INSERT, UPDATE) */
383 + sqlite3_finalize(stmt);
384 return 0;
385 }
386 -
387 - if (result == NULL) {
388 + if (rc == SQLITE_DONE) {
389 /* umm nothing found */
390 + utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: no result found for query %s", cmd);
391 utils->log(NULL, SASL_LOG_NOTE, "sql plugin: no result found");
392 + sqlite3_finalize(stmt);
393 return -1;
394 }
395 -
396 - /* XXX: Duplication cannot be found by this method. */
397 -
398 - /* now get the result set value and value_len */
399 - /* we only fetch one because we don't care about the rest */
400 - if (value) {
401 - strncpy(value, result, size - 2);
402 - value[size - 1] = '\0';
403 - if (value_len) {
404 - *value_len = strlen(value);
405 - }
406 + rc = sqlite3_column_type(stmt, 0);
407 + switch (rc) {
408 + case SQLITE_NULL: {
409 + len = strlen(SQL_NULL_VALUE);
410 + if (len > size - 1)
411 + len = size - 1;
412 + memcpy(value, SQL_NULL_VALUE, len);
413 + value[len] = '\0';
414 + if (value_len)
415 + *value_len = len;
416 + break;
417 + }
418 + default: {
419 + const void *blob = sqlite3_column_blob(stmt, 0);
420 + len = (size_t)sqlite3_column_bytes(stmt, 0);
421 + if (len > size - 1)
422 + len = size - 1;
423 + memcpy(value, blob, len);
424 + value[len] = '\0';
425 + if (value_len)
426 + *value_len = len;
427 + break;
428 + }
429 }
430 -
431 - /* free result */
432 - free(result);
433 + rc = sqlite3_step(stmt);
434 + if (rc != SQLITE_DONE) {
435 + utils->log(NULL, SASL_LOG_WARN,
436 + "sql plugin: found duplicate row for query %s", cmd);
437 + }
438 + sqlite3_finalize(stmt);
439 return 0;
440 }
442 @@ -464,7 +495,7 @@
444 static void _sqlite_close(void *db)
445 {
446 - sqlite_close((sqlite*)db);
447 + sqlite3_close((sqlite3 *)db);
448 }
449 #endif /* HAVE_SQLITE */
451 @@ -771,7 +802,7 @@
452 settings = (sql_settings_t *) glob_context;
454 sparams->utils->log(NULL, SASL_LOG_DEBUG,
455 - "sql plugin Parse the username %s\n", user);
456 + "sql plugin parse the username %s\n", user);
458 user_buf = sparams->utils->malloc(ulen + 1);
459 if (!user_buf) goto done;
460 @@ -849,7 +880,7 @@
461 }
463 sparams->utils->log(NULL, SASL_LOG_DEBUG,
464 - "sql plugin create statement from %s %s %s\n",
465 + "sql plugin create statement from name=%s user=%s realm=%s\n",
466 realname, escap_userid, escap_realm);
468 /* create a statement that we will use */
469 @@ -864,9 +895,15 @@
470 /* run the query */
471 if (!settings->sql_engine->sql_exec(conn, query, value, sizeof(value),
472 &value_len, sparams->utils)) {
473 + sparams->utils->log(NULL, SASL_LOG_DEBUG,
474 + "sql plugin query successful\n");
475 sparams->utils->prop_set(sparams->propctx, cur->name,
476 value, value_len);
477 }
478 + else {
479 + sparams->utils->log(NULL, SASL_LOG_DEBUG,
480 + "sql plugin query failed\n");
481 + }
483 sparams->utils->free(query);
484 }
485 Index: sample/client.c
486 --- sample/client.c.orig 2004-03-09 18:35:32 +0100
487 +++ sample/client.c 2008-12-25 18:48:51 +0100
488 @@ -133,13 +133,11 @@
489 return SASL_OK;
490 }
492 -#ifndef HAVE_GETPASSPHRASE
493 static char *
494 -getpassphrase(const char *prompt)
495 +my_getpassphrase(const char *prompt)
496 {
497 return getpass(prompt);
498 }
499 -#endif /* ! HAVE_GETPASSPHRASE */
501 static int
502 getsecret(sasl_conn_t *conn,
503 @@ -155,7 +153,7 @@
504 if (! conn || ! psecret || id != SASL_CB_PASS)
505 return SASL_BADPARAM;
507 - password = getpassphrase("Password: ");
508 + password = my_getpassphrase("Password: ");
509 if (! password)
510 return SASL_FAIL;
512 Index: sample/sample-client.c
513 --- sample/sample-client.c.orig 2004-10-26 13:14:33 +0200
514 +++ sample/sample-client.c 2008-12-25 18:48:51 +0100
515 @@ -244,13 +244,11 @@
516 return SASL_OK;
517 }
519 -#ifndef HAVE_GETPASSPHRASE
520 static char *
521 -getpassphrase(const char *prompt)
522 +my_getpassphrase(const char *prompt)
523 {
524 return getpass(prompt);
525 }
526 -#endif /* ! HAVE_GETPASSPHRASE */
528 static int
529 getsecret(sasl_conn_t *conn,
530 @@ -264,7 +262,7 @@
531 if (! conn || ! psecret || id != SASL_CB_PASS)
532 return SASL_BADPARAM;
534 - password = getpassphrase("Password: ");
535 + password = my_getpassphrase("Password: ");
536 if (! password)
537 return SASL_FAIL;
539 @@ -307,7 +305,7 @@
540 fflush(stdout);
542 if (id == SASL_CB_ECHOPROMPT) {
543 - char *original = getpassphrase("");
544 + char *original = my_getpassphrase("");
545 if (! original)
546 return SASL_FAIL;
547 if (*original)
548 Index: saslauthd/Makefile.am
549 --- saslauthd/Makefile.am.orig 2006-05-17 18:46:17 +0200
550 +++ saslauthd/Makefile.am 2008-12-25 18:48:51 +0100
551 @@ -36,4 +36,4 @@
553 install-data-local: saslauthd.8
554 $(mkinstalldirs) $(DESTDIR)$(mandir)/man8
555 - $(INSTALL_DATA) $(srcdir)/saslauthd.8 $(DESTDIR)$(mandir)/man8/saslauthd.8
556 + $(INSTALL_DATA) $(srcdir)/saslauthd.mdoc $(DESTDIR)$(mandir)/man8/saslauthd.8
557 Index: saslauthd/Makefile.in
558 --- saslauthd/Makefile.in.orig 2008-12-25 18:48:51 +0100
559 +++ saslauthd/Makefile.in 2008-12-25 18:48:51 +0100
560 @@ -621,7 +621,7 @@
562 install-data-local: saslauthd.8
563 $(mkinstalldirs) $(DESTDIR)$(mandir)/man8
564 - $(INSTALL_DATA) $(srcdir)/saslauthd.8 $(DESTDIR)$(mandir)/man8/saslauthd.8
565 + $(INSTALL_DATA) $(srcdir)/saslauthd.mdoc $(DESTDIR)$(mandir)/man8/saslauthd.8
566 # Tell versions [3.59,3.63) of GNU make to not export all variables.
567 # Otherwise a system limit (for SysV at least) may be exceeded.
568 .NOEXPORT:
569 Index: saslauthd/lak.c
570 --- saslauthd/lak.c.orig 2005-05-15 07:49:51 +0200
571 +++ saslauthd/lak.c 2008-12-25 18:48:51 +0100
572 @@ -47,6 +47,7 @@
573 #include <crypt.h>
574 #endif
576 +#include "saslauthd.h" /* get strlcpy macro for non-BSD; get HAVE_OPENSSL from config.h */
577 #ifdef HAVE_OPENSSL
578 #ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT
579 #define OPENSSL_DISABLE_OLD_DES_SUPPORT
580 @@ -57,7 +58,7 @@
582 #include <ldap.h>
583 #include <lber.h>
584 -#include <sasl.h>
585 +#include "sasl.h"
586 #include "lak.h"
588 typedef struct lak_auth_method {
589 Index: utils/pluginviewer.c
590 --- utils/pluginviewer.c.orig 2006-05-17 18:46:17 +0200
591 +++ utils/pluginviewer.c 2008-12-25 18:48:51 +0100
592 @@ -536,7 +536,7 @@
593 fprintf(stderr, "%s: Usage: %s [-a] [-s] [-c] [-b min=N,max=N] [-e ssf=N,id=ID] [-m MECHS] [-x AUXPROP_MECH] [-f FLAGS] [-i local=IP,remote=IP] [-p PATH]\n"
594 "\t-a\tlist auxprop plugins\n"
595 "\t-s\tlist server authentication (SASL) plugins\n"
596 - "\t-s\tlist client authentication (SASL) plugins\n"
597 + "\t-c\tlist client authentication (SASL) plugins\n"
598 "\t-b ...\t#bits to use for encryption\n"
599 "\t\tmin=N\tminumum #bits to use (1 => integrity)\n"
600 "\t\tmax=N\tmaximum #bits to use\n"