diff options
author | mwesdorp <mwesdorp> | 2014-03-11 21:49:04 +0000 |
---|---|---|
committer | mwesdorp <mwesdorp> | 2014-03-11 21:49:04 +0000 |
commit | 7ce8a8239fb07177ae8b35a2d1410030d99f842c (patch) | |
tree | 492a060d9592671d9feb36a576f85488cfa7bb98 /src | |
parent | 27e06e9557d7c8a4ff393e52d2a2e43d955ab0fe (diff) |
sqsh-2.5 new features and bugfixes
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd_bcp.c | 70 | ||||
-rw-r--r-- | src/cmd_connect.c | 10 | ||||
-rw-r--r-- | src/cmd_go.c | 26 | ||||
-rw-r--r-- | src/cmd_run.c | 13 | ||||
-rw-r--r-- | src/cmd_shell.c | 4 | ||||
-rw-r--r-- | src/sqsh_parser/Makefile.in | 3 | ||||
-rw-r--r-- | src/var.h | 1 | ||||
-rw-r--r-- | src/var_misc.c | 28 |
8 files changed, 122 insertions, 33 deletions
diff --git a/src/cmd_bcp.c b/src/cmd_bcp.c index 84ac180..76efc37 100644 --- a/src/cmd_bcp.c +++ b/src/cmd_bcp.c @@ -40,7 +40,7 @@ /*-- Current Version --*/ #if !defined(lint) && !defined(__LINT__) -static char RCS_Id[] = "$Id: cmd_bcp.c,v 1.19 2014/03/09 22:45:37 mwesdorp Exp $"; +static char RCS_Id[] = "$Id: cmd_bcp.c,v 1.20 2014/03/11 21:49:04 mwesdorp Exp $"; USE(RCS_Id) #endif /* !defined(lint) */ @@ -133,6 +133,15 @@ static CS_RETCODE bcp_client_cb #endif /* __CYGWIN__ */ ; +#if defined(CS_SSLVALIDATE_CB) +static CS_RETCODE validate_srvname_cb + _ANSI_ARGS(( CS_VOID*, CS_SSLCERT*, CS_INT, CS_INT )) +#if defined(__CYGWIN__) + __attribute__ ((stdcall)) +#endif /* __CYGWIN__ */ + ; +#endif + int cmd_bcp( argc, argv ) int argc ; char *argv[] ; @@ -166,6 +175,7 @@ int cmd_bcp( argc, argv ) CS_BOOL bcp_on = CS_TRUE; /* Flag to turn on bulk login */ CS_INT i; CS_INT con_status; + char *cp; /* * The following variables need to be initialized to check if @@ -725,6 +735,40 @@ int cmd_bcp( argc, argv ) goto return_fail; } +#if defined(CS_SERVERADDR) && defined(CS_TDS_50) + if ( server != NULL && (cp = strchr(server, ':')) != NULL ) + { + char *cp2; + + *cp = ' '; + if ( (cp2 = strchr(cp+1, ':')) != NULL) /* Optional filter specified? */ + *cp2 = ' '; + + if (ct_con_props( bcp_con, + CS_SET, + CS_SERVERADDR, + (CS_VOID*)server, + CS_NULLTERM, + (CS_INT*)NULL + ) != CS_SUCCEED) + goto return_fail; + + if (cp2 != NULL) + *cp2 = '\0'; /* Remove optional filter from the servername */ + *cp = ':'; /* Put a ':' back into the display servername */ + +#if defined(CS_SSLVALIDATE_CB) + if (ct_callback( g_context, /* Context */ + (CS_CONNECTION*)NULL, /* Connection */ + CS_SET, /* Action */ + CS_SSLVALIDATE_CB, /* Type */ + (CS_VOID*)validate_srvname_cb /* Callback Pointer */ + ) != CS_SUCCEED) + goto return_fail; +#endif + } +#endif + /*-- Now, connect --*/ if (ct_connect( bcp_con, server, @@ -1466,3 +1510,27 @@ static CS_RETCODE bcp_client_cb ( ctx, con, msg ) return CS_SUCCEED ; } + +#if defined(CS_SSLVALIDATE_CB) +/* + * sqsh-2.5 - Validate the servername in a host:port:ssl type of connection + * to be valid for the chosen certificate if the servername does + * not match the CN in the certificate. + */ +static CS_RETCODE validate_srvname_cb (userdata, certptr, certcount, valid) + CS_VOID *userdata; + CS_SSLCERT *certptr; + CS_INT certcount; + CS_INT valid; +{ + if (valid == CS_SSL_INVALID_MISMATCHNAME) + { + return CS_SSL_VALID_CERT; + } + else + { + return valid; + } +} +#endif + diff --git a/src/cmd_connect.c b/src/cmd_connect.c index e6ea515..f99f1df 100644 --- a/src/cmd_connect.c +++ b/src/cmd_connect.c @@ -42,7 +42,7 @@ /*-- Current Version --*/ #if !defined(lint) && !defined(__LINT__) -static char RCS_Id[] = "$Id: cmd_connect.c,v 1.38 2014/03/09 22:45:37 mwesdorp Exp $"; +static char RCS_Id[] = "$Id: cmd_connect.c,v 1.39 2014/03/11 21:49:04 mwesdorp Exp $"; USE(RCS_Id) #endif /* !defined(lint) */ @@ -1647,8 +1647,8 @@ static CS_RETCODE syb_server_cb (ctx, con, msg) { if (g_p2fc == p2faxm_int + 1) { env_get( g_env, "p2fname", &p2fname ); - fprintf (stderr, "Warning: Number of printed server messages exceeds p2faxm=%d limit for current batch.\n", p2faxm_int); - fprintf (stderr," Remaining server messages will be printed to file: %s\n", p2fname); + fprintf (stderr,"Warning: Number of printed server messages exceeds p2faxm=%d limit for current batch.\n", p2faxm_int); + fprintf (stderr," Remaining server messages will be printed to file: %s\n", p2fname); fflush (stderr ); fprintf (g_p2f_fp, "--------\n"); } @@ -1958,7 +1958,7 @@ static CS_RETCODE SetNetAuth (conn, principal, keytab_file, secmech, req_options } /* - * Always set the CS_SEC_NETWORKAUTH option. (Option efined in nss[0]). + * Always set the CS_SEC_NETWORKAUTH option. (Option defined in nss[0]). */ OptSupported = CS_TRUE; if (ct_con_props(conn, CS_SET, nss[0].service, &OptSupported, @@ -2155,7 +2155,7 @@ static void connect_run_sigint (sig, user_data ) #if defined(CS_SSLVALIDATE_CB) /* * sqsh-2.5 - Validate the servername in a host:port:ssl type of connection - * to be valid for the choosen certificate if the servername does + * to be valid for the chosen certificate if the servername does * not match the CN in the certificate. */ static CS_RETCODE validate_srvname_cb (userdata, certptr, certcount, valid) diff --git a/src/cmd_go.c b/src/cmd_go.c index 8720ca0..84ce504 100644 --- a/src/cmd_go.c +++ b/src/cmd_go.c @@ -41,7 +41,7 @@ /*-- Current Version --*/ #if !defined(lint) && !defined(__LINT__) -static char RCS_Id[] = "$Id: cmd_go.c,v 1.6 2014/01/21 20:29:49 mwesdorp Exp $"; +static char RCS_Id[] = "$Id: cmd_go.c,v 1.7 2014/03/11 21:49:04 mwesdorp Exp $"; USE(RCS_Id) #endif /* !defined(lint) */ @@ -78,6 +78,7 @@ int cmd_go( argc, argv ) char *repeat_batch; /* Dito. */ char *filter; /* Dito. */ char *filter_prog; /* Dito. */ + char *nosepline; /* Dito. */ char *sql; int sql_len; char pause_buf[5]; /* Buffer for "hit enter" */ @@ -319,14 +320,15 @@ int cmd_go( argc, argv ) * Retrieve any variables that may affect the way in which * we process or display data. */ - env_get( g_env, "headers", &headers ); - env_get( g_env, "footers", &footers ); - env_get( g_env, "echo", &echo ); - env_get( g_env, "expand", &expand ); - env_get( g_env, "statistics", &statistics ); - env_get( g_env, "clear_on_fail", &clear_on_fail ); - env_get( g_env, "batch_pause", &batch_pause ); - env_get( g_env, "filter", &filter ); + env_get( g_env, "batch_pause", &batch_pause ); + env_get( g_env, "clear_on_fail", &clear_on_fail ); + env_get( g_env, "echo", &echo ); + env_get( g_env, "expand", &expand ); + env_get( g_env, "filter", &filter ); + env_get( g_env, "footers", &footers ); + env_get( g_env, "headers", &headers ); + env_get( g_env, "nosepline", &nosepline ); + env_get( g_env, "statistics", &statistics ); /* * If the user didn't request for statistics via the flag, but @@ -335,10 +337,12 @@ int cmd_go( argc, argv ) if( show_stats == False && (statistics != NULL && *statistics == '1') ) show_stats = True; - if( !(dsp_flags & DSP_F_NOHEADERS) && headers != NULL && *headers == '0' ) + if( !(dsp_flags & DSP_F_NOHEADERS) && headers != NULL && *headers == '0' ) dsp_flags |= DSP_F_NOHEADERS; - if( !(dsp_flags & DSP_F_NOFOOTERS) && footers != NULL && *footers == '0' ) + if( !(dsp_flags & DSP_F_NOFOOTERS) && footers != NULL && *footers == '0' ) dsp_flags |= DSP_F_NOFOOTERS; + if( !(dsp_flags & DSP_F_NOSEPLINE) && nosepline != NULL && *nosepline == '1' ) + dsp_flags |= DSP_F_NOSEPLINE; /* diff --git a/src/cmd_run.c b/src/cmd_run.c index c000095..94186ce 100644 --- a/src/cmd_run.c +++ b/src/cmd_run.c @@ -35,7 +35,7 @@ /*-- Current Version --*/ #if !defined(lint) && !defined(__LINT__) -static char RCS_Id[] = "$Id: cmd_run.c,v 1.4 2014/02/12 16:48:24 mwesdorp Exp $"; +static char RCS_Id[] = "$Id: cmd_run.c,v 1.5 2014/03/11 21:49:04 mwesdorp Exp $"; USE(RCS_Id) #endif /* !defined(lint) */ @@ -69,7 +69,7 @@ int cmd_run( argc, argv ) /* * Parse the command line options. */ - while ((c = sqsh_getopt( argc, argv, "efhnpm:i:" )) != EOF) + while ((c = sqsh_getopt( argc, argv, "efhlnpm:i:" )) != EOF) { switch (c) { @@ -97,6 +97,14 @@ int cmd_run( argc, argv ) } break; + case 'l' : + if (env_put( g_env, "nosepline", "1", ENV_F_TRAN ) == False) + { + fprintf( stderr, "\\run: -l: %s\n", sqsh_get_errstr() ); + have_error = True; + } + break; + case 'n' : if (env_put( g_env, "expand", "0", ENV_F_TRAN ) == False) { @@ -140,6 +148,7 @@ int cmd_run( argc, argv ) fprintf( stderr, " -e Run the script file with echo on\n" ); fprintf( stderr, " -f Suppress footers\n" ); fprintf( stderr, " -h Suppress headers\n" ); + fprintf( stderr, " -l Suppress separator lines with pretty output\n" ); fprintf( stderr, " -n Disable SQL buffer variable expansion\n" ); fprintf( stderr, " -p Report runtime statistics\n" ); fprintf( stderr, " -m style Specify output style {bcp|csv|horiz|html|meta|none|pretty|vert}\n" ); diff --git a/src/cmd_shell.c b/src/cmd_shell.c index 7d5be93..1c94c99 100644 --- a/src/cmd_shell.c +++ b/src/cmd_shell.c @@ -32,7 +32,7 @@ /*-- Current Version --*/ #if !defined(lint) && !defined(__LINT__) -static char RCS_Id[] = "$Id: cmd_shell.c,v 1.2 2014/02/03 10:49:28 mwesdorp Exp $"; +static char RCS_Id[] = "$Id: cmd_shell.c,v 1.3 2014/03/11 21:49:04 mwesdorp Exp $"; USE(RCS_Id) #endif /* !defined(lint) */ @@ -172,7 +172,7 @@ int cmd_pwd( argc, argv ) } /* - * cmd_pwd: Show files in current directory. + * cmd_ls: Show files in current directory. * sqsh-2.5 - New feature. */ int cmd_ls( argc, argv ) diff --git a/src/sqsh_parser/Makefile.in b/src/sqsh_parser/Makefile.in index 4bfb6a3..ef22495 100644 --- a/src/sqsh_parser/Makefile.in +++ b/src/sqsh_parser/Makefile.in @@ -1,11 +1,12 @@ CC = @CC@ CFLAGS = -c @CFLAGS@ CPPFLAGS = @CPPFLAGS@ +OBJMODE = @OBJMODE@ LEX = flex -Cm LEMON = lemon -q libsqsh: sqsh_parser.o tsql.o tsql.yy.o - ar rcs sqsh_parser.a sqsh_parser.o tsql.o tsql.yy.o + ar -rcsv ${OBJMODE} sqsh_parser.a sqsh_parser.o tsql.o tsql.yy.o sqsh_parser.o: sqsh_parser.c sqsh_parser.h ${CC} $(CFLAGS) -o $@ sqsh_parser.c @@ -210,6 +210,7 @@ static var_entry_t sg_var_entry[] = { /* sqsh-2.4 - New variable */ { "usedbcheck", "0", var_set_bool, NULL }, /* sqsh-2.5 - New variables */ + { "nosepline", "0", var_set_bool, NULL }, { "p2faxm", NULL, var_set_nullint, NULL }, { "p2fname", NULL, var_set_p2fname, NULL }, #if defined(__ansi__) diff --git a/src/var_misc.c b/src/var_misc.c index 4582150..d495cfc 100644 --- a/src/var_misc.c +++ b/src/var_misc.c @@ -35,7 +35,7 @@ /*-- Current Version --*/ #if !defined(lint) && !defined(__LINT__) -static char RCS_Id[] = "$Id: var_misc.c,v 1.6 2013/12/24 13:23:19 mwesdorp Exp $" ; +static char RCS_Id[] = "$Id: var_misc.c,v 1.7 2014/03/11 21:49:04 mwesdorp Exp $" ; USE(RCS_Id) #endif /* !defined(lint) */ @@ -192,7 +192,7 @@ int var_set_notempty( env, var_name, var_value ) sqsh_set_error( SQSH_E_INVAL, "Invalid value" ) ; return False ; } - + return True ; } @@ -486,6 +486,7 @@ int var_set_p2fname( env, var_name, var_value ) char **var_value ; { varbuf_t *exp_buf = NULL; + FILE *nfp = NULL; char *exp_fn; @@ -495,12 +496,6 @@ int var_set_p2fname( env, var_name, var_value ) return False; } - if (g_p2f_fp != NULL) - { - fclose (g_p2f_fp); - g_p2f_fp = NULL; - } - if ( var_value == NULL || *var_value == NULL || strcmp( *var_value, "NULL" ) == 0 ) { *var_value = NULL ; @@ -513,6 +508,7 @@ int var_set_p2fname( env, var_name, var_value ) *var_value = NULL ; return False; } + if (sqsh_expand( *var_value, exp_buf, 0 ) != False) { exp_fn = varbuf_getstr( exp_buf ); @@ -525,16 +521,26 @@ int var_set_p2fname( env, var_name, var_value ) return False; } - if( (g_p2f_fp = fopen( exp_fn, "a" )) == NULL) + if( (nfp = fopen( exp_fn, "a" )) == NULL) { sqsh_set_error( SQSH_E_INVAL, "Unable to open file %s", exp_fn ) ; *var_value = NULL ; + varbuf_destroy( exp_buf ); return False; } + varbuf_destroy( exp_buf ); } - if ( exp_buf != NULL) - varbuf_destroy( exp_buf ); + /* + * If we come here, the fopen of the new file was successfull, or the p2fname variable is + * set to NULL. Either way, we can close the original file pointer if it is open + * and assign g_p2f_fp the new file pointer value (that still might be NULL). + */ + if (g_p2f_fp != NULL) + { + fclose (g_p2f_fp); + } + g_p2f_fp = nfp; return True ; } |