util.c
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:11k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: util.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:35:47  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
  10.  * Copyright (C) 1998-1999  Brian Bruns
  11.  *
  12.  * This library is free software; you can redistribute it and/or
  13.  * modify it under the terms of the GNU Library General Public
  14.  * License as published by the Free Software Foundation; either
  15.  * version 2 of the License, or (at your option) any later version.
  16.  *
  17.  * This library is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20.  * Library General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU Library General Public
  23.  * License along with this library; if not, write to the
  24.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  25.  * Boston, MA 02111-1307, USA.
  26.  */
  27. #include <tds_config.h>
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <stdarg.h>
  31. #include <time.h>
  32. #include <limits.h>
  33. #include <assert.h>
  34. #include <ctype.h>
  35. #ifdef __DGUX__
  36. #include <paths.h>
  37. #endif
  38. #ifdef __FreeBSD__
  39. #include <sys/time.h>
  40. #endif
  41. #ifdef WIN32
  42. #include <windows.h>
  43. #include <stdio.h>
  44. #define PATH_MAX 255
  45. #endif
  46. #ifndef WIN32
  47. #include <netdb.h>
  48. #include <sys/types.h>
  49. #include <netinet/in.h>
  50. #include <arpa/inet.h>
  51. #endif
  52. #define UTIL_C_PROCESSING 1
  53. #include "tdsutil.h"
  54. #ifdef DMALLOC
  55. #include <dmalloc.h>
  56. #endif
  57. static char  software_version[]   = "$Id: util.c,v 1000.0 2003/10/29 20:35:47 gouriano Exp $";
  58. static void *no_unused_var_warn[] = {software_version,
  59.                                      no_unused_var_warn};
  60. /* for now all messages go to the log */
  61. int g_debug_lvl = 99;
  62. int g_append_mode = 0;
  63. static char *g_dump_filename;
  64. static int   write_dump = 0;      /* is TDS stream debug log turned on? */
  65. static FILE *dumpfile   = NULL;   /* file pointer for dump log          */
  66. void 
  67. tds_set_parent(TDSSOCKET *tds, void *the_parent)
  68. {
  69. if (tds)
  70.        tds->parent = the_parent;
  71. }
  72. void *
  73. tds_get_parent(TDSSOCKET *tds)
  74. {
  75.       return(tds->parent);
  76. }
  77. void 
  78. tds_ctx_set_parent(TDSCONTEXT *ctx, void* the_parent)
  79. {
  80. if (ctx)
  81.        ctx->parent = the_parent;
  82. }
  83. void *
  84. tds_ctx_get_parent(TDSCONTEXT *ctx)
  85. {
  86.       return(ctx->parent);
  87. }
  88. int tds_swap_bytes(unsigned char *buf, int bytes)
  89. {
  90.   unsigned char tmp;
  91.  
  92.   int i;
  93. /* if (bytes % 2) { return 0 }; */
  94. for (i=0;i<bytes/2;i++) {
  95. tmp = buf[i];
  96. buf[i] = buf[bytes-i-1];
  97. buf[bytes-i-1]=tmp;
  98. }
  99. return bytes;
  100. }
  101. #ifdef NCBI_FTDS
  102. void tds_swap_2bytes(unsigned char *buf)
  103. {
  104.   unsigned char t= buf[0];
  105.   buf[0]= buf[1];
  106.   buf[1]= t;
  107. }
  108. void tds_swap_4bytes(unsigned char *buf)
  109. {
  110.   unsigned char t= buf[0];
  111.   buf[0]= buf[3];
  112.   buf[3]= t;
  113.   t= buf[1];
  114.   buf[1]= buf[2];
  115.   buf[2]= t;
  116. }
  117. void tds_swap_8bytes(unsigned char *buf)
  118. {
  119.   unsigned char t= buf[0];
  120.   buf[0]= buf[7];
  121.   buf[7]= t;
  122.   t= buf[1];
  123.   buf[1]= buf[6];
  124.   buf[6]= t;
  125.   t= buf[2];
  126.   buf[2]= buf[5];
  127.   buf[5]= t;
  128.   
  129.   t= buf[3];
  130.   buf[3]= buf[4];
  131.   buf[4]= t;
  132. }
  133. #endif
  134. /* ============================== tdsdump_off() ==============================
  135.  *
  136.  * Def:  temporarily turn off logging.  Note- 
  137.  *
  138.  * Ret:  void
  139.  *
  140.  * ===========================================================================
  141.  */
  142. void tdsdump_off()
  143. {
  144.    write_dump = 0;
  145. } /* tdsdump_off()  */
  146. /* ============================== tdsdump_on() ===============================
  147.  *
  148.  * Def:  turn logging back on.  Note-  You must call tdsdump_open() before 
  149.  *       calling this routine.
  150.  *
  151.  * Ret:  void
  152.  *
  153.  * ===========================================================================
  154.  */
  155. void tdsdump_on()
  156. {
  157. write_dump = 1;
  158. } /* tdsdump_on()  */
  159. /* ============================= tdsdump_open() ==============================
  160.  *
  161.  * Def:  This creates and truncates a human readable dump file for the TDS
  162.  *       traffic.  The name of the file is specified by the filename
  163.  *       parameter.  If that is given as NULL, it opens a
  164.  *       file named "tdsdump.out" in the current directory.
  165.  *
  166.  * Ret:  true iff the file was opened, false if it couldn't be opened.
  167.  *
  168.  * ===========================================================================
  169.  */
  170. int tdsdump_open(const char *filename)
  171. {
  172. int   result;   /* really should be a boolean, not an int */
  173.    if (filename == NULL || filename[0]=='') {
  174.       filename = "tdsdump.out";
  175.    }
  176.    if (g_append_mode) {
  177.  g_dump_filename = strdup(filename);
  178.       tdsdump_on();
  179.       result = 1;
  180.    } else if (!strcmp(filename,"stdout")) {
  181.       dumpfile = stdout;
  182.       result = 1;
  183.    } else if (!strcmp(filename,"stderr")) {
  184.       dumpfile = stderr;
  185.       result = 1;
  186.    } else if (NULL == (dumpfile = fopen(filename, "w"))) {
  187.       tdsdump_off();
  188.       result = 0;
  189.    } else {
  190.       tdsdump_on();
  191.       result = 1;
  192.    }
  193.    return result;
  194. } /* tdsdump_open()  */
  195. int tdsdump_append()
  196. {
  197. int result;
  198. if (!g_dump_filename) {
  199. return 0;
  200. }
  201. if (!strcmp(g_dump_filename,"stdout")) {
  202. dumpfile = stdout;
  203. result = 1;
  204. } else if (!strcmp(g_dump_filename,"stderr")) {
  205. dumpfile = stderr;
  206. result = 1;
  207. } else if (NULL == (dumpfile = fopen(g_dump_filename, "a"))) {
  208. result = 0;
  209. } else {
  210. result = 1;
  211. }
  212. return result;
  213. }
  214. /* ============================= tdsdump_close() =============================
  215.  *
  216.  * Def:  Close the TDS dump log file.
  217.  *
  218.  * Ret:  void
  219.  *
  220.  * ===========================================================================
  221.  */
  222. void tdsdump_close()
  223. {
  224.    tdsdump_off();
  225.    if (dumpfile!=NULL && dumpfile != stdout && dumpfile != stderr)
  226.    {
  227.       fclose(dumpfile);
  228.    }
  229.    if (g_dump_filename) {
  230.       free(g_dump_filename);
  231.    }
  232. } /* tdsdump_close()  */
  233. /* =========================== tdsdump_dump_buf() ============================
  234.  *
  235.  * Def:  Dump the contents of data into the log file in a human readable
  236.  *       format.
  237.  *
  238.  * Ret:  void
  239.  *
  240.  * ===========================================================================
  241.  */
  242. void tdsdump_dump_buf(
  243.    const void    *buf,     /* (I) buffer to dump                      */
  244.    int            length)  /* (I) number of bytes in the buffer       */
  245. {
  246.    int                   i;
  247.    int                   j;
  248.    const int             bytesPerLine = 16;
  249.    const unsigned char  *data         = buf;
  250.    if (write_dump && dumpfile!=NULL)
  251.    {
  252.       for(i=0; i<length; i+=bytesPerLine)
  253.       {
  254.          /*
  255.           * print the offset as a 4 digit hex number
  256.           */
  257.          fprintf(dumpfile, "%04x  ", i);
  258.          /*
  259.           * print each byte in hex
  260.           */
  261.          for(j=i; j<length && (j-i)<bytesPerLine; j++)
  262.          {
  263.             fprintf(dumpfile, "%02x ", data[j]);
  264.             if (j-i == bytesPerLine/2) fprintf(dumpfile, " ");
  265.          }
  266.          
  267.          /*
  268.           * skip over to the ascii dump column
  269.           */
  270.          for(; 0!=(j % bytesPerLine); j++)
  271.          {
  272.             fprintf(dumpfile, "   ");
  273.          }
  274.          fprintf(dumpfile, "  |");
  275.          /*
  276.           * print each byte in ascii
  277.           */
  278.          for(j=i; j<length && (j-i)<bytesPerLine; j++)
  279.          {
  280.             fprintf(dumpfile, "%c", (isprint(data[j])) ? data[j] : '.');
  281.             if (j-i == bytesPerLine/2) fprintf(dumpfile, " ");
  282.          }
  283.          fprintf(dumpfile, "|n");
  284.       }
  285.       fprintf(dumpfile, "n");
  286.    }
  287. } /* tdsdump_dump_buf()  */
  288. /* ============================== tdsdump_log() ==============================
  289.  * 
  290.  * Def:  This function write a message to the debug log.  fmt is a printf-like
  291.  *       format string.  It recognizes the following format characters:
  292.  *          d     The next argument is printed a decimal number
  293.  *          p     The pid of the running process
  294.  *          s     The next argument is printed as a character string
  295.  *          L     This doesn't consume any arguments, it simply
  296.  *                prints the current local time.
  297.  *          D     This dumps a buffer in hexadecimal and ascii.
  298.  *                The next argument is a pointer to the buffer
  299.  *                and the argument after that is the number 
  300.  *                of bytes in the buffer.
  301.  * 
  302.  * Ret:  void
  303.  * 
  304.  * ===========================================================================
  305.  */
  306. void tdsdump_log(int debug_lvl, const char *fmt, ...)
  307. {
  308. #ifndef NDEBUG
  309.    int ret = 0;
  310. #ifdef NCBI_FTDS
  311.    if (debug_lvl < g_debug_lvl) 
  312. #else
  313.    if (debug_lvl>g_debug_lvl) 
  314. #endif
  315. return;
  316.    if (g_append_mode) {
  317.       ret = tdsdump_append();
  318.    }
  319.    if (write_dump && dumpfile!=NULL)
  320.    {
  321.       const char     *ptr;
  322.       va_list   ap;
  323.       va_start(ap, fmt);
  324.       
  325.      if (g_append_mode) {
  326.           fprintf(dumpfile, "pid: %d:", (int)getpid() );
  327.       }
  328.       for(ptr = fmt; *ptr != ''; ptr++)
  329.       {
  330.          if (*ptr == '%')
  331.          {
  332.             ptr++;
  333.             switch(*ptr)
  334.             {
  335.                case 's':
  336.                {
  337.                   char   *s = va_arg(ap, char *);
  338.                   fputs(s, dumpfile);
  339.                   break;
  340.                }
  341.                case 'd':
  342.                {
  343.                   int i = va_arg(ap, int);
  344.                   fprintf(dumpfile, "%d", i);
  345.                   break;
  346.                }
  347.                case 'x':
  348.                {
  349.                   int i = va_arg(ap, int);
  350.                   fprintf(dumpfile, "%x", i);
  351.                   break;
  352.                }
  353.                case 'D':
  354.                {
  355.                   char  *buf = va_arg(ap, char *);
  356.                   int    len = va_arg(ap, int);
  357.                   tdsdump_dump_buf(buf, len);
  358.                   break;
  359.                }
  360.                case 'L': /* current local time */
  361.                {
  362.                   char        buf[128];
  363.                   fputs(tds_timestamp_str(buf, 127), dumpfile);
  364.                }
  365.                default:
  366.                {
  367.                   break;
  368.                }
  369.             }
  370.          }
  371.          else
  372.          {
  373.             fputc(*ptr, dumpfile);
  374.          }
  375.       }
  376.    }
  377.    fflush(dumpfile);
  378.    if (g_append_mode && ret) {
  379.       fclose(dumpfile);
  380.    }
  381. #endif
  382. } /* tdsdump_log()  */
  383. /* Jeff's hack*** NEW CODE *** */
  384. int tds_msleep(long usec)         /* returns 0 if ok, else -1 */
  385.      {
  386. #ifdef WIN32
  387.      Sleep(0);
  388.      return 0;
  389. #else
  390.      /* try to select stdin for writing just to create a delay */
  391.      /* fd_set fd_in; */
  392.     struct timeval delay;          /* _select() timeout */
  393.      /* FD_ZERO (&fd_in); */
  394.      /* FD_SET (fileno(stdin), &fd_in); */
  395.     delay.tv_sec = usec / 1000000L;
  396.     delay.tv_usec = usec % 1000000L;
  397.     return(select(0, (fd_set *)NULL, (fd_set *)NULL, (fd_set *)NULL, &delay));
  398. #endif
  399.     }
  400. /* Jeff's hack ***NEW CODE END**** */
  401. #ifdef NCBI_FTDS
  402. void tds_block_sigpipe()
  403. {
  404. }
  405. void tds_reset_sigpipe()
  406. {
  407. }
  408. #endif