1 /* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
2    Copyright (c) 2010, 2022, MariaDB Corporation.
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; version 2 of the License.
7 
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12 
13    You should have received a copy of the GNU General Public License
14    along with this program; if not, write to the Free Software
15    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1335  USA */
16 
17 #ifndef _my_sys_h
18 #define _my_sys_h
19 
20 #include <m_string.h>
21 #include <mysql/psi/mysql_memory.h>
22 
23 C_MODE_START
24 
25 
26 #include <my_valgrind.h>
27 #include <my_pthread.h>
28 #include <m_ctype.h>                    /* for CHARSET_INFO */
29 #include <stdarg.h>
30 #include <typelib.h>
31 #ifdef _WIN32
32 #include <malloc.h> /*for alloca*/
33 #endif
34 #include <mysql/plugin.h>
35 #include <mysql/service_my_print_error.h>
36 
37 #define MY_INIT(name)   { my_progname= name; my_init(); }
38 
39 /**
40   Max length of an error message generated by mysys utilities.
41   Some mysys functions produce error messages. These mostly go
42   to stderr.
43   This constant defines the size of the buffer used to format
44   the message. It should be kept in sync with MYSQL_ERRMSG_SIZE,
45   since sometimes mysys errors are stored in the server diagnostics
46   area, and we would like to avoid unexpected truncation.
47 */
48 #define MYSYS_ERRMSG_SIZE   (512)
49 #define MYSYS_STRERROR_SIZE (128)
50 
51 #define MY_FILE_ERROR	((size_t) -1)
52 
53 	/* General bitmaps for my_func's */
54 #define MY_FFNF		1U	/* Fatal if file not found */
55 #define MY_FNABP	2U	/* Fatal if not all bytes read/written */
56 #define MY_NABP		4U	/* Error if not all bytes read/written */
57 #define MY_FAE		8U	/* Fatal if any error */
58 #define MY_WME		16U	/* Write message on error */
59 #define MY_WAIT_IF_FULL 32U	/* Wait and try again if disk full error */
60 #define MY_IGNORE_BADFD 32U     /* my_sync(): ignore 'bad descriptor' errors */
61 #define MY_IGNORE_ENOENT 32U    /* my_delete() ignores ENOENT (no such file) */
62 #define MY_ENCRYPT      64U     /* Encrypt IO_CACHE temporary files */
63 #define MY_TEMPORARY    64U     /* create_temp_file(): delete file at once */
64 #define MY_NOSYMLINKS  512U     /* my_open(): don't follow symlinks */
65 #define MY_FULL_IO     512U     /* my_read(): loop until I/O is complete */
66 #define MY_DONT_CHECK_FILESIZE 128U /* Option to init_io_cache() */
67 #define MY_LINK_WARNING 32U	/* my_redel() gives warning if links */
68 #define MY_COPYTIME	64U	/* my_redel() copies time */
69 #define MY_DELETE_OLD	256U	/* my_create_with_symlink() */
70 #define MY_RESOLVE_LINK 128U	/* my_realpath(); Only resolve links */
71 #define MY_HOLD_ORIGINAL_MODES 128U  /* my_copy() holds to file modes */
72 #define MY_REDEL_MAKE_BACKUP 256U
73 #define MY_SEEK_NOT_DONE 32U	/* my_lock may have to do a seek */
74 #define MY_SHORT_WAIT	64U	/* my_lock() don't wait if can't lock */
75 #define MY_FORCE_LOCK   128U    /* use my_lock() even if disable_locking */
76 #define MY_NO_WAIT      256U	/* my_lock() don't wait at all */
77 /*
78   init_dynamic_array() has init buffer; Internal flag, not to be used by
79   caller.
80 */
81 #define MY_INIT_BUFFER_USED 256U
82 #define MY_ZEROFILL	32U	/* my_malloc(), fill array with zero */
83 #define MY_ALLOW_ZERO_PTR 64U	/* my_realloc() ; zero ptr -> malloc */
84 #define MY_FREE_ON_ERROR 128U	/* my_realloc() ; Free old ptr on error */
85 #define MY_DONT_OVERWRITE_FILE 2048U /* my_copy: Don't overwrite file */
86 #define MY_THREADSAFE 2048U     /* my_seek(): lock fd mutex */
87 #define MY_SYNC       4096U     /* my_copy(): sync dst file */
88 #define MY_SYNC_DIR   32768U    /* my_create/delete/rename: sync directory */
89 #define MY_SYNC_FILESIZE 65536U /* my_sync(): safe sync when file is extended */
90 #define MY_THREAD_SPECIFIC 0x10000U /* my_malloc(): thread specific */
91 /* Tree that should delete things automatically */
92 #define MY_TREE_WITH_DELETE 0x40000U
93 
94 #define MY_CHECK_ERROR	1U	/* Params to my_end; Check open-close */
95 #define MY_GIVE_INFO	2U	/* Give time info about process*/
96 #define MY_DONT_FREE_DBUG 4U    /* Do not call DBUG_END() in my_end() */
97 
98 #define ME_BELL           4U    /* Ring bell then printing message */
99 #define ME_ERROR_LOG      64    /**< write the error message to error log */
100 #define ME_ERROR_LOG_ONLY 128   /**< write the error message to error log only */
101 #define ME_NOTE           1024  /**< not error but just info */
102 #define ME_WARNING        2048  /**< not error but just warning */
103 #define ME_FATAL          4096  /**< fatal statement error */
104 
105 	/* Bits in last argument to fn_format */
106 #define MY_REPLACE_DIR		1U	/* replace dir in name with 'dir' */
107 #define MY_REPLACE_EXT		2U	/* replace extension with 'ext' */
108 #define MY_UNPACK_FILENAME	4U	/* Unpack name (~ -> home) */
109 #define MY_PACK_FILENAME	8U	/* Pack name (home -> ~) */
110 #define MY_RESOLVE_SYMLINKS	16U	/* Resolve all symbolic links */
111 #define MY_RETURN_REAL_PATH	32U	/* return full path for file */
112 #define MY_SAFE_PATH		64U	/* Return NULL if too long path */
113 #define MY_RELATIVE_PATH	128U	/* name is relative to 'dir' */
114 #define MY_APPEND_EXT           256U    /* add 'ext' as additional extension*/
115 
116 
117 	/* My seek flags */
118 #define MY_SEEK_SET	0
119 #define MY_SEEK_CUR	1
120 #define MY_SEEK_END	2
121 
122 	/* Some constants */
123 #define MY_WAIT_FOR_USER_TO_FIX_PANIC	60	/* in seconds */
124 #define MY_WAIT_GIVE_USER_A_MESSAGE	10	/* Every 10 times of prev */
125 #define MIN_COMPRESS_LENGTH		50	/* Don't compress small bl. */
126 #define DFLT_INIT_HITS  3
127 
128 	/* root_alloc flags */
129 #define MY_KEEP_PREALLOC	1U
130 #define MY_MARK_BLOCKS_FREE     2U /* move used to free list and reuse them */
131 
132 	/* Internal error numbers (for assembler functions) */
133 #define MY_ERRNO_EDOM		33
134 #define MY_ERRNO_ERANGE		34
135 
136 	/* Bits for get_date timeflag */
137 #define GETDATE_DATE_TIME	1U
138 #define GETDATE_SHORT_DATE	2U
139 #define GETDATE_HHMMSSTIME	4U
140 #define GETDATE_GMT		8U
141 #define GETDATE_FIXEDLENGTH	16U
142 
143 /* Extra length needed for filename if one calls my_create_backup_name */
144 #define MY_BACKUP_NAME_EXTRA_LENGTH 17
145 
146 char *guess_malloc_library();
147 
148 /* If we have our own safemalloc (for debugging) */
149 #if defined(SAFEMALLOC)
150 void sf_report_leaked_memory(my_thread_id id);
151 int sf_sanity();
152 extern my_thread_id (*sf_malloc_dbug_id)(void);
153 #define SAFEMALLOC_REPORT_MEMORY(X) sf_report_leaked_memory(X)
154 #else
155 #define SAFEMALLOC_REPORT_MEMORY(X) do {} while(0)
156 #endif
157 
158 typedef void (*MALLOC_SIZE_CB) (long long size, my_bool is_thread_specific);
159 extern void set_malloc_size_cb(MALLOC_SIZE_CB func);
160 
161 	/* defines when allocating data */
162 extern void *my_malloc(PSI_memory_key key, size_t size, myf MyFlags);
163 extern void *my_multi_malloc(PSI_memory_key key, myf MyFlags, ...);
164 extern void *my_multi_malloc_large(PSI_memory_key key, myf MyFlags, ...);
165 extern void *my_realloc(PSI_memory_key key, void *ptr, size_t size, myf MyFlags);
166 extern void my_free(void *ptr);
167 extern void *my_memdup(PSI_memory_key key, const void *from,size_t length,myf MyFlags);
168 extern char *my_strdup(PSI_memory_key key, const char *from,myf MyFlags);
169 extern char *my_strndup(PSI_memory_key key, const char *from, size_t length, myf MyFlags);
170 
171 int my_init_large_pages(my_bool super_large_pages);
172 uchar *my_large_malloc(size_t *size, myf my_flags);
173 void my_large_free(void *ptr, size_t size);
174 
175 #ifdef _WIN32
176 extern BOOL my_obtain_privilege(LPCSTR lpPrivilege);
177 #endif
178 
179 void my_init_atomic_write(void);
180 #ifdef __linux__
181 my_bool my_test_if_atomic_write(File handle, int pagesize);
182 #else
183 #define my_test_if_atomic_write(A, B) 0
184 #endif /* __linux__ */
185 extern my_bool my_may_have_atomic_write;
186 
187 #if defined(HAVE_ALLOCA) && !defined(HAVE_valgrind)
188 #if defined(_AIX) && !defined(__GNUC__) && !defined(_AIX43)
189 #pragma alloca
190 #endif /* _AIX */
191 #if defined(__MWERKS__)
192 #undef alloca
193 #define alloca _alloca
194 #endif /* __MWERKS__ */
195 #if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && ! defined(alloca)
196 #define alloca __builtin_alloca
197 #endif /* GNUC */
198 #define my_alloca(SZ) alloca((size_t) (SZ))
199 #define my_afree(PTR) ((void)0)
200 #define MAX_ALLOCA_SZ 4096
201 #define my_safe_alloca(size) (((size) <= MAX_ALLOCA_SZ) ? \
202                                my_alloca(size) : \
203                                my_malloc(PSI_NOT_INSTRUMENTED, (size), MYF(MY_THREAD_SPECIFIC|MY_WME)))
204 #define my_safe_afree(ptr, size) \
205                   do { if ((size) > MAX_ALLOCA_SZ) my_free(ptr); } while(0)
206 #else
207 #define my_alloca(SZ) my_malloc(PSI_NOT_INSTRUMENTED, SZ,MYF(MY_FAE))
208 #define my_afree(PTR) my_free(PTR)
209 #define my_safe_alloca(size) my_alloca(size)
210 #define my_safe_afree(ptr, size) my_afree(ptr)
211 #endif /* HAVE_ALLOCA */
212 
213 #ifndef errno				/* did we already get it? */
214 #ifdef HAVE_ERRNO_AS_DEFINE
215 #include <errno.h>			/* errno is a define */
216 #else
217 extern int errno;			/* declare errno */
218 #endif
219 #endif					/* #ifndef errno */
220 extern char *home_dir;			/* Home directory for user */
221 extern MYSQL_PLUGIN_IMPORT char  *mysql_data_home;
222 extern const char *my_progname;		/* program-name (printed in errors) */
223 extern const char *my_progname_short;	/* like above but without directory */
224 extern char curr_dir[];		/* Current directory for user */
225 extern void (*error_handler_hook)(uint my_err, const char *str,myf MyFlags);
226 extern void (*fatal_error_handler_hook)(uint my_err, const char *str,
227 				       myf MyFlags);
228 extern uint my_file_limit;
229 extern ulonglong my_thread_stack_size;
230 extern int sf_leaking_memory; /* set to 1 to disable memleak detection */
231 
232 extern void (*proc_info_hook)(void *, const PSI_stage_info *, PSI_stage_info *,
233                               const char *, const char *, const unsigned int);
234 
235 /* charsets */
236 #define MY_ALL_CHARSETS_SIZE 2048
237 extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *default_charset_info;
238 extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *all_charsets[MY_ALL_CHARSETS_SIZE];
239 extern struct charset_info_st compiled_charsets[];
240 
241 /* Collation properties and use statistics */
242 extern my_bool my_collation_is_known_id(uint id);
243 extern ulonglong my_collation_statistics_get_use_count(uint id);
244 extern const char *my_collation_get_tailoring(uint id);
245 
246 /* statistics */
247 extern ulong    my_stream_opened, my_tmp_file_created;
248 extern ulong    my_file_total_opened;
249 extern ulong    my_sync_count;
250 extern uint	mysys_usage_id;
251 extern int32    my_file_opened;
252 extern my_bool	my_init_done, my_thr_key_mysys_exists;
253 extern my_bool my_assert;
254 extern my_bool  my_assert_on_error;
255 extern myf      my_global_flags;        /* Set to MY_WME for more error messages */
256 					/* Point to current my_message() */
257 extern void (*my_sigtstp_cleanup)(void),
258 					/* Executed before jump to shell */
259 	    (*my_sigtstp_restart)(void);
260 					/* Executed when coming from shell */
261 extern MYSQL_PLUGIN_IMPORT int my_umask;		/* Default creation mask  */
262 extern int my_umask_dir,
263 	   my_recived_signals,	/* Signals we have got */
264 	   my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
265 	   my_dont_interrupt;	/* call remember_intr when set */
266 extern MYSQL_PLUGIN_IMPORT my_bool my_use_symdir;
267 
268 extern ulong	my_default_record_cache_size;
269 extern MYSQL_PLUGIN_IMPORT my_bool my_disable_locking;
270 extern my_bool  my_disable_async_io,
271                 my_disable_flush_key_blocks, my_disable_symlinks;
272 extern my_bool my_disable_sync, my_disable_copystat_in_redel;
273 extern char	wild_many,wild_one,wild_prefix;
274 extern const char *charsets_dir;
275 
276 enum cache_type
277 {
278   TYPE_NOT_SET= 0, READ_CACHE, WRITE_CACHE,
279   SEQ_READ_APPEND		/* sequential read or append */,
280   READ_FIFO, READ_NET};
281 
282 enum flush_type
283 {
284   FLUSH_KEEP,           /* flush block and keep it in the cache */
285   FLUSH_RELEASE,        /* flush block and remove it from the cache */
286   FLUSH_IGNORE_CHANGED, /* remove block from the cache */
287   /*
288     As my_disable_flush_pagecache_blocks is always 0, the following option
289     is strictly equivalent to FLUSH_KEEP
290   */
291   FLUSH_FORCE_WRITE,
292   /**
293      @brief like FLUSH_KEEP but return immediately if file is already being
294      flushed (even partially) by another thread; only for page cache,
295      forbidden for key cache.
296   */
297   FLUSH_KEEP_LAZY
298 };
299 
300 typedef struct st_record_cache	/* Used when caching records */
301 {
302   File file;
303   int	rc_seek,error,inited;
304   uint	rc_length,read_length,reclength;
305   my_off_t rc_record_pos,end_of_file;
306   uchar *rc_buff,*rc_buff2,*rc_pos,*rc_end,*rc_request_pos;
307   enum cache_type type;
308 } RECORD_CACHE;
309 
310 enum file_type
311 {
312   UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, STREAM_BY_FOPEN, STREAM_BY_FDOPEN,
313   FILE_BY_O_TMPFILE, FILE_BY_MKSTEMP, FILE_BY_DUP
314 };
315 
316 struct st_my_file_info
317 {
318   char  *name;
319 #ifdef _WIN32
320   HANDLE fhandle;   /* win32 file handle */
321   int    oflag;     /* open flags, e.g O_APPEND */
322 #endif
323   enum   file_type	type;
324 };
325 
326 extern struct st_my_file_info *my_file_info;
327 
328 /* Free function pointer */
329 typedef void (*FREE_FUNC)(void *);
330 
331 typedef struct st_dynamic_array
332 {
333   uchar *buffer;
334   uint elements,max_element;
335   uint alloc_increment;
336   uint size_of_element;
337   PSI_memory_key m_psi_key;
338   myf malloc_flags;
339 } DYNAMIC_ARRAY;
340 
341 typedef struct st_my_tmpdir
342 {
343   DYNAMIC_ARRAY full_list;
344   char **list;
345   uint cur, max;
346   mysql_mutex_t mutex;
347 } MY_TMPDIR;
348 
349 typedef struct st_dynamic_string
350 {
351   char *str;
352   size_t length,max_length,alloc_increment;
353 } DYNAMIC_STRING;
354 
355 struct st_io_cache;
356 
357 typedef struct st_io_cache_share
358 {
359   mysql_mutex_t       mutex;           /* To sync on reads into buffer. */
360   mysql_cond_t        cond;            /* To wait for signals. */
361   mysql_cond_t        cond_writer;     /* For a synchronized writer. */
362   /* Offset in file corresponding to the first byte of buffer. */
363   my_off_t              pos_in_file;
364   /* If a synchronized write cache is the source of the data. */
365   struct st_io_cache    *source_cache;
366   uchar                 *buffer;         /* The read buffer. */
367   uchar                 *read_end;       /* Behind last valid byte of buffer. */
368   int                   running_threads; /* threads not in lock. */
369   int                   total_threads;   /* threads sharing the cache. */
370   int                   error;           /* Last error. */
371 #ifdef NOT_YET_IMPLEMENTED
372   /* whether the structure should be free'd */
373   my_bool alloced;
374 #endif
375 } IO_CACHE_SHARE;
376 
377 typedef struct st_io_cache		/* Used when caching files */
378 {
379   /* Offset in file corresponding to the first byte of uchar* buffer. */
380   my_off_t pos_in_file;
381   /*
382     The offset of end of file for READ_CACHE and WRITE_CACHE.
383     For SEQ_READ_APPEND it the maximum of the actual end of file and
384     the position represented by read_end.
385   */
386   my_off_t end_of_file;
387   /* Points to current read position in the buffer */
388   uchar	*read_pos;
389   /* the non-inclusive boundary in the buffer for the currently valid read */
390   uchar  *read_end;
391   uchar  *buffer;				/* The read buffer */
392   /* Used in ASYNC_IO */
393   uchar  *request_pos;
394 
395   /* Only used in WRITE caches and in SEQ_READ_APPEND to buffer writes */
396   uchar  *write_buffer;
397   /*
398     Only used in SEQ_READ_APPEND, and points to the current read position
399     in the write buffer. Note that reads in SEQ_READ_APPEND caches can
400     happen from both read buffer (uchar* buffer) and write buffer
401     (uchar* write_buffer).
402   */
403   uchar *append_read_pos;
404   /* Points to current write position in the write buffer */
405   uchar *write_pos;
406   /* The non-inclusive boundary of the valid write area */
407   uchar *write_end;
408 
409   /*
410     The lock is for append buffer used in SEQ_READ_APPEND cache
411     need mutex copying from append buffer to read buffer.
412   */
413   mysql_mutex_t append_buffer_lock;
414   /*
415     The following is used when several threads are reading the
416     same file in parallel. They are synchronized on disk
417     accesses reading the cached part of the file asynchronously.
418     It should be set to NULL to disable the feature.  Only
419     READ_CACHE mode is supported.
420   */
421   IO_CACHE_SHARE *share;
422 
423   /*
424     A caller will use my_b_read() macro to read from the cache
425     if the data is already in cache, it will be simply copied with
426     memcpy() and internal variables will be accordinging updated with
427     no functions invoked. However, if the data is not fully in the cache,
428     my_b_read() will call read_function to fetch the data. read_function
429     must never be invoked directly.
430   */
431   int (*read_function)(struct st_io_cache *,uchar *,size_t);
432   /*
433     Same idea as in the case of read_function, except my_b_write() needs to
434     be replaced with my_b_append() for a SEQ_READ_APPEND cache
435   */
436   int (*write_function)(struct st_io_cache *,const uchar *,size_t);
437   /*
438     Specifies the type of the cache. Depending on the type of the cache
439     certain operations might not be available and yield unpredicatable
440     results. Details to be documented later
441   */
442   enum cache_type type;
443   /*
444     Counts the number of times, when we were forced to use disk. We use it to
445     increase the binlog_cache_disk_use and binlog_stmt_cache_disk_use status
446     variables.
447   */
448   ulong disk_writes;
449   char *file_name;			/* if used with 'open_cached_file' */
450   const char *dir;
451   char prefix[3];
452   File file; /* file descriptor */
453 
454   struct st_io_cache *next_file_user;
455   /*
456     seek_not_done is set by my_b_seek() to inform the upcoming read/write
457     operation that a seek needs to be preformed prior to the actual I/O
458     error is 0 if the cache operation was successful, -1 if there was a
459     "hard" error, and the actual number of I/O-ed bytes if the read/write was
460     partial.
461   */
462   int	seek_not_done,error;
463   /* length of the buffer used for storing un-encrypted data */
464   size_t	buffer_length;
465   /* read_length is the same as buffer_length except when we use async io */
466   size_t  read_length;
467   myf	myflags;			/* Flags used to my_read/my_write */
468   /*
469     alloced_buffer is set to the size of the buffer allocated for the IO_CACHE.
470     Includes the overhead(storing key to ecnrypt and decrypt) for encryption.
471     Set to 0 if nothing is allocated.
472     Currently READ_NET is the only one that will use a buffer allocated
473     somewhere else
474   */
475   size_t alloced_buffer;
476 } IO_CACHE;
477 
478 typedef int (*qsort2_cmp)(const void *, const void *, const void *);
479 
480 typedef void (*my_error_reporter)(enum loglevel level, const char *format, ...)
481   ATTRIBUTE_FORMAT_FPTR(printf, 2, 3);
482 
483 extern my_error_reporter my_charset_error_reporter;
484 
485 extern PSI_file_key key_file_io_cache;
486 
487 /* inline functions for mf_iocache */
488 
489 extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock);
490 extern int _my_b_get(IO_CACHE *info);
491 extern int _my_b_read(IO_CACHE *info,uchar *Buffer,size_t Count);
492 extern int _my_b_write(IO_CACHE *info,const uchar *Buffer,size_t Count);
493 
494 /* Test if buffer is inited */
my_b_clear(IO_CACHE * info)495 static inline void my_b_clear(IO_CACHE *info) { info->buffer= 0; }
my_b_inited(IO_CACHE * info)496 static inline int my_b_inited(IO_CACHE *info) { return MY_TEST(info->buffer); }
497 #define my_b_EOF INT_MIN
498 
my_b_read(IO_CACHE * info,uchar * Buffer,size_t Count)499 static inline int my_b_read(IO_CACHE *info, uchar *Buffer, size_t Count)
500 {
501   if (info->read_pos + Count <= info->read_end)
502   {
503     memcpy(Buffer, info->read_pos, Count);
504     info->read_pos+= Count;
505     return 0;
506   }
507   return _my_b_read(info, Buffer, Count);
508 }
509 
my_b_write(IO_CACHE * info,const uchar * Buffer,size_t Count)510 static inline int my_b_write(IO_CACHE *info, const uchar *Buffer, size_t Count)
511 {
512   MEM_CHECK_DEFINED(Buffer, Count);
513   if (info->write_pos + Count <= info->write_end)
514   {
515     if (Count)
516     {
517       memcpy(info->write_pos, Buffer, Count);
518       info->write_pos+= Count;
519     }
520     return 0;
521   }
522   return _my_b_write(info, Buffer, Count);
523 }
524 
my_b_get(IO_CACHE * info)525 static inline int my_b_get(IO_CACHE *info)
526 {
527   if (info->read_pos != info->read_end)
528   {
529     info->read_pos++;
530     return info->read_pos[-1];
531   }
532   return _my_b_get(info);
533 }
534 
my_b_write_byte(IO_CACHE * info,uchar chr)535 static inline my_bool my_b_write_byte(IO_CACHE *info, uchar chr)
536 {
537   MEM_CHECK_DEFINED(&chr, 1);
538   if (info->write_pos >= info->write_end)
539     if (my_b_flush_io_cache(info, 1))
540       return 1;
541   *info->write_pos++= chr;
542   return 0;
543 }
544 
545 /**
546   Fill buffer of the cache.
547 
548   @note It assumes that you have already used all characters in the CACHE,
549         independent of the read_pos value!
550 
551   @returns
552         0     On error or EOF (info->error = -1 on error)
553         #     Number of characters
554 */
my_b_fill(IO_CACHE * info)555 static inline size_t my_b_fill(IO_CACHE *info)
556 {
557   info->read_pos= info->read_end;
558   return _my_b_read(info,0,0) ? 0 : (size_t) (info->read_end - info->read_pos);
559 }
560 
my_b_tell(const IO_CACHE * info)561 static inline my_off_t my_b_tell(const IO_CACHE *info)
562 {
563   if (info->type == WRITE_CACHE) {
564     return info->pos_in_file + (my_off_t)(info->write_pos - info->request_pos);
565 
566   }
567   return info->pos_in_file + (my_off_t) (info->read_pos - info->request_pos);
568 }
569 
my_b_write_tell(const IO_CACHE * info)570 static inline my_off_t my_b_write_tell(const IO_CACHE *info)
571 {
572   return info->pos_in_file + (my_off_t) (info->write_pos - info->write_buffer);
573 }
574 
my_b_get_buffer_start(const IO_CACHE * info)575 static inline uchar* my_b_get_buffer_start(const IO_CACHE *info)
576 {
577   return info->request_pos;
578 }
579 
my_b_get_bytes_in_buffer(const IO_CACHE * info)580 static inline size_t my_b_get_bytes_in_buffer(const IO_CACHE *info)
581 {
582   return (size_t) (info->read_end - info->request_pos);
583 }
584 
my_b_get_pos_in_file(const IO_CACHE * info)585 static inline my_off_t my_b_get_pos_in_file(const IO_CACHE *info)
586 {
587   return info->pos_in_file;
588 }
589 
my_b_bytes_in_cache(const IO_CACHE * info)590 static inline size_t my_b_bytes_in_cache(const IO_CACHE *info)
591 {
592   if (info->type == WRITE_CACHE) {
593     return (size_t) (info->write_end - info->write_pos);
594   }
595   return (size_t) (info->read_end - info->read_pos);
596 }
597 
598 int my_b_copy_to_file    (IO_CACHE *cache, FILE *file, size_t count);
599 int my_b_copy_all_to_file(IO_CACHE *cache, FILE *file);
600 
601 my_off_t my_b_append_tell(IO_CACHE* info);
602 my_off_t my_b_safe_tell(IO_CACHE* info); /* picks the correct tell() */
603 int my_b_pread(IO_CACHE *info, uchar *Buffer, size_t Count, my_off_t pos);
604 
605 typedef uint32 ha_checksum;
606 
607 extern int (*mysys_test_invalid_symlink)(const char *filename);
608 #include <my_alloc.h>
609 
610 	/* Prototypes for mysys and my_func functions */
611 
612 extern int my_copy(const char *from,const char *to,myf MyFlags);
613 extern int my_delete(const char *name,myf MyFlags);
614 extern int my_rmtree(const char *name, myf Myflags);
615 extern int my_getwd(char * buf,size_t size,myf MyFlags);
616 extern int my_setwd(const char *dir,myf MyFlags);
617 extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags);
618 extern void *my_once_alloc(size_t Size,myf MyFlags);
619 extern void my_once_free(void);
620 extern char *my_once_strdup(const char *src,myf myflags);
621 extern void *my_once_memdup(const void *src, size_t len, myf myflags);
622 extern File my_open(const char *FileName,int Flags,myf MyFlags);
623 extern File my_register_filename(File fd, const char *FileName,
624 				 enum file_type type_of_file,
625 				 uint error_message_number, myf MyFlags);
626 extern File my_create(const char *FileName,int CreateFlags,
627 		      int AccessFlags, myf MyFlags);
628 extern int my_close(File Filedes,myf MyFlags);
629 extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
630 extern int my_readlink(char *to, const char *filename, myf MyFlags);
631 extern int my_is_symlink(const char *filename);
632 extern int my_realpath(char *to, const char *filename, myf MyFlags);
633 extern File my_create_with_symlink(const char *linkname, const char *filename,
634 				   int createflags, int access_flags,
635 				   myf MyFlags);
636 extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags);
637 extern int my_symlink(const char *content, const char *linkname, myf MyFlags);
638 extern int my_handler_delete_with_symlink(const char *filename, myf sync_dir);
639 
640 extern size_t my_read(File Filedes,uchar *Buffer,size_t Count,myf MyFlags);
641 extern size_t my_pread(File Filedes,uchar *Buffer,size_t Count,my_off_t offset,
642 		     myf MyFlags);
643 extern int my_rename(const char *from,const char *to,myf MyFlags);
644 extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags);
645 extern my_off_t my_tell(File fd,myf MyFlags);
646 extern size_t my_write(File Filedes,const uchar *Buffer,size_t Count,
647 		     myf MyFlags);
648 extern size_t my_pwrite(File Filedes,const uchar *Buffer,size_t Count,
649 		      my_off_t offset,myf MyFlags);
650 extern size_t my_fread(FILE *stream,uchar *Buffer,size_t Count,myf MyFlags);
651 extern size_t my_fwrite(FILE *stream,const uchar *Buffer,size_t Count,
652 		      myf MyFlags);
653 extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags);
654 extern my_off_t my_ftell(FILE *stream,myf MyFlags);
655 
656 /* implemented in my_memmem.c */
657 extern void *my_memmem(const void *haystack, size_t haystacklen,
658                        const void *needle, size_t needlelen);
659 
660 
661 #ifdef _WIN32
662 extern int      my_access(const char *path, int amode);
663 #define my_check_user(A,B) (NULL)
664 #define my_set_user(A,B,C) (0)
665 #else
666 #define my_access access
667 struct passwd *my_check_user(const char *user, myf MyFlags);
668 int my_set_user(const char *user, struct passwd *user_info, myf MyFlags);
669 #endif
670 
671 extern int check_if_legal_filename(const char *path);
672 extern int check_if_legal_tablename(const char *path);
673 
674 #ifdef _WIN32
675 extern my_bool is_filename_allowed(const char *name, size_t length,
676                    my_bool allow_current_dir);
677 #else /* _WIN32 */
678 # define is_filename_allowed(name, length, allow_cwd) (TRUE)
679 #endif /* _WIN32 */
680 
681 #ifdef _WIN32
682 /* Windows-only functions (CRT equivalents)*/
683 extern HANDLE   my_get_osfhandle(File fd);
684 extern File     my_win_handle2File(HANDLE hFile);
685 extern void     my_osmaperr(unsigned long last_error);
686 #endif
687 
688 extern void init_glob_errs(void);
689 extern const char** get_global_errmsgs(int nr);
690 extern void wait_for_free_space(const char *filename, int errors);
691 extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
692 extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
693 extern FILE *my_freopen(const char *path, const char *mode, FILE *stream);
694 extern int my_fclose(FILE *fd,myf MyFlags);
695 extern int my_vfprintf(FILE *stream, const char* format, va_list args);
696 extern const char* my_strerror(char *buf, size_t len, int nr);
697 extern int my_fprintf(FILE *stream, const char* format, ...);
698 extern File my_fileno(FILE *fd);
699 extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
700 extern int my_chmod(const char *name, mode_t mode, myf my_flags);
701 extern const char *my_basename(const char *filename);
702 extern void thr_set_sync_wait_callback(void (*before_sync)(void),
703                                        void (*after_sync)(void));
704 extern int my_sync(File fd, myf my_flags);
705 extern int my_sync_dir(const char *dir_name, myf my_flags);
706 extern int my_sync_dir_by_file(const char *file_name, myf my_flags);
707 extern const char *my_get_err_msg(uint nr);
708 extern int my_error_register(const char** (*get_errmsgs) (int nr),
709                              uint first, uint last);
710 extern my_bool my_error_unregister(uint first, uint last);
711 extern void my_message(uint my_err, const char *str,myf MyFlags);
712 extern void my_message_stderr(uint my_err, const char *str, myf MyFlags);
713 extern my_bool my_init(void);
714 extern void my_end(int infoflag);
715 extern int my_redel(const char *from, const char *to, time_t backup_time_stamp,
716                     myf MyFlags);
717 void my_create_backup_name(char *to, const char *from,
718                            time_t backup_time_stamp);
719 extern int my_copystat(const char *from, const char *to, int MyFlags);
720 extern char * my_filename(File fd);
721 
722 extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist);
723 extern char *my_tmpdir(MY_TMPDIR *tmpdir);
724 extern void free_tmpdir(MY_TMPDIR *tmpdir);
725 
726 extern void my_remember_signal(int signal_number,sig_handler (*func)(int));
727 extern size_t dirname_part(char * to,const char *name, size_t *to_res_length);
728 extern size_t dirname_length(const char *name);
729 #define base_name(A) (A+dirname_length(A))
730 extern int test_if_hard_path(const char *dir_name);
731 extern my_bool has_path(const char *name);
732 extern char *convert_dirname(char *to, const char *from, const char *from_end);
733 extern void to_unix_path(char * name);
734 extern char * fn_ext(const char *name);
735 extern char * fn_ext2(const char *name);
736 extern char * fn_same(char * toname,const char *name,int flag);
737 extern char * fn_format(char * to,const char *name,const char *dir,
738 			   const char *form, uint flag);
739 extern size_t strlength(const char *str);
740 extern void pack_dirname(char * to,const char *from);
741 extern size_t normalize_dirname(char * to, const char *from);
742 extern size_t unpack_dirname(char * to,const char *from);
743 extern size_t cleanup_dirname(char * to,const char *from);
744 extern size_t system_filename(char * to,const char *from);
745 extern size_t unpack_filename(char * to,const char *from);
746 extern char * intern_filename(char * to,const char *from);
747 extern int pack_filename(char * to, const char *name, size_t max_length);
748 extern char * my_path(char * to,const char *progname,
749 			 const char *own_pathname_part);
750 extern char * my_load_path(char * to, const char *path,
751 			      const char *own_path_prefix);
752 extern int wild_compare(const char *str,const char *wildstr,
753                         pbool str_is_pattern);
754 extern my_bool array_append_string_unique(const char *str,
755                                           const char **array, size_t size);
756 extern void get_date(char * to,int timeflag,time_t use_time);
757 extern void soundex(CHARSET_INFO *, char * out_pntr, char * in_pntr,
758                     pbool remove_garbage);
759 extern int init_record_cache(RECORD_CACHE *info,size_t cachesize,File file,
760 			     size_t reclength,enum cache_type type,
761 			     pbool use_async_io);
762 extern int read_cache_record(RECORD_CACHE *info,uchar *to);
763 extern int end_record_cache(RECORD_CACHE *info);
764 extern int write_cache_record(RECORD_CACHE *info,my_off_t filepos,
765 			      const uchar *record,size_t length);
766 extern int flush_write_cache(RECORD_CACHE *info);
767 extern void handle_recived_signals(void);
768 
769 extern sig_handler my_set_alarm_variable(int signo);
770 extern my_bool radixsort_is_appliccable(uint n_items, size_t size_of_element);
771 extern void my_string_ptr_sort(uchar *base,uint items,size_t size);
772 extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements,
773 				  size_t size_of_element,uchar *buffer[]);
774 extern qsort_t my_qsort(void *base_ptr, size_t total_elems, size_t size,
775                         qsort_cmp cmp);
776 extern qsort_t my_qsort2(void *base_ptr, size_t total_elems, size_t size,
777                          qsort2_cmp cmp, void *cmp_argument);
778 extern qsort2_cmp get_ptr_compare(size_t);
779 void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos);
780 my_off_t my_get_ptr(uchar *ptr, size_t pack_length);
781 extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize,
782 			 enum cache_type type,my_off_t seek_offset,
783 			 my_bool use_async_io, myf cache_myflags);
784 extern int init_io_cache_ext(IO_CACHE *info, File file, size_t cachesize,
785                               enum cache_type type, my_off_t seek_offset,
786                               pbool use_async_io, myf cache_myflags,
787                               PSI_file_key file_key);
788 extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type,
789 			       my_off_t seek_offset, my_bool use_async_io,
790 			       my_bool clear_cache);
791 extern void init_io_cache_share(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare,
792                                 IO_CACHE *write_cache, uint num_threads);
793 
794 extern int init_slave_io_cache(IO_CACHE *master, IO_CACHE *slave);
795 void end_slave_io_cache(IO_CACHE *cache);
796 void seek_io_cache(IO_CACHE *cache, my_off_t needed_offset);
797 
798 extern void remove_io_thread(IO_CACHE *info);
799 extern int my_b_append(IO_CACHE *info,const uchar *Buffer,size_t Count);
800 extern int my_b_safe_write(IO_CACHE *info,const uchar *Buffer,size_t Count);
801 
802 extern int my_block_write(IO_CACHE *info, const uchar *Buffer,
803 			  size_t Count, my_off_t pos);
804 
805 #define flush_io_cache(info) my_b_flush_io_cache((info),1)
806 
807 extern int end_io_cache(IO_CACHE *info);
808 extern void my_b_seek(IO_CACHE *info,my_off_t pos);
809 extern size_t my_b_gets(IO_CACHE *info, char *to, size_t max_length);
810 extern my_off_t my_b_filelength(IO_CACHE *info);
811 extern my_bool my_b_write_backtick_quote(IO_CACHE *info, const char *str,
812                                          size_t len);
813 extern my_bool my_b_printf(IO_CACHE *info, const char* fmt, ...);
814 extern size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap);
815 extern my_bool open_cached_file(IO_CACHE *cache,const char *dir,
816 				 const char *prefix, size_t cache_size,
817 				 myf cache_myflags);
818 extern my_bool real_open_cached_file(IO_CACHE *cache);
819 extern void close_cached_file(IO_CACHE *cache);
820 File create_temp_file(char *to, const char *dir, const char *pfx,
821 		      int mode, myf MyFlags);
822 #define my_init_dynamic_array(A,B,C,D,E,F) init_dynamic_array2(A,B,C,NULL,D,E,F)
823 #define my_init_dynamic_array2(A,B,C,D,E,F,G) init_dynamic_array2(A,B,C,D,E,F,G)
824 extern my_bool init_dynamic_array2(PSI_memory_key psi_key, DYNAMIC_ARRAY *array,
825                                    uint element_size, void *init_buffer,
826                                    uint init_alloc, uint alloc_increment,
827                                    myf my_flags);
828 extern my_bool insert_dynamic(DYNAMIC_ARRAY *array, const void* element);
829 extern void *alloc_dynamic(DYNAMIC_ARRAY *array);
830 extern void *pop_dynamic(DYNAMIC_ARRAY*);
831 extern my_bool set_dynamic(DYNAMIC_ARRAY *array, const void *element,
832                            uint array_index);
833 extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements);
834 extern void get_dynamic(DYNAMIC_ARRAY *array, void *element, uint array_index);
835 extern void delete_dynamic(DYNAMIC_ARRAY *array);
836 extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
837 extern void delete_dynamic_with_callback(DYNAMIC_ARRAY *array, FREE_FUNC f);
838 extern void freeze_size(DYNAMIC_ARRAY *array);
839 extern int  get_index_dynamic(DYNAMIC_ARRAY *array, void *element);
840 #define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element)
841 #define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index))
842 #define push_dynamic(A,B) insert_dynamic((A),(B))
843 #define reset_dynamic(array) ((array)->elements= 0)
844 #define sort_dynamic(A,cmp) my_qsort((A)->buffer, (A)->elements, (A)->size_of_element, (cmp))
845 
846 extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
847 				   size_t init_alloc,size_t alloc_increment);
848 extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append);
849 my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
850 			  size_t length);
851 extern my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append,
852                                        ...);
853 extern my_bool dynstr_append_quoted(DYNAMIC_STRING *str,
854                                     const char *append, size_t len,
855                                     char quote);
856 extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str);
857 extern my_bool dynstr_realloc(DYNAMIC_STRING *str, size_t additional_size);
858 extern my_bool dynstr_trunc(DYNAMIC_STRING *str, size_t n);
859 extern void dynstr_free(DYNAMIC_STRING *str);
860 extern uint32 copy_and_convert_extended(char *to, uint32 to_length,
861                                         CHARSET_INFO *to_cs,
862                                         const char *from, uint32 from_length,
863                                         CHARSET_INFO *from_cs, uint *errors);
864 extern void dynstr_reassociate(DYNAMIC_STRING *str, char **res, size_t *length,
865                                size_t *alloc_length);
866 extern uint32 copy_and_convert_extended(char *to, uint32 to_length,
867                                         CHARSET_INFO *to_cs,
868                                         const char *from, uint32 from_length,
869                                         CHARSET_INFO *from_cs, uint *errors);
870 #ifdef HAVE_MLOCK
871 extern void *my_malloc_lock(size_t length,myf flags);
872 extern void my_free_lock(void *ptr);
873 #else
874 #define my_malloc_lock(A,B) my_malloc(PSI_INSTRUMENT_ME, (A),(B))
875 #define my_free_lock(A) my_free((A))
876 #endif
877 #define alloc_root_inited(A) ((A)->min_malloc != 0)
878 #define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8)
879 #define clear_alloc_root(A) do { (A)->free= (A)->used= (A)->pre_alloc= 0; (A)->min_malloc=0;} while(0)
880 extern void init_alloc_root(PSI_memory_key key, MEM_ROOT *mem_root,
881                             size_t block_size, size_t pre_alloc_size,
882                             myf my_flags);
883 extern void *alloc_root(MEM_ROOT *mem_root, size_t Size);
884 extern void *multi_alloc_root(MEM_ROOT *mem_root, ...);
885 extern void free_root(MEM_ROOT *root, myf MyFLAGS);
886 extern void set_prealloc_root(MEM_ROOT *root, char *ptr);
887 extern void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
888                                 size_t prealloc_size);
889 extern char *strdup_root(MEM_ROOT *root,const char *str);
safe_strdup_root(MEM_ROOT * root,const char * str)890 static inline char *safe_strdup_root(MEM_ROOT *root, const char *str)
891 {
892   return str ? strdup_root(root, str) : 0;
893 }
894 extern char *strmake_root(MEM_ROOT *root,const char *str,size_t len);
895 extern void *memdup_root(MEM_ROOT *root,const void *str, size_t len);
896 extern LEX_CSTRING safe_lexcstrdup_root(MEM_ROOT *root, const LEX_CSTRING str);
897 extern my_bool my_compress(uchar *, size_t *, size_t *);
898 extern my_bool my_uncompress(uchar *, size_t , size_t *);
899 extern uchar *my_compress_alloc(const uchar *packet, size_t *len,
900                                 size_t *complen);
901 extern void *my_az_allocator(void *dummy, unsigned int items, unsigned int size);
902 extern void my_az_free(void *dummy, void *address);
903 extern int my_compress_buffer(uchar *dest, size_t *destLen,
904                               const uchar *source, size_t sourceLen);
905 extern int packfrm(const uchar *, size_t, uchar **, size_t *);
906 extern int unpackfrm(uchar **, size_t *, const uchar *);
907 
908 extern uint32 my_checksum(uint32, const void *, size_t);
909 extern uint32 my_crc32c(uint32, const void *, size_t);
910 
911 extern const char *my_crc32c_implementation();
912 
913 #ifdef DBUG_ASSERT_EXISTS
914 extern void my_debug_put_break_here(void);
915 #else
916 #define my_debug_put_break_here() do {} while(0)
917 #endif
918 
919 extern void my_sleep(ulong m_seconds);
920 extern uint my_set_max_open_files(uint files);
921 void my_free_open_file_info(void);
922 
923 extern my_bool my_gethwaddr(uchar *to);
924 extern int my_getncpus(void);
925 
926 #define HRTIME_RESOLUTION               1000000ULL  /* microseconds */
927 typedef struct {ulonglong val;} my_hrtime_t;
928 void my_time_init(void);
929 extern my_hrtime_t my_hrtime(void);
930 
931 #ifdef _WIN32
932 extern my_hrtime_t my_hrtime_coarse();
933 #else
934 #define my_hrtime_coarse() my_hrtime()
935 #endif
936 
937 extern ulonglong my_interval_timer(void);
938 extern ulonglong my_getcputime(void);
939 
940 #define microsecond_interval_timer()    (my_interval_timer()/1000)
941 #define hrtime_to_time(X)               ((time_t)((X).val/HRTIME_RESOLUTION))
942 #define hrtime_from_time(X)             ((ulonglong)((X)*HRTIME_RESOLUTION))
943 #define hrtime_to_double(X)             ((X).val/(double)HRTIME_RESOLUTION)
944 #define hrtime_sec_part(X)              ((ulong)((X).val % HRTIME_RESOLUTION))
945 #define my_time(X)                      hrtime_to_time(my_hrtime_coarse())
946 
947 #if STACK_DIRECTION < 0
948 #define available_stack_size(CUR,END) (long) ((char*)(CUR) - (char*)(END))
949 #else
950 #define available_stack_size(CUR,END) (long) ((char*)(END) - (char*)(CUR))
951 #endif
952 
953 #ifndef MAP_SYNC
954 #define MAP_SYNC 0x80000
955 #endif
956 #ifndef MAP_SHARED_VALIDATE
957 #define MAP_SHARED_VALIDATE 0x03
958 #endif
959 
960 #ifdef HAVE_SYS_MMAN_H
961 #ifndef MAP_NOSYNC
962 #define MAP_NOSYNC      0
963 #endif
964 #ifndef MAP_NORESERVE
965 #define MAP_NORESERVE 0         /* For irix and AIX */
966 #endif
967 
968 #ifdef HAVE_MMAP64
969 #define my_mmap(a,b,c,d,e,f)    mmap64(a,b,c,d,e,f)
970 #else
971 #define my_mmap(a,b,c,d,e,f)    mmap(a,b,c,d,e,f)
972 #endif
973 #define my_munmap(a,b)          munmap((a),(b))
974 
975 #else
976 /* not a complete set of mmap() flags, but only those that nesessary */
977 #define PROT_READ        1
978 #define PROT_WRITE       2
979 #define MAP_NORESERVE    0
980 #define MAP_SHARED       0x0001
981 #define MAP_PRIVATE      0x0002
982 #define MAP_NOSYNC       0x0800
983 #define MAP_FAILED       ((void *)-1)
984 #define MS_SYNC          0x0000
985 
986 #define HAVE_MMAP
987 void *my_mmap(void *, size_t, int, int, int, my_off_t);
988 int my_munmap(void *, size_t);
989 #endif
990 
991 #ifdef _WIN32
992 extern FILE* my_win_popen(const char*, const char*);
993 extern int my_win_pclose(FILE*);
994 #define my_popen(A,B) my_win_popen(A,B)
995 #define my_pclose(A) my_win_pclose(A)
996 #else
997 #define my_popen(A,B) popen(A,B)
998 #define my_pclose(A) pclose(A)
999 #endif
1000 
1001 /* my_getpagesize */
1002 #ifdef HAVE_GETPAGESIZE
1003 #define my_getpagesize()        getpagesize()
1004 #else
1005 int my_getpagesize(void);
1006 #endif
1007 
1008 int my_msync(int, void *, size_t, int);
1009 
1010 #define MY_UUID_SIZE 16
1011 #define MY_UUID_STRING_LENGTH (8+1+4+1+4+1+4+1+12)
1012 
1013 void my_uuid_init(ulong seed1, ulong seed2);
1014 void my_uuid(uchar *guid);
1015 void my_uuid2str(const uchar *guid, char *s);
1016 void my_uuid_end(void);
1017 
1018 const char *my_dlerror(const char *dlpath);
1019 
1020 /* character sets */
1021 extern void my_charset_loader_init_mysys(MY_CHARSET_LOADER *loader);
1022 extern uint get_charset_number(const char *cs_name, uint cs_flags);
1023 extern uint get_collation_number(const char *name);
1024 extern const char *get_charset_name(uint cs_number);
1025 
1026 extern CHARSET_INFO *get_charset(uint cs_number, myf flags);
1027 extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags);
1028 extern CHARSET_INFO *my_collation_get_by_name(MY_CHARSET_LOADER *loader,
1029                                               const char *name, myf flags);
1030 extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
1031 					   uint cs_flags, myf my_flags);
1032 extern CHARSET_INFO *my_charset_get_by_name(MY_CHARSET_LOADER *loader,
1033                                             const char *name,
1034                                             uint cs_flags, myf my_flags);
1035 extern my_bool resolve_charset(const char *cs_name,
1036                                CHARSET_INFO *default_cs,
1037                                CHARSET_INFO **cs);
1038 extern my_bool resolve_collation(const char *cl_name,
1039                                  CHARSET_INFO *default_cl,
1040                                  CHARSET_INFO **cl);
1041 extern void free_charsets(void);
1042 extern char *get_charsets_dir(char *buf);
my_charset_same(CHARSET_INFO * cs1,CHARSET_INFO * cs2)1043 static inline my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2)
1044 {
1045   return (cs1->csname == cs2->csname);
1046 }
1047 extern my_bool init_compiled_charsets(myf flags);
1048 extern void add_compiled_collation(struct charset_info_st *cs);
1049 extern void add_compiled_extra_collation(struct charset_info_st *cs);
1050 extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info,
1051                                       char *to, size_t to_length,
1052                                       const char *from, size_t length);
1053 extern char *get_tty_password(const char *opt_message);
1054 #ifdef _WIN32
1055 #define BACKSLASH_MBTAIL
1056 /* File system character set */
1057 extern CHARSET_INFO *fs_character_set(void);
1058 #endif
1059 extern const char *my_default_csname(void);
1060 extern size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
1061                                       char *to, size_t to_length,
1062                                       const char *from, size_t length);
1063 
1064 extern void thd_increment_bytes_sent(void *thd, size_t length);
1065 extern void thd_increment_bytes_received(void *thd, size_t length);
1066 extern void thd_increment_net_big_packet_count(void *thd, size_t length);
1067 
1068 #ifdef _WIN32
1069 
1070 /* implemented in my_conio.c */
1071 char* my_cgets(char *string, size_t clen, size_t* plen);
1072 
1073 #endif
1074 
1075 #include <mysql/psi/psi.h>
1076 
1077 #ifdef HAVE_PSI_INTERFACE
1078 extern MYSQL_PLUGIN_IMPORT struct PSI_bootstrap *PSI_hook;
1079 extern void set_psi_server(PSI *psi);
1080 void my_init_mysys_psi_keys(void);
1081 #endif
1082 
1083 struct st_mysql_file;
1084 extern struct st_mysql_file *mysql_stdin;
1085 C_MODE_END
1086 #endif /* _my_sys_h */
1087