summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormwesdorp <mwesdorp>2014-03-11 21:49:04 +0000
committermwesdorp <mwesdorp>2014-03-11 21:49:04 +0000
commit7ce8a8239fb07177ae8b35a2d1410030d99f842c (patch)
tree492a060d9592671d9feb36a576f85488cfa7bb98 /src
parent27e06e9557d7c8a4ff393e52d2a2e43d955ab0fe (diff)
sqsh-2.5 new features and bugfixes
Diffstat (limited to 'src')
-rw-r--r--src/cmd_bcp.c70
-rw-r--r--src/cmd_connect.c10
-rw-r--r--src/cmd_go.c26
-rw-r--r--src/cmd_run.c13
-rw-r--r--src/cmd_shell.c4
-rw-r--r--src/sqsh_parser/Makefile.in3
-rw-r--r--src/var.h1
-rw-r--r--src/var_misc.c28
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
diff --git a/src/var.h b/src/var.h
index 958d068..586a0f7 100644
--- a/src/var.h
+++ b/src/var.h
@@ -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 ;
}