diff options
Diffstat (limited to 'ext/mysql')
31 files changed, 262 insertions, 154 deletions
diff --git a/ext/mysql/libmysql/acinclude.m4 b/ext/mysql/libmysql/acinclude.m4 index c9e0973fef..0fb030b803 100644 --- a/ext/mysql/libmysql/acinclude.m4 +++ b/ext/mysql/libmysql/acinclude.m4 @@ -295,6 +295,30 @@ then  fi  ]) +AC_DEFUN(MYSQL_CHECK_INT_8_16_32, +[AC_MSG_CHECKING([for int8]) +AC_TRY_RUN([ +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif + +#ifdef HAVE_STDDEF_H +#include <stddef.h> +#endif + +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif + +int main() +{ +    int8 i; +    return 0; +} +], AC_DEFINE(HAVE_INT_8_16_32, , [ ]) AC_MSG_RESULT([yes]), AC_MSG_RESULT([no]) +) +]) +  AC_DEFUN(MYSQL_HEADER_CHECKS,[  AC_HEADER_STDC  AC_CHECK_HEADERS(sgtty.h sys/ioctl.h \ @@ -322,6 +346,7 @@ AC_TYPE_UID_T  MYSQL_CHECK_ULONG  MYSQL_CHECK_UCHAR  MYSQL_CHECK_UINT +MYSQL_CHECK_INT_8_16_32  MYSQL_TYPE_ACCEPT  MYSQL_TYPE_QSORT diff --git a/ext/mysql/libmysql/dbug.c b/ext/mysql/libmysql/dbug.c index c004de587f..f600b28100 100644 --- a/ext/mysql/libmysql/dbug.c +++ b/ext/mysql/libmysql/dbug.c @@ -341,7 +341,7 @@ pthread_mutex_t THR_LOCK_dbug;  static void init_dbug_state(void)  { -  pthread_mutex_init(&THR_LOCK_dbug,NULL); +  pthread_mutex_init(&THR_LOCK_dbug,MY_MUTEX_INIT_FAST);  }  static CODE_STATE *code_state(void) diff --git a/ext/mysql/libmysql/default.c b/ext/mysql/libmysql/default.c index 6319860b48..d9dbfcf1c6 100644 --- a/ext/mysql/libmysql/default.c +++ b/ext/mysql/libmysql/default.c @@ -208,7 +208,7 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,  				   const char *dir, const char *config_file,  				   const char *ext, TYPELIB *group)  { -  char name[FN_REFLEN+10],buff[257],*ptr,*end,*value,*tmp; +  char name[FN_REFLEN+10],buff[FN_REFLEN+1],*ptr,*end,*value,*tmp;    FILE *fp;    uint line=0;    my_bool read_values=0,found_group=0; diff --git a/ext/mysql/libmysql/errmsg.c b/ext/mysql/libmysql/errmsg.c index f015a05ea3..216693042d 100644 --- a/ext/mysql/libmysql/errmsg.c +++ b/ext/mysql/libmysql/errmsg.c @@ -22,7 +22,7 @@ const char *client_errors[]=    "MySQL client got out of memory",    "Wrong host info",    "Localhost via UNIX socket", -  "%s via TCP/IP", +  "%-.64s via TCP/IP",    "Error in server handshake",    "Lost connection to MySQL server during query",    "Commands out of sync; You can't run this command now", @@ -48,11 +48,11 @@ const char *client_errors[]=    "MySQL client run out of memory",    "Wrong host info",    "Localhost via UNIX socket", -  "%s via TCP/IP", +  "%-.64s via TCP/IP",    "Error in server handshake",    "Lost connection to MySQL server during query",    "Commands out of sync;  You can't run this command now", -  "%s via named pipe", +  "%-.64s via named pipe",    "Can't wait for named pipe to host: %-.64s  pipe: %-.32s (%lu)",    "Can't open named pipe to host: %-.64s  pipe: %-.32s (%lu)",    "Can't set state of named pipe to host: %-.64s  pipe: %-.32s (%lu)", @@ -64,5 +64,5 @@ const char *client_errors[]=  void init_client_errs(void)  { -  errmsg[CLIENT_ERRMAP] = &client_errors[0]; +  my_errmsg[CLIENT_ERRMAP] = &client_errors[0];  } diff --git a/ext/mysql/libmysql/errors.c b/ext/mysql/libmysql/errors.c index 7ecf991a9b..9b11bfb47a 100644 --- a/ext/mysql/libmysql/errors.c +++ b/ext/mysql/libmysql/errors.c @@ -32,18 +32,21 @@ const char * NEAR globerrs[GLOBERRS]=    "Can't create directory '%s' (Errcode: %d)",    "Character set '%s' is not a compiled character set and is not specified in the '%s' file",    "Out of resources when opening file '%s' (Errcode: %d)", +  "Can't read value for symlink '%s' (Error %d)", +  "Can't create symlink '%s' pointing at '%s' (Error %d)", +  "Error on realpath() on '%s' (Error %d)",  };  void init_glob_errs(void)  { -  errmsg[GLOB] = & globerrs[0]; +  my_errmsg[GLOB] = & globerrs[0];  } /* init_glob_errs */  #else  void init_glob_errs()  { -  errmsg[GLOB] = & globerrs[0]; +  my_errmsg[GLOB] = & globerrs[0];    EE(EE_FILENOTFOUND)	= "File '%s' not found (Errcode: %d)";    EE(EE_CANTCREATEFILE) = "Can't create/write to file '%s' (Errcode: %d)"; @@ -67,6 +70,9 @@ void init_glob_errs()    EE(EE_DISK_FULL)	= "Disk is full writing '%s'. Waiting for someone to free space...";    EE(EE_CANT_MKDIR)	="Can't create directory '%s' (Errcode: %d)";    EE(EE_UNKNOWN_CHARSET)= "Character set is not a compiled character set and is not specified in the %s file"; -  EE(EE_OUT_OF_FILERESOURCES)="Out of resources when opening file '%s' (Errcode: %d)", +  EE(EE_OUT_OF_FILERESOURCES)="Out of resources when opening file '%s' (Errcode: %d)"; +  EE(EE_CANT_READLINK)="Can't read value for symlink '%s' (Error %d)"; +  EE(EE_CANT_SYMLINK)="Can't create symlink '%s' pointing at '%s' (Error %d)"; +  EE(EE_REALPATH)="Error on realpath() on '%s' (Error %d)";  }  #endif diff --git a/ext/mysql/libmysql/global.h b/ext/mysql/libmysql/global.h index 94427003ca..f9e3295961 100644 --- a/ext/mysql/libmysql/global.h +++ b/ext/mysql/libmysql/global.h @@ -14,6 +14,19 @@ This file is public domain and comes with NO WARRANTY of any kind */  #include <os2.h>  #endif /* __EMX__ */ +#ifdef __CYGWIN__ +/* We use a Unix API, so pretend it's not Windows */ +#undef WIN +#undef WIN32 +#undef _WIN +#undef _WIN32 +#undef _WIN64 +#undef __WIN__ +#undef __WIN32__ +#define HAVE_ERRNO_AS_DEFINE +#endif /* __CYGWIN__ */ + +  #if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32)  #include <config-win.h>  #else @@ -305,7 +318,8 @@ typedef int	File;		/* File descriptor */  typedef int	my_socket;	/* File descriptor for sockets */  #define INVALID_SOCKET -1  #endif -typedef RETSIGTYPE sig_handler; /* Function to handle signals */ +/* Type for fuctions that handles signals */ +#define sig_handler RETSIGTYPE  typedef void	(*sig_return)();/* Returns type from signal */  #if defined(__GNUC__) && !defined(_lint)  typedef char	pchar;		/* Mixed prototypes can take char */ @@ -797,6 +811,28 @@ typedef union {  #else  #define float4get(V,M)   memcpy_fixed((byte*) &V,(byte*) (M),sizeof(float))  #define float4store(V,M) memcpy_fixed((byte*) V,(byte*) (&M),sizeof(float)) + +#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) +#define doublestore(T,V)    { *(T)= ((byte *) &V)[4];\ +                              *((T)+1)=(char) ((byte *) &V)[5];\ +                              *((T)+2)=(char) ((byte *) &V)[6];\ +                              *((T)+3)=(char) ((byte *) &V)[7];\ +                              *((T)+4)=(char) ((byte *) &V)[0];\ +                              *((T)+5)=(char) ((byte *) &V)[1];\ +                              *((T)+6)=(char) ((byte *) &V)[2];\ +                              *((T)+7)=(char) ((byte *) &V)[3]; } +#define doubleget(V,M) { double def_temp;\ +                              ((byte*) &def_temp)[0]=(M)[4];\ +                              ((byte*) &def_temp)[1]=(M)[5];\ +                              ((byte*) &def_temp)[2]=(M)[6];\ +                              ((byte*) &def_temp)[3]=(M)[7];\ +                              ((byte*) &def_temp)[4]=(M)[0];\ +                              ((byte*) &def_temp)[5]=(M)[1];\ +                              ((byte*) &def_temp)[6]=(M)[2];\ +                              ((byte*) &def_temp)[7]=(M)[3];\ +			      (V) = def_temp; } +#endif /* __FLOAT_WORD_ORDER */ +  #define float8get(V,M)   doubleget((V),(M))  #define float8store(V,M) doublestore((V),(M))  #endif /* WORDS_BIGENDIAN */ @@ -849,7 +885,7 @@ typedef union {  #ifndef doubleget  #define doubleget(V,M)	 memcpy_fixed((byte*) &V,(byte*) (M),sizeof(double))  #define doublestore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(double)) -#endif +#endif /* doubleget */  #define longlongget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(ulonglong))  #define longlongstore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(ulonglong)) diff --git a/ext/mysql/libmysql/libmysql.c b/ext/mysql/libmysql/libmysql.c index 52fa65d72a..48d388b798 100644 --- a/ext/mysql/libmysql/libmysql.c +++ b/ext/mysql/libmysql/libmysql.c @@ -2,11 +2,11 @@  This file is public domain and comes with NO WARRANTY of any kind */  #define DONT_USE_RAID +#include <global.h>  #if defined(__WIN__) || defined(_WIN32) || defined(_WIN64)  #include <winsock.h>  #include <odbcinst.h>  #endif -#include <global.h>  #include <my_sys.h>  #include <mysys_err.h>  #include <m_string.h> @@ -473,7 +473,7 @@ static void free_old_query(MYSQL *mysql)    DBUG_VOID_RETURN;  } -#ifdef HAVE_GETPWUID +#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)  struct passwd *getpwuid(uid_t);  char* getlogin(void);  #endif @@ -489,14 +489,6 @@ static void read_user_name(char *name)  #ifdef HAVE_GETPWUID      struct passwd *skr;      const char *str; -/*#ifdef __cplusplus -    extern "C" struct passwd *getpwuid(uid_t); -    extern "C" { char* getlogin(void); } -#else -    char * getlogin(); -    struct passwd *getpwuid(uid_t); -#endif -*/      if ((str=getlogin()) == NULL)      {        if ((skr=getpwuid(geteuid())) != NULL) @@ -1653,6 +1645,7 @@ mysql_close(MYSQL *mysql)      {        free_old_query(mysql);        mysql->status=MYSQL_STATUS_READY; /* Force command */ +      mysql->reconnect=0;        simple_command(mysql,COM_QUIT,NullS,0,1);        end_server(mysql);      } @@ -1696,87 +1689,30 @@ mysql_query(MYSQL *mysql, const char *query)    return mysql_real_query(mysql,query, (uint) strlen(query));  } -int STDCALL -mysql_send_query(MYSQL* mysql, const char* query) -{ -  return mysql_real_send_query(mysql, query, strlen(query)); -} - -/* send the query and return so we can do something else */ -/* needs to be followed by mysql_reap_query() when we want to -   finish processing it +/* +  Send the query and return so we can do something else. +  Needs to be followed by mysql_read_query_result() when we want to +  finish processing it.  */   -int STDCALL -mysql_real_send_query(MYSQL* mysql, const char* query, uint len) -{ -  return simple_command(mysql, COM_QUERY, query, len, 1); -}  int STDCALL -mysql_reap_query(MYSQL* mysql) +mysql_send_query(MYSQL* mysql, const char* query, uint length)  { -  uchar *pos; -  ulong field_count; -  MYSQL_DATA *fields; -  uint len; -  DBUG_ENTER("mysql_reap_query"); -  DBUG_PRINT("enter",("handle: %lx",mysql)); -  if((len = net_safe_read(mysql)) == packet_error) -    DBUG_RETURN(-1); -  free_old_query(mysql);			/* Free old result */ - get_info: -  pos=(uchar*) mysql->net.read_pos; -  if ((field_count= net_field_length(&pos)) == 0) -    { -      mysql->affected_rows= net_field_length_ll(&pos); -      mysql->insert_id=	  net_field_length_ll(&pos); -      if (mysql->server_capabilities & CLIENT_TRANSACTIONS) -	{ -	  mysql->server_status=uint2korr(pos); pos+=2; -	} -      if (pos < mysql->net.read_pos+len && net_field_length(&pos)) -	mysql->info=(char*) pos; -      DBUG_RETURN(0); -    } -  if (field_count == NULL_LENGTH)		/* LOAD DATA LOCAL INFILE */ -    { -      int error=send_file_to_server(mysql,(char*) pos); -      if ((len=net_safe_read(mysql)) == packet_error || error) -	DBUG_RETURN(-1); -      goto get_info;				/* Get info packet */ -    } -  if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT)) -    mysql->server_status|= SERVER_STATUS_IN_TRANS; - -  mysql->extra_info= net_field_length_ll(&pos); /* Maybe number of rec */ -  if (!(fields=read_rows(mysql,(MYSQL_FIELD*) 0,5))) -    DBUG_RETURN(-1); -  if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc, -				    (uint) field_count,0, -				    (my_bool) test(mysql->server_capabilities & -						   CLIENT_LONG_FLAG)))) -    DBUG_RETURN(-1); -  mysql->status=MYSQL_STATUS_GET_RESULT; -  mysql->field_count=field_count; -  DBUG_RETURN(0); - +  return simple_command(mysql, COM_QUERY, query, length, 1);  } -int STDCALL -mysql_real_query(MYSQL *mysql, const char *query, uint length) +int STDCALL mysql_read_query_result(MYSQL *mysql)  {    uchar *pos;    ulong field_count;    MYSQL_DATA *fields; -  DBUG_ENTER("mysql_real_query"); -  DBUG_PRINT("enter",("handle: %lx",mysql)); -  DBUG_PRINT("query",("Query = \"%s\"",query)); +  uint length; +  DBUG_ENTER("mysql_read_query_result"); -  if (simple_command(mysql,COM_QUERY,query,length,1) || -      (length=net_safe_read(mysql)) == packet_error) +  if ((length = net_safe_read(mysql)) == packet_error)      DBUG_RETURN(-1);    free_old_query(mysql);			/* Free old result */ - get_info: +get_info:    pos=(uchar*) mysql->net.read_pos;    if ((field_count= net_field_length(&pos)) == 0)    { @@ -1813,6 +1749,16 @@ mysql_real_query(MYSQL *mysql, const char *query, uint length)    DBUG_RETURN(0);  } +int STDCALL +mysql_real_query(MYSQL *mysql, const char *query, uint length) +{ +  DBUG_ENTER("mysql_real_query"); +  DBUG_PRINT("enter",("handle: %lx",mysql)); +  DBUG_PRINT("query",("Query = \"%s\"",query)); +  if (simple_command(mysql,COM_QUERY,query,length,1)) +    DBUG_RETURN(-1); +  DBUG_RETURN(mysql_read_query_result(mysql)); +}  static int  send_file_to_server(MYSQL *mysql, const char *filename) diff --git a/ext/mysql/libmysql/m_ctype.h b/ext/mysql/libmysql/m_ctype.h index bd6e343c24..e322ac8f1a 100644 --- a/ext/mysql/libmysql/m_ctype.h +++ b/ext/mysql/libmysql/m_ctype.h @@ -52,6 +52,7 @@ extern CHARSET_INFO  compiled_charsets[];  #endif  /* Don't include std ctype.h when this is included */  #define _CTYPE_H +#define _CTYPE_H_  #define _CTYPE_INCLUDED  #define __CTYPE_INCLUDED  #define _CTYPE_USING   /* Don't put names in global namespace. */ diff --git a/ext/mysql/libmysql/mf_format.c b/ext/mysql/libmysql/mf_format.c index 72971ed318..21ba545797 100644 --- a/ext/mysql/libmysql/mf_format.c +++ b/ext/mysql/libmysql/mf_format.c @@ -96,7 +96,7 @@ my_string fn_format(my_string to, const char *name, const char *dsk,      (void) strmov(pos,ext);			/* Don't convert extension */    }    /* Purify gives a lot of UMR errors when using realpath */ -#if defined(HAVE_REALPATH) && !defined(HAVE_purify) +#if defined(HAVE_REALPATH) && !defined(HAVE_purify) && !defined(HAVE_BROKEN_REALPATH)    if (flag & 16)    {      struct stat stat_buff; diff --git a/ext/mysql/libmysql/mf_pack.c b/ext/mysql/libmysql/mf_pack.c index a6ab070870..b6b079bdac 100644 --- a/ext/mysql/libmysql/mf_pack.c +++ b/ext/mysql/libmysql/mf_pack.c @@ -222,11 +222,16 @@ void symdirget(char *dir)      *pos++=temp; *pos=0;	  /* Restore old filename */      if (fp)      { -      if (fgets(buff, sizeof(buff), fp)) +      if (fgets(buff, sizeof(buff)-1, fp))        {  	for (pos=strend(buff);  	     pos > buff && (iscntrl(pos[-1]) || isspace(pos[-1])) ;  	     pos --); + +	/* Ensure that the symlink ends with the directory symbol */ +	if (pos == buff || pos[-1] != FN_LIBCHAR) +	  *pos++=FN_LIBCHAR; +  	strmake(dir,buff, (uint) (pos-buff));        }        my_fclose(fp,MYF(0)); diff --git a/ext/mysql/libmysql/my_alloc.c b/ext/mysql/libmysql/my_alloc.c index 01992b64dd..a33f86fa00 100644 --- a/ext/mysql/libmysql/my_alloc.c +++ b/ext/mysql/libmysql/my_alloc.c @@ -10,7 +10,7 @@ This file is public domain and comes with NO WARRANTY of any kind */  void init_alloc_root(MEM_ROOT *mem_root, uint block_size, uint pre_alloc_size)  {    mem_root->free=mem_root->used=0; -  mem_root->min_malloc=16; +  mem_root->min_malloc=32;    mem_root->block_size=block_size-MALLOC_OVERHEAD-sizeof(USED_MEM)-8;    mem_root->error_handler=0;  #if !(defined(HAVE_purify) && defined(EXTRA_DEBUG)) diff --git a/ext/mysql/libmysql/my_error.c b/ext/mysql/libmysql/my_error.c index 78c2bb2a74..21dc3ec268 100644 --- a/ext/mysql/libmysql/my_error.c +++ b/ext/mysql/libmysql/my_error.c @@ -9,7 +9,7 @@ This file is public domain and comes with NO WARRANTY of any kind */  /* Define some external variables for error handling */ -const char ** NEAR errmsg[MAXMAPS]={0,0,0,0}; +const char ** NEAR my_errmsg[MAXMAPS]={0,0,0,0};  char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];  /* Error message to user */ @@ -28,10 +28,10 @@ int my_error(int nr,myf MyFlags, ...)    va_start(ap,MyFlags);    DBUG_PRINT("my", ("nr: %d  MyFlags: %d  errno: %d", nr, MyFlags, errno)); -  if (nr / ERRMOD == GLOB && errmsg[GLOB] == 0) +  if (nr / ERRMOD == GLOB && my_errmsg[GLOB] == 0)      init_glob_errs(); -  olen=(uint) strlen(tpos=errmsg[nr / ERRMOD][nr % ERRMOD]); +  olen=(uint) strlen(tpos=my_errmsg[nr / ERRMOD][nr % ERRMOD]);    endpos=ebuff;    while (*tpos) @@ -51,6 +51,8 @@ int my_error(int nr,myf MyFlags, ...)        /* Skipp if max size is used (to be compatible with printf) */        while (isdigit(*tpos) || *tpos == '.' || *tpos == '-')  	tpos++; +      if (*tpos == 'l')				/* Skipp 'l' argument */ +	tpos++;        if (*tpos == 's')				/* String parameter */        {  	par = va_arg(ap, char *); diff --git a/ext/mysql/libmysql/my_getwd.c b/ext/mysql/libmysql/my_getwd.c index 99ce4b9e0a..9e87c4d201 100644 --- a/ext/mysql/libmysql/my_getwd.c +++ b/ext/mysql/libmysql/my_getwd.c @@ -15,6 +15,10 @@ This file is public domain and comes with NO WARRANTY of any kind */  #include <direct.h>  #endif +#ifdef __EMX__ +// chdir2 support also drive change +#define chdir _chdir2 +#endif  	/* Gets current working directory in buff. Directory is allways ended  	   with FN_LIBCHAR */ diff --git a/ext/mysql/libmysql/my_init.c b/ext/mysql/libmysql/my_init.c index fb9b2ae100..9bccb2c652 100644 --- a/ext/mysql/libmysql/my_init.c +++ b/ext/mysql/libmysql/my_init.c @@ -34,6 +34,7 @@ static my_bool win32_init_tcp_ip();  static my_bool my_init_done=0; +  static ulong atoi_octal(const char *str)  {    long int tmp; @@ -62,6 +63,9 @@ void my_init(void)  #ifndef __WIN__    sigfillset(&my_signals);		/* signals blocked by mf_brkhant */  #endif +#endif /* THREAD */ +#ifdef UNIXWARE_7 +  (void) isatty(0);			/* Go around connect() bug in UW7 */  #endif    {      DBUG_ENTER("my_init"); @@ -113,7 +117,12 @@ void my_end(int infoflag)  #ifdef HAVE_GETRUSAGE      struct rusage rus;      if (!getrusage(RUSAGE_SELF, &rus)) -      fprintf(info_file,"\nUser time %.2f, System time %.2f\nMaximum resident set size %ld, Integral resident set size %ld\nNon physical pagefaults %ld, Physical pagefaults %ld, Swaps %ld\nBlocks in %ld out %ld, Messages in %ld out %ld, Signals %ld\nVouluntary context switches %ld, Invouluntary context switches %ld\n", +      fprintf(info_file,"\n\ +User time %.2f, System time %.2f\n\ +Maximum resident set size %ld, Integral resident set size %ld\n\ +Non-physical pagefaults %ld, Physical pagefaults %ld, Swaps %ld\n\ +Blocks in %ld out %ld, Messages in %ld out %ld, Signals %ld\n\ +Voluntary context switches %ld, Involuntary context switches %ld\n",  	      (rus.ru_utime.tv_sec * SCALE_SEC +  	       rus.ru_utime.tv_usec / SCALE_USEC) / 100.0,  	      (rus.ru_stime.tv_sec * SCALE_SEC + diff --git a/ext/mysql/libmysql/my_net.h b/ext/mysql/libmysql/my_net.h index 143ddd9d65..4633f3dfbd 100644 --- a/ext/mysql/libmysql/my_net.h +++ b/ext/mysql/libmysql/my_net.h @@ -4,6 +4,10 @@ This file is public domain and comes with NO WARRANTY of any kind */  /* thread safe version of some common functions */  /* for thread safe my_inet_ntoa */ +#ifdef	__cplusplus +extern "C" { +#endif /* __cplusplus */ +  #if !defined(MSDOS) && !defined(__WIN__) && !defined(__BEOS__)  #ifdef HAVE_SYS_SOCKET_H  #include <sys/socket.h> @@ -17,3 +21,7 @@ This file is public domain and comes with NO WARRANTY of any kind */  #endif /* !defined(MSDOS) && !defined(__WIN__) */  void my_inet_ntoa(struct in_addr in, char *buf); + +#ifdef	__cplusplus +} +#endif diff --git a/ext/mysql/libmysql/my_open.c b/ext/mysql/libmysql/my_open.c index 32f90b635e..49d7735818 100644 --- a/ext/mysql/libmysql/my_open.c +++ b/ext/mysql/libmysql/my_open.c @@ -93,7 +93,7 @@ File my_register_filename(File fd, const char *FileName, enum file_type        my_file_opened++;        my_file_info[fd].type = type_of_file;  #if defined(THREAD) && !defined(HAVE_PREAD) -      pthread_mutex_init(&my_file_info[fd].mutex,NULL); +      pthread_mutex_init(&my_file_info[fd].mutex,MY_MUTEX_INIT_FAST);  #endif        pthread_mutex_unlock(&THR_LOCK_open);        DBUG_PRINT("exit",("fd: %d",fd)); diff --git a/ext/mysql/libmysql/my_pthread.c b/ext/mysql/libmysql/my_pthread.c index d5cecc8d45..367542ee8d 100644 --- a/ext/mysql/libmysql/my_pthread.c +++ b/ext/mysql/libmysql/my_pthread.c @@ -302,7 +302,7 @@ int sigwait(sigset_t *setp, int *sigp)      pthread_t sigwait_thread_id;      inited=1;      sigemptyset(&pending_set); -    pthread_mutex_init(&LOCK_sigwait,NULL); +    pthread_mutex_init(&LOCK_sigwait,MY_MUTEX_INIT_FAST);      pthread_cond_init(&COND_sigwait,NULL);      pthread_attr_init(&thr_attr); diff --git a/ext/mysql/libmysql/my_pthread.h b/ext/mysql/libmysql/my_pthread.h index 7e5a1cb840..3b451dca51 100644 --- a/ext/mysql/libmysql/my_pthread.h +++ b/ext/mysql/libmysql/my_pthread.h @@ -427,6 +427,7 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,  #define pthread_mutex_destroy(A) safe_mutex_destroy((A),__FILE__,__LINE__)  #define pthread_cond_wait(A,B) safe_cond_wait((A),(B),__FILE__,__LINE__)  #define pthread_cond_timedwait(A,B,C) safe_cond_timedwait((A),(B),(C),__FILE__,__LINE__) +#define pthread_mutex_trylock(A) pthread_mutex_lock(A)  #define pthread_mutex_t safe_mutex_t  #endif /* SAFE_MUTEX */ @@ -484,11 +485,26 @@ extern	int	my_rw_unlock( my_rw_lock_t * );  #define pthread_attr_setstacksize(A,B) pthread_dummy(0)  #endif +/* Define mutex types */ +#define MY_MUTEX_INIT_SLOW   NULL +#define MY_MUTEX_INIT_FAST   NULL +#define MY_MUTEX_INIT_ERRCHK NULL +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +extern pthread_mutexattr_t my_fast_mutexattr; +#undef  MY_MUTEX_INIT_FAST +#define MY_MUTEX_INIT_FAST &my_fast_mutexattr +#endif +#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +extern pthread_mutexattr_t my_errchk_mutexattr; +#undef MY_INIT_MUTEX_ERRCHK +#define MY_INIT_MUTEX_ERRCHK &my_errchk_mutexattr +#endif +  extern my_bool my_thread_global_init(void);  extern void my_thread_global_end(void);  extern my_bool my_thread_init(void);  extern void my_thread_end(void); -extern char *my_thread_name(void); +extern const char *my_thread_name(void);  extern long my_thread_id(void);  extern int pthread_no_free(void *);  extern int pthread_dummy(int); diff --git a/ext/mysql/libmysql/my_sys.h b/ext/mysql/libmysql/my_sys.h index ca9c564501..5a2689da2a 100644 --- a/ext/mysql/libmysql/my_sys.h +++ b/ext/mysql/libmysql/my_sys.h @@ -27,13 +27,6 @@ extern int NEAR my_errno;		/* Last error in mysys */  #include <stdarg.h>   -#ifdef __EMX__ -/* record loging flags (F_GETLK, F_SETLK, F_SETLKW) */ -#define F_RDLCK     1           /* FreeBSD: shared or read lock */ -#define F_UNLCK     2           /* FreeBSD: unlock */ -#define F_WRLCK     3           /* FreeBSD: exclusive or write lock */ -#endif -  #define MYSYS_PROGRAM_USES_CURSES()  { error_handler_hook = my_message_curses;	mysys_uses_curses=1; }  #define MYSYS_PROGRAM_DONT_USE_CURSES()  { error_handler_hook = my_message_no_curses; mysys_uses_curses=0;}  #define MY_INIT(name);		{ my_progname= name; my_init(); } @@ -55,6 +48,8 @@ extern int NEAR my_errno;		/* Last error in mysys */  #define MY_DONT_CHECK_FILESIZE 128	/* Option to init_io_cache() */  #define MY_LINK_WARNING 32	/* my_redel() gives warning if links */  #define MY_COPYTIME	64	/* my_redel() copys time */ +#define MY_DELETE_OLD	256	/* my_create_with_symlink() */ +#define MY_RESOLVE_LINK 128	/* my_realpath(); Only resolve links */  #define MY_HOLD_ORIGINAL_MODES 128  /* my_copy() holds to file modes */  #define MY_REDEL_MAKE_BACKUP 256  #define MY_SEEK_NOT_DONE 32	/* my_lock may have to do a seek */ @@ -155,7 +150,7 @@ void   __CDECL hfree(void *ptr);  #else  extern int errno;			/* declare errno */  #endif -extern const char ** NEAR errmsg[]; +extern const char ** NEAR my_errmsg[];  extern char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];  extern char *home_dir;			/* Home directory for user */  extern char *my_progname;		/* program-name (printed in errors) */ @@ -371,6 +366,12 @@ extern File my_create(const char *FileName,int CreateFlags,  		      int AccsesFlags, myf MyFlags);  extern int my_close(File Filedes,myf MyFlags);  extern int my_mkdir(const char *dir, int Flags, myf MyFlags); +extern int my_readlink(char *to, const char *filename, myf MyFlags); +extern int my_realpath(char *to, const char *filename, myf MyFlags); +extern File my_create_with_symlink(const char *linkname, const char *filename, +				   int createflags, int access_flags, +				   myf MyFlags); +extern int my_symlink(const char *content, const char *linkname, myf MyFlags);  extern uint my_read(File Filedes,byte *Buffer,uint Count,myf MyFlags);  extern uint my_pread(File Filedes,byte *Buffer,uint Count,my_off_t offset,  		     myf MyFlags); @@ -411,7 +412,7 @@ extern int my_printf_error _VARARGS((uint my_err, const char *format,  				    __attribute__ ((format (printf, 2, 4))));  extern int my_vsnprintf( char *str, size_t n,                                  const char *format, va_list ap ); - +extern int my_snprintf(char* to, size_t n, const char* fmt, ...);  extern int my_message(uint my_err, const char *str,myf MyFlags);  extern int my_message_no_curses(uint my_err, const char *str,myf MyFlags);  extern int my_message_curses(uint my_err, const char *str,myf MyFlags); @@ -421,8 +422,14 @@ extern int my_redel(const char *from, const char *to, int MyFlags);  extern int my_copystat(const char *from, const char *to, int MyFlags);  extern my_string my_filename(File fd); +#ifndef THREAD  extern void dont_break(void);  extern void allow_break(void); +#else +#define dont_break() +#define allow_break() +#endif +  extern void my_remember_signal(int signal_number,sig_handler (*func)(int));  extern void caseup(my_string str,uint length);  extern void casedn(my_string str,uint length); diff --git a/ext/mysql/libmysql/my_thr_init.c b/ext/mysql/libmysql/my_thr_init.c index 2992d483d5..0d0e755bcd 100644 --- a/ext/mysql/libmysql/my_thr_init.c +++ b/ext/mysql/libmysql/my_thr_init.c @@ -14,13 +14,19 @@ This file is public domain and comes with NO WARRANTY of any kind */  pthread_key(struct st_my_thread_var*, THR_KEY_mysys);  #else  pthread_key(struct st_my_thread_var, THR_KEY_mysys); -#endif +#endif /* USE_TLS */  pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache,  	        THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_myisam,THR_LOCK_heap,  	        THR_LOCK_net, THR_LOCK_charset;   #ifndef HAVE_LOCALTIME_R  pthread_mutex_t LOCK_localtime_r;  #endif +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +pthread_mutexattr_t my_fast_mutexattr; +#endif +#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +pthread_mutexattr_t my_errchk_mutexattr; +#endif  /* FIXME  Note.  TlsAlloc does not set an auto destructor, so  	the function my_thread_global_free must be called from @@ -33,20 +39,30 @@ my_bool my_thread_global_init(void)      fprintf(stderr,"Can't initialize threads: error %d\n",errno);      exit(1);    } -  pthread_mutex_init(&THR_LOCK_malloc,NULL); -  pthread_mutex_init(&THR_LOCK_open,NULL); -  pthread_mutex_init(&THR_LOCK_keycache,NULL); -  pthread_mutex_init(&THR_LOCK_lock,NULL); -  pthread_mutex_init(&THR_LOCK_isam,NULL); -  pthread_mutex_init(&THR_LOCK_myisam,NULL); -  pthread_mutex_init(&THR_LOCK_heap,NULL); -  pthread_mutex_init(&THR_LOCK_net,NULL); -  pthread_mutex_init(&THR_LOCK_charset,NULL); +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +  pthread_mutexattr_init(&my_fast_mutexattr); +  pthread_mutexattr_setkind_np(&my_fast_mutexattr,PTHREAD_MUTEX_ADAPTIVE_NP); +#endif +#ifdef PPTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +  pthread_mutexattr_init(&my_errchk_mutexattr); +  pthread_mutexattr_setkind_np(&my_errchk_mutexattr, +			       PTHREAD_MUTEX_ERRORCHECK_NP); +#endif + +  pthread_mutex_init(&THR_LOCK_malloc,MY_MUTEX_INIT_FAST); +  pthread_mutex_init(&THR_LOCK_open,MY_MUTEX_INIT_FAST); +  pthread_mutex_init(&THR_LOCK_keycache,MY_MUTEX_INIT_FAST); +  pthread_mutex_init(&THR_LOCK_lock,MY_MUTEX_INIT_FAST); +  pthread_mutex_init(&THR_LOCK_isam,MY_MUTEX_INIT_SLOW); +  pthread_mutex_init(&THR_LOCK_myisam,MY_MUTEX_INIT_SLOW); +  pthread_mutex_init(&THR_LOCK_heap,MY_MUTEX_INIT_FAST); +  pthread_mutex_init(&THR_LOCK_net,MY_MUTEX_INIT_FAST); +  pthread_mutex_init(&THR_LOCK_charset,MY_MUTEX_INIT_FAST);  #ifdef __WIN__    win_pthread_init();  #endif  #ifndef HAVE_LOCALTIME_R -  pthread_mutex_init(&LOCK_localtime_r,NULL); +  pthread_mutex_init(&LOCK_localtime_r,MY_MUTEX_INIT_SLOW);  #endif    return my_thread_init();  } @@ -56,6 +72,12 @@ void my_thread_global_end(void)  #if defined(USE_TLS)    (void) TlsFree(THR_KEY_mysys);  #endif +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +  pthread_mutexattr_destroy(&my_fast_mutexattr); +#endif +#ifdef PPTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP +  pthread_mutexattr_destroy(&my_errchk_mutexattr); +#endif  }  static long thread_id=0; @@ -100,7 +122,7 @@ my_bool my_thread_init(void)    tmp= &THR_KEY_mysys;  #endif    tmp->id= ++thread_id; -  pthread_mutex_init(&tmp->mutex,NULL); +  pthread_mutex_init(&tmp->mutex,MY_MUTEX_INIT_FAST);    pthread_cond_init(&tmp->suspend, NULL);  #if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX)    pthread_mutex_unlock(&THR_LOCK_lock); @@ -166,14 +188,14 @@ long my_thread_id()  }  #ifdef DBUG_OFF -char *my_thread_name(void) +const char *my_thread_name(void)  {    return "no_name";  }  #else -char *my_thread_name(void) +const char *my_thread_name(void)  {    char name_buff[100];    struct st_my_thread_var *tmp=my_thread_var; diff --git a/ext/mysql/libmysql/my_winthread.c b/ext/mysql/libmysql/my_winthread.c index 675ff54cfc..5d06b698ee 100644 --- a/ext/mysql/libmysql/my_winthread.c +++ b/ext/mysql/libmysql/my_winthread.c @@ -1,4 +1,5 @@ -/* Copyright Abandoned.  Public domain, no warranty, etc. */ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB  +This file is public domain and comes with NO WARRANTY of any kind */  /*****************************************************************************  ** Simulation of posix threads calls for WIN95 and NT @@ -24,7 +25,7 @@ struct pthread_map  void win_pthread_init(void)  { -  pthread_mutex_init(&THR_LOCK_thread,NULL); +  pthread_mutex_init(&THR_LOCK_thread,MY_MUTEX_INIT_FAST);  }  /* diff --git a/ext/mysql/libmysql/mysql.h b/ext/mysql/libmysql/mysql.h index 7f7d3dd203..f44252c9c7 100644 --- a/ext/mysql/libmysql/mysql.h +++ b/ext/mysql/libmysql/mysql.h @@ -6,6 +6,14 @@ This file is public domain and comes with NO WARRANTY of any kind */  #ifndef _mysql_h  #define _mysql_h +#ifdef __CYGWIN__     /* CYGWIN implements a UNIX API */ +#undef WIN +#undef _WIN +#undef _WIN32 +#undef _WIN64 +#undef __WIN__ +#endif +  #ifndef MYSQL_SERVER  #ifdef	__cplusplus  extern "C" { @@ -215,12 +223,11 @@ MYSQL *		STDCALL mysql_real_connect(MYSQL *mysql, const char *host,  void		STDCALL mysql_close(MYSQL *sock);  int		STDCALL mysql_select_db(MYSQL *mysql, const char *db);  int		STDCALL mysql_query(MYSQL *mysql, const char *q); -int		STDCALL mysql_send_query(MYSQL *mysql, const char *q); -int		STDCALL mysql_reap_query(MYSQL *mysql); +int		STDCALL mysql_send_query(MYSQL *mysql, const char *q, +					 unsigned int length); +int		STDCALL mysql_read_query_result(MYSQL *mysql);  int		STDCALL mysql_real_query(MYSQL *mysql, const char *q,  					unsigned int length); -int		STDCALL mysql_real_send_query(MYSQL *mysql, const char *q, -					unsigned int len);  int		STDCALL mysql_create_db(MYSQL *mysql, const char *DB);  int		STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);  int		STDCALL mysql_shutdown(MYSQL *mysql); diff --git a/ext/mysql/libmysql/mysql_com.h b/ext/mysql/libmysql/mysql_com.h index 47e60af524..0f6b5928db 100644 --- a/ext/mysql/libmysql/mysql_com.h +++ b/ext/mysql/libmysql/mysql_com.h @@ -76,7 +76,7 @@ enum enum_server_command {COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY,  #define CLIENT_INTERACTIVE	1024	/* This is an interactive client */  #define CLIENT_SSL              2048     /* Switch to SSL after handshake */  #define CLIENT_IGNORE_SIGPIPE   4096     /* IGNORE sigpipes */ -#define CLIENT_TRANSACTIONS	8196	/* Client knows about transactions */ +#define CLIENT_TRANSACTIONS	8192	/* Client knows about transactions */  #define SERVER_STATUS_IN_TRANS  1	/* Transaction has started */  #define SERVER_STATUS_AUTOCOMMIT 2	/* Server in auto_commit mode */ diff --git a/ext/mysql/libmysql/mysql_version.h b/ext/mysql/libmysql/mysql_version.h index 3ec9679c04..1587579818 100644 --- a/ext/mysql/libmysql/mysql_version.h +++ b/ext/mysql/libmysql/mysql_version.h @@ -7,14 +7,18 @@ This file is public domain and comes with NO WARRANTY of any kind */  #include <custom_conf.h>  #else  #define PROTOCOL_VERSION		10 -#define MYSQL_SERVER_VERSION		"3.23.32" +#define MYSQL_SERVER_VERSION		"3.23.39"  #define MYSQL_SERVER_SUFFIX		""  #define FRM_VER				6 -#define MYSQL_VERSION_ID		32332 +#define MYSQL_VERSION_ID		32339 + +#ifndef MYSQL_PORT  #define MYSQL_PORT			3306 +#endif -/* This is defined at configure time and found in main/php_config.h */ -/* #define MYSQL_UNIX_ADDR			"/tmp/mysql.sock" */ +#ifndef MYSQL_UNIX_ADDR +#define MYSQL_UNIX_ADDR			"/tmp/mysql.sock" +#endif  /* mysqld compile time options */  #ifndef MYSQL_CHARSET diff --git a/ext/mysql/libmysql/mysqld_error.h b/ext/mysql/libmysql/mysqld_error.h index 0391c3e6c4..e412f95a8e 100644 --- a/ext/mysql/libmysql/mysqld_error.h +++ b/ext/mysql/libmysql/mysqld_error.h @@ -198,4 +198,14 @@  #define ER_CRASHED_ON_REPAIR 1195  #define ER_WARNING_NOT_COMPLETE_ROLLBACK 1196  #define ER_TRANS_CACHE_FULL 1197 -#define ER_ERROR_MESSAGES 198 +#define ER_SLAVE_MUST_STOP 1198 +#define ER_SLAVE_NOT_RUNNING 1199 +#define ER_BAD_SLAVE 1200 +#define ER_MASTER_INFO 1201 +#define ER_SLAVE_THREAD 1202 +#define ER_TOO_MANY_USER_CONNECTIONS 1203 +#define ER_SET_CONSTANTS_ONLY 1204 +#define ER_LOCK_WAIT_TIMEOUT 1205 +#define ER_LOCK_TABLE_FULL 1206 +#define ER_READ_ONLY_TRANSACTION 1207 +#define ER_ERROR_MESSAGES 208 diff --git a/ext/mysql/libmysql/mysys_err.h b/ext/mysql/libmysql/mysys_err.h index 066162cf48..469d5a680e 100644 --- a/ext/mysql/libmysql/mysys_err.h +++ b/ext/mysql/libmysql/mysys_err.h @@ -8,7 +8,7 @@ extern "C" {  #endif  #define GLOB		0	/* Error maps */ -#define GLOBERRS	24	/* Max number of error messages in map's */ +#define GLOBERRS	27	/* Max number of error messages in map's */  #define EE(X)	globerrs[ X ]	/* Defines to add error to right map */  extern const char * NEAR globerrs[];	/* my_error_messages is here */ @@ -37,6 +37,9 @@ extern const char * NEAR globerrs[];	/* my_error_messages is here */  #define EE_CANT_MKDIR		21  #define EE_UNKNOWN_CHARSET	22  #define EE_OUT_OF_FILERESOURCES	23 +#define EE_CANT_READLINK	24 +#define EE_CANT_SYMLINK		25 +#define EE_REALPATH		26  #ifdef	__cplusplus  } diff --git a/ext/mysql/libmysql/mysys_priv.h b/ext/mysql/libmysql/mysys_priv.h index 96e777d854..a0131ea77e 100644 --- a/ext/mysql/libmysql/mysys_priv.h +++ b/ext/mysql/libmysql/mysys_priv.h @@ -11,6 +11,7 @@ This file is public domain and comes with NO WARRANTY of any kind */  #ifdef THREAD  extern pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache,    THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_net,THR_LOCK_charset; +extern pthread_mutex_t LOCK_bitmap;  #else /* THREAD */  #define pthread_mutex_lock(A)  #define pthread_mutex_unlock(A) diff --git a/ext/mysql/libmysql/net.c b/ext/mysql/libmysql/net.c index 3e15657865..0dc0c06ffa 100644 --- a/ext/mysql/libmysql/net.c +++ b/ext/mysql/libmysql/net.c @@ -20,7 +20,6 @@ This file is public domain and comes with NO WARRANTY of any kind */  #include <signal.h>  #include <errno.h>  #include <sys/types.h> -#include <violite.h>  #ifdef MYSQL_SERVER  ulong max_allowed_packet=65536; diff --git a/ext/mysql/libmysql/thr_mutex.c b/ext/mysql/libmysql/thr_mutex.c index a6147b409a..7ec8bfb59a 100644 --- a/ext/mysql/libmysql/thr_mutex.c +++ b/ext/mysql/libmysql/thr_mutex.c @@ -29,19 +29,8 @@ int safe_mutex_init(safe_mutex_t *mp,  		    const pthread_mutexattr_t *attr __attribute__((unused)))  {    bzero((char*) mp,sizeof(*mp)); -#ifdef HAVE_LINUXTHREADS			/* Some extra safety */ -  { -    pthread_mutexattr_t tmp; -    pthread_mutexattr_init(&tmp); -    pthread_mutexattr_setkind_np(&tmp,PTHREAD_MUTEX_ERRORCHECK_NP); -    pthread_mutex_init(&mp->global,&tmp); -    pthread_mutex_init(&mp->mutex, &tmp); -    pthread_mutexattr_destroy(&tmp); -  } -#else -  pthread_mutex_init(&mp->global,NULL); +  pthread_mutex_init(&mp->global,MY_MUTEX_INIT_ERRCHK);    pthread_mutex_init(&mp->mutex,attr); -#endif    return 0;  } diff --git a/ext/mysql/libmysql/typelib.c b/ext/mysql/libmysql/typelib.c index fde423353a..0fd4415b2c 100644 --- a/ext/mysql/libmysql/typelib.c +++ b/ext/mysql/libmysql/typelib.c @@ -42,7 +42,7 @@ int find_type(my_string x, TYPELIB *typelib, uint full_name)        if (! *i)  	DBUG_RETURN(pos+1);      } -    if (! *i) +    if (! *i && (!*j || !(full_name & 1)))      {        find++;        findpos=pos; @@ -50,7 +50,7 @@ int find_type(my_string x, TYPELIB *typelib, uint full_name)    }    if (find == 0 && (full_name & 4) && x[0] == '#' && strend(x)[-1] == '#' &&        (findpos=atoi(x+1)-1) >= 0 && (uint) findpos < typelib->count) -	find=1; +    find=1;    else if (find == 0 || ! x[0])    {      DBUG_PRINT("exit",("Couldn't find type")); diff --git a/ext/mysql/libmysql/update_sources b/ext/mysql/libmysql/update_sources index 573129b020..87547e483e 100755 --- a/ext/mysql/libmysql/update_sources +++ b/ext/mysql/libmysql/update_sources @@ -10,13 +10,13 @@ $| = 1;  my $command = shift || usage();  $command =~ /^--(?:update|huh|restore)$/ or usage(); -my $from = shift || '/users/tim/my/work'; +my $from = shift || '/my/mysql';  my @source_dirs = qw/dbug strings mysys libmysql include/;  my $source_re = qr/\.(?:cc?|h)$/;  my %skip = ( -  'ctype_autoconf.c' => 1, -  'ctype_extra_sources.c' => 1, -  'my_config.h' => 1, +  'ctype_autoconf.c' => 1,              # PHP uses a pre-made one +  'ctype_extra_sources.c' => 1,         # same here +  'my_config.h' => 1,                   # we use php_config.h  );  opendir D, "." @@ -75,6 +75,13 @@ sub usage  usage: $0 --update [mysql-source-dir]         $0 --huh         $0 --restore + +    Typical use is: +        \$ $0 --update 2>&1 > /tmp/php-update.diff +        \$ @{[$ENV{EDITOR}||'vi']} /tmp/php-update.diff      #does it look okay? +	\$ Monkey around a bit +	\$ cvs diff -u | less		# does this look okay? +        \$ rm *.orig  EOF  }  | 
