ODBC on linuxppc - Mailing list pgsql-ports

From John & Trudy Phillips
Subject ODBC on linuxppc
Date
Msg-id 37C070C3.649C6469@inmind.com
Whole thread Raw
List pgsql-ports
I have found that  ./interfaces/odbc/misc.c will not compile at
distribruted in  postgresql-6.5.1. The problem is in the varargs call.

I have modified the files misc.c and misc.h, attached.   The changes are
marked with the define

#ifdef _K_R_VARGS
       <old code>
#else
        <change>
#endif

What is the method to get my proposed changes concidered?




/* Module:          misc.c
 *
 * Description:     This module contains miscellaneous routines
 *                  such as for debugging/logging and string functions.
 *
 * Classes:         n/a
 *
 * API functions:   none
 *
 * Comments:        See "notice.txt" for copyright and license information.
 *
 */

#include <stdio.h>
#include <string.h>
#ifdef __K_R_VARGS
  #include <varargs.h>
#else
  #include <stdarg.h> /* include ansi style args */
#endif

#include "psqlodbc.h"

#ifndef WIN32
#if HAVE_PWD_H
#include <pwd.h>
#endif
#include <sys/types.h>
#include <unistd.h>
#else
#include <process.h>    /* Byron: is this where Windows keeps def. of getpid ? */
#endif

extern GLOBAL_VALUES globals;
void generate_filename(char*,char*,char*);

void
generate_filename(char* dirname,char* prefix,char* filename)
{
    int pid = 0;
#ifndef WIN32
    struct passwd *ptr = 0;
    ptr = getpwuid(getuid());
#endif
    pid = getpid();
    if(dirname == 0 || filename == 0)
        return;

    strcpy(filename,dirname);
    strcat(filename,DIRSEPARATOR);
    if(prefix != 0)
        strcat(filename,prefix);
#ifndef WIN32
    strcat(filename,ptr->pw_name);
#endif
    sprintf(filename,"%s%u%s",filename,pid,".log");
    return;
}

#ifdef MY_LOG

#ifdef _K_R_VARGS
  void
  mylog(va_alist)
  va_dcl
  {
  char *fmt;
  char *args;
#else
  void
  mylog(char *fmt,...)
    {
     va_list args;
#endif
        char filebuf[80];
    FILE* LOGFP = globals.mylogFP;

    if ( globals.debug) {
             #ifdef _K_R_VARGS
        va_start(args);
        fmt = va_arg(args, char *);
             #else
                va_start(args, fmt);
             #endif

        if (! LOGFP) {
            generate_filename(MYLOGDIR,MYLOGFILE,filebuf);
#ifndef __CYGWIN32__
            LOGFP = fopen(filebuf, "w");
#else
            LOGFP = fopen(filebuf, "wb");
#endif
            globals.mylogFP = LOGFP;
            setbuf(LOGFP, NULL);
        }

        if (LOGFP)
            vfprintf(LOGFP, fmt, args);

        va_end(args);
    }
}
#endif


#ifdef Q_LOG

#ifdef _K_R_VARGS
  void qlog(va_alist)
  va_dcl
  {
  char *fmt;
  char *args;
#else
  void qlog(char *fmt,...)
    {
     va_list args;
#endif
char filebuf[80];
FILE* LOGFP = globals.qlogFP;

    if ( globals.commlog) {
              #ifdef _K_R_VARGS
        va_start(args);
        fmt = va_arg(args, char *);
               #else
                  va_start(args, fmt);
               #endif

        if (! LOGFP) {
            generate_filename(QLOGDIR,QLOGFILE,filebuf);
#ifndef __CYGWIN32__
            LOGFP = fopen(filebuf, "w");
#else
            LOGFP = fopen(filebuf, "wb");
#endif
            globals.qlogFP = LOGFP;
            setbuf(LOGFP, NULL);
        }

        if (LOGFP)
            vfprintf(LOGFP, fmt, args);

        va_end(args);
    }
}
#endif

/*  Undefine these because windows.h will redefine and cause a warning */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#ifdef WIN32
#undef va_start
#undef va_end
#endif

#ifndef WIN32
#include "iodbc.h"
#include "isql.h"
#else
#include <windows.h>
#include <sql.h>
#endif


/*    returns STRCPY_FAIL, STRCPY_TRUNCATED, or #bytes copied (not including null term) */
int
my_strcpy(char *dst, int dst_len, char *src, int src_len)
{
    if (dst_len <= 0)
        return STRCPY_FAIL;

    if (src_len == SQL_NULL_DATA) {
        dst[0] = '\0';
        return STRCPY_NULL;
    }
    else if (src_len == SQL_NTS)
        src_len = strlen(src);

    if (src_len <= 0)
        return STRCPY_FAIL;

    else {
        if (src_len < dst_len) {
            memcpy(dst, src, src_len);
            dst[src_len] = '\0';
        }
        else {
            memcpy(dst, src, dst_len-1);
            dst[dst_len-1] = '\0';    /* truncated */
            return STRCPY_TRUNCATED;
        }
    }

    return strlen(dst);
}

// strncpy copies up to len characters, and doesn't terminate
// the destination string if src has len characters or more.
// instead, I want it to copy up to len-1 characters and always
// terminate the destination string.
char *strncpy_null(char *dst, const char *src, int len)
{
int i;


    if (NULL != dst) {

        /*  Just in case, check for special lengths */
        if (len == SQL_NULL_DATA) {
            dst[0] = '\0';
            return NULL;
        }
        else if (len == SQL_NTS)
            len = strlen(src) + 1;

        for(i = 0; src[i] && i < len - 1; i++) {
            dst[i] = src[i];
        }

        if(len > 0) {
            dst[i] = '\0';
        }
    }
    return dst;
}

//    Create a null terminated string (handling the SQL_NTS thing):
//        1. If buf is supplied, place the string in there (assumes enough space) and return buf.
//        2. If buf is not supplied, malloc space and return this string
char *
make_string(char *s, int len, char *buf)
{
int length;
char *str;

    if(s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) {
        length = (len > 0) ? len : strlen(s);

        if (buf) {
            strncpy_null(buf, s, length+1);
            return buf;
        }

        str = malloc(length + 1);
        if ( ! str)
            return NULL;

        strncpy_null(str, s, length+1);
        return str;
    }

    return NULL;
}

//    Concatenate a single formatted argument to a given buffer handling the SQL_NTS thing.
//    "fmt" must contain somewhere in it the single form '%.*s'
//    This is heavily used in creating queries for info routines (SQLTables, SQLColumns).
//    This routine could be modified to use vsprintf() to handle multiple arguments.
char *
my_strcat(char *buf, char *fmt, char *s, int len)
{

    if (s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) {
        int length = (len > 0) ? len : strlen(s);

        int pos = strlen(buf);

        sprintf(&buf[pos], fmt, length, s);
        return buf;
    }
    return NULL;
}

void remove_newlines(char *string)
{
    unsigned int i;

    for(i=0; i < strlen(string); i++) {
        if((string[i] == '\n') ||
           (string[i] == '\r')) {
            string[i] = ' ';
        }
    }
}

char *
trim(char *s)
{
    int i;

    for (i = strlen(s) - 1; i >= 0; i--) {
        if (s[i] == ' ')
            s[i] = '\0';
        else
            break;
    }

    return s;
}

/* File:            misc.h
 *
 * Description:     See "misc.c"
 *
 * Comments:        See "notice.txt" for copyright and license information.
 *
 */

#ifndef __MISC_H__
#define __MISC_H__

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#ifndef WIN32
#include "gpps.h"
#define SQLGetPrivateProfileString(a,b,c,d,e,f) GetPrivateProfileString(a,b,c,d,e,f)
#endif

#include <stdio.h>

/*    Uncomment MY_LOG define to compile in the mylog() statements.
    Then, debug logging will occur if 'Debug' is set to 1 in the ODBCINST.INI
    portion of the registry.  You may have to manually add this key.
    This logfile is intended for development use, not for an end user!
*/
#define MY_LOG


/*    Uncomment Q_LOG to compile in the qlog() statements (Communications log, i.e. CommLog).
    This logfile contains serious log statements that are intended for an
    end user to be able to read and understand.  It is controlled by the
    'CommLog' flag in the ODBCINST.INI portion of the registry (see above),
    which is manipulated on the setup/connection dialog boxes.
*/
#define Q_LOG


#ifdef MY_LOG
  #define MYLOGFILE    "mylog_"
  #ifndef WIN32
    #define MYLOGDIR    "/tmp"
  #else
    #define MYLOGDIR    "c:"
  #endif
  #ifdef _K_R_VARGS
   void mylog();    /* prototype */
  #else
    void mylog(char *fmt, ...); /* ansi prototype */
  #endif
#else
  #ifndef WIN32
    #define mylog(args...)    /* GNU convention for variable arguments */
  #else
    #define mylog    // mylog
  #endif
#endif

#ifdef Q_LOG
  #define QLOGFILE    "psqlodbc_"
  #ifndef WIN32
    #define QLOGDIR        "/tmp"
  #else
    #define QLOGDIR        "c:"
  #endif
  #ifdef _K_R_VARGS
    void qlog();    /* prototype */
  #else
    void qlog(char *fmt,...); /* ansi prototype */
  #endif
#else
  #ifndef WIN32
    #define qlog(args...)    /* GNU convention for variable arguments */
  #else
    #define qlog    // qlog
  #endif
#endif

#ifndef WIN32
#define DIRSEPARATOR    "/"
#else
#define DIRSEPARATOR    "\\"
#endif

void remove_newlines(char *string);
char *strncpy_null(char *dst, const char *src, int len);
char *trim(char *string);
char *make_string(char *s, int len, char *buf);
char *my_strcat(char *buf, char *fmt, char *s, int len);

/* defines for return value of my_strcpy */
#define STRCPY_SUCCESS        1
#define STRCPY_FAIL            0
#define STRCPY_TRUNCATED    -1
#define STRCPY_NULL            -2

int my_strcpy(char *dst, int dst_len, char *src, int src_len);

#endif

pgsql-ports by date:

Previous
From: "Michael Davey"
Date:
Subject: Floating point precision
Next
From: "Ondra"
Date:
Subject: Failed Installation