1/************************************************************************************
2 Copyright (C) 2000, 2012 MySQL AB & MySQL Finland AB & TCX DataKonsult AB,
3 Monty Program AB
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not see <http://www.gnu.org/licenses>
17 or write to the Free Software Foundation, Inc.,
18 51 Franklin St., Fifth Floor, Boston, MA 02110, USA
19
20 Part of this code includes code from the PHP project which
21 is freely available from http://www.php.net
22*************************************************************************************/
23
24/*
25** Common definition between mysql server & client
26*/
27
28#ifndef _mysql_com_h
29#define _mysql_com_h
30
31
32#define NAME_CHAR_LEN 64
33#define NAME_LEN 256 /* Field/table name length */
34#define HOSTNAME_LENGTH 255
35#define SYSTEM_MB_MAX_CHAR_LENGTH 4
36#define USERNAME_CHAR_LENGTH 128
37#define USERNAME_LENGTH (USERNAME_CHAR_LENGTH * SYSTEM_MB_MAX_CHAR_LENGTH)
38#define SERVER_VERSION_LENGTH 60
39#define SQLSTATE_LENGTH 5
40#define SCRAMBLE_LENGTH 20
41#define SCRAMBLE_LENGTH_323 8
42
43#define LOCAL_HOST "localhost"
44#define LOCAL_HOST_NAMEDPIPE "."
45
46#if defined(_WIN32) && !defined( _CUSTOMCONFIG_)
47#define MARIADB_NAMEDPIPE "MySQL"
48#define MYSQL_SERVICENAME "MySql"
49#endif /* _WIN32 */
50
51/* for use in mysql client tools only */
52#define MYSQL_AUTODETECT_CHARSET_NAME "auto"
53#define BINCMP_FLAG 131072
54
55enum Item_result {STRING_RESULT,REAL_RESULT,INT_RESULT,ROW_RESULT,DECIMAL_RESULT};
56
57enum mysql_enum_shutdown_level
58{
59 SHUTDOWN_DEFAULT = 0,
60 KILL_QUERY= 254,
61 KILL_CONNECTION= 255
62};
63
64enum enum_server_command
65{
66 COM_SLEEP = 0,
67 COM_QUIT,
68 COM_INIT_DB,
69 COM_QUERY,
70 COM_FIELD_LIST,
71 COM_CREATE_DB,
72 COM_DROP_DB,
73 COM_REFRESH,
74 COM_SHUTDOWN,
75 COM_STATISTICS,
76 COM_PROCESS_INFO,
77 COM_CONNECT,
78 COM_PROCESS_KILL,
79 COM_DEBUG,
80 COM_PING,
81 COM_TIME = 15,
82 COM_DELAYED_INSERT,
83 COM_CHANGE_USER,
84 COM_BINLOG_DUMP,
85 COM_TABLE_DUMP,
86 COM_CONNECT_OUT = 20,
87 COM_REGISTER_SLAVE,
88 COM_STMT_PREPARE = 22,
89 COM_STMT_EXECUTE = 23,
90 COM_STMT_SEND_LONG_DATA = 24,
91 COM_STMT_CLOSE = 25,
92 COM_STMT_RESET = 26,
93 COM_SET_OPTION = 27,
94 COM_STMT_FETCH = 28,
95 COM_DAEMON= 29,
96 COM_UNSUPPORTED= 30,
97 COM_RESET_CONNECTION = 31,
98 COM_STMT_BULK_EXECUTE = 250,
99 COM_RESERVED_1 = 254, /* former COM_MULTI, now removed */
100 COM_END
101};
102
103
104#define NOT_NULL_FLAG 1 /* Field can't be NULL */
105#define PRI_KEY_FLAG 2 /* Field is part of a primary key */
106#define UNIQUE_KEY_FLAG 4 /* Field is part of a unique key */
107#define MULTIPLE_KEY_FLAG 8 /* Field is part of a key */
108#define BLOB_FLAG 16 /* Field is a blob */
109#define UNSIGNED_FLAG 32 /* Field is unsigned */
110#define ZEROFILL_FLAG 64 /* Field is zerofill */
111#define BINARY_FLAG 128
112/* The following are only sent to new clients */
113#define ENUM_FLAG 256 /* field is an enum */
114#define AUTO_INCREMENT_FLAG 512 /* field is a autoincrement field */
115#define TIMESTAMP_FLAG 1024 /* Field is a timestamp */
116#define SET_FLAG 2048 /* field is a set */
117/* new since 3.23.58 */
118#define NO_DEFAULT_VALUE_FLAG 4096 /* Field doesn't have default value */
119#define ON_UPDATE_NOW_FLAG 8192 /* Field is set to NOW on UPDATE */
120/* end new */
121#define NUM_FLAG 32768 /* Field is num (for clients) */
122#define PART_KEY_FLAG 16384 /* Intern; Part of some key */
123#define GROUP_FLAG 32768 /* Intern: Group field */
124#define UNIQUE_FLAG 65536 /* Intern: Used by sql_yacc */
125
126#define REFRESH_GRANT 1 /* Refresh grant tables */
127#define REFRESH_LOG 2 /* Start on new log file */
128#define REFRESH_TABLES 4 /* close all tables */
129#define REFRESH_HOSTS 8 /* Flush host cache */
130#define REFRESH_STATUS 16 /* Flush status variables */
131#define REFRESH_THREADS 32 /* Flush thread cache */
132#define REFRESH_SLAVE 64 /* Reset master info and restart slave
133 thread */
134#define REFRESH_MASTER 128 /* Remove all bin logs in the index
135 and truncate the index */
136
137/* The following can't be set with mysql_refresh() */
138#define REFRESH_READ_LOCK 16384 /* Lock tables for read */
139#define REFRESH_FAST 32768 /* Intern flag */
140
141#define CLIENT_MYSQL 1
142#define CLIENT_FOUND_ROWS 2 /* Found instead of affected rows */
143#define CLIENT_LONG_FLAG 4 /* Get all column flags */
144#define CLIENT_CONNECT_WITH_DB 8 /* One can specify db on connect */
145#define CLIENT_NO_SCHEMA 16 /* Don't allow database.table.column */
146#define CLIENT_COMPRESS 32 /* Can use compression protocol */
147#define CLIENT_ODBC 64 /* Odbc client */
148#define CLIENT_LOCAL_FILES 128 /* Can use LOAD DATA LOCAL */
149#define CLIENT_IGNORE_SPACE 256 /* Ignore spaces before '(' */
150#define CLIENT_INTERACTIVE 1024 /* This is an interactive client */
151#define CLIENT_SSL 2048 /* Switch to SSL after handshake */
152#define CLIENT_IGNORE_SIGPIPE 4096 /* IGNORE sigpipes */
153#define CLIENT_TRANSACTIONS 8192 /* Client knows about transactions */
154/* added in 4.x */
155#define CLIENT_PROTOCOL_41 512
156#define CLIENT_RESERVED 16384
157#define CLIENT_SECURE_CONNECTION 32768
158#define CLIENT_MULTI_STATEMENTS (1UL << 16)
159#define CLIENT_MULTI_RESULTS (1UL << 17)
160#define CLIENT_PS_MULTI_RESULTS (1UL << 18)
161#define CLIENT_PLUGIN_AUTH (1UL << 19)
162#define CLIENT_CONNECT_ATTRS (1UL << 20)
163#define CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA (1UL << 21)
164#define CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS (1UL << 22)
165#define CLIENT_SESSION_TRACKING (1UL << 23)
166#define CLIENT_ZSTD_COMPRESSION (1UL << 26)
167#define CLIENT_PROGRESS (1UL << 29) /* client supports progress indicator */
168#define CLIENT_PROGRESS_OBSOLETE CLIENT_PROGRESS
169#define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30)
170#define CLIENT_SSL_VERIFY_SERVER_CERT_OBSOLETE CLIENT_SSL_VERIFY_SERVER_CERT
171#define CLIENT_REMEMBER_OPTIONS (1UL << 31)
172
173/* MariaDB-specific capabilities */
174#define MARIADB_CLIENT_FLAGS 0xFFFFFFFF00000000ULL
175#define MARIADB_CLIENT_PROGRESS (1ULL << 32)
176#define MARIADB_CLIENT_RESERVED_1 (1ULL << 33) /* Former COM_MULTI, don't use */
177#define MARIADB_CLIENT_STMT_BULK_OPERATIONS (1ULL << 34)
178/* support of extended data type/format information, since 10.5.0 */
179#define MARIADB_CLIENT_EXTENDED_METADATA (1ULL << 35)
180/* Do not resend metadata for prepared statements, since 10.6*/
181#define MARIADB_CLIENT_CACHE_METADATA (1ULL << 36)
182/* permit sending unit result-set for BULK commands */
183#define MARIADB_CLIENT_BULK_UNIT_RESULTS (1ULL << 37)
184
185#define IS_MARIADB_EXTENDED_SERVER(mysql)\
186 (!(mysql->server_capabilities & CLIENT_MYSQL))
187
188#define MARIADB_CLIENT_SUPPORTED_FLAGS (MARIADB_CLIENT_PROGRESS |\
189 MARIADB_CLIENT_STMT_BULK_OPERATIONS|\
190 MARIADB_CLIENT_EXTENDED_METADATA|\
191 MARIADB_CLIENT_CACHE_METADATA|\
192 MARIADB_CLIENT_BULK_UNIT_RESULTS)
193
194#define CLIENT_SUPPORTED_FLAGS (CLIENT_MYSQL |\
195 CLIENT_FOUND_ROWS |\
196 CLIENT_LONG_FLAG |\
197 CLIENT_CONNECT_WITH_DB |\
198 CLIENT_NO_SCHEMA |\
199 CLIENT_COMPRESS |\
200 CLIENT_ODBC |\
201 CLIENT_LOCAL_FILES |\
202 CLIENT_IGNORE_SPACE |\
203 CLIENT_INTERACTIVE |\
204 CLIENT_SSL |\
205 CLIENT_IGNORE_SIGPIPE |\
206 CLIENT_TRANSACTIONS |\
207 CLIENT_PROTOCOL_41 |\
208 CLIENT_RESERVED |\
209 CLIENT_SECURE_CONNECTION |\
210 CLIENT_MULTI_STATEMENTS |\
211 CLIENT_MULTI_RESULTS |\
212 CLIENT_PROGRESS |\
213 CLIENT_SSL_VERIFY_SERVER_CERT |\
214 CLIENT_REMEMBER_OPTIONS |\
215 CLIENT_PLUGIN_AUTH |\
216 CLIENT_SESSION_TRACKING |\
217 CLIENT_CONNECT_ATTRS)
218#define CLIENT_ALLOWED_FLAGS (CLIENT_SUPPORTED_FLAGS |\
219 CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA |\
220 CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS |\
221 CLIENT_ZSTD_COMPRESSION |\
222 CLIENT_PS_MULTI_RESULTS |\
223 CLIENT_REMEMBER_OPTIONS)
224#define CLIENT_CAPABILITIES (CLIENT_MYSQL | \
225 CLIENT_LONG_FLAG |\
226 CLIENT_TRANSACTIONS |\
227 CLIENT_SECURE_CONNECTION |\
228 CLIENT_MULTI_RESULTS | \
229 CLIENT_PS_MULTI_RESULTS |\
230 CLIENT_PROTOCOL_41 |\
231 CLIENT_PLUGIN_AUTH |\
232 CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA | \
233 CLIENT_SESSION_TRACKING |\
234 CLIENT_CONNECT_ATTRS)
235
236#define CLIENT_DEFAULT_FLAGS ((CLIENT_SUPPORTED_FLAGS & ~CLIENT_COMPRESS)\
237 & ~CLIENT_SSL)
238
239#define CLIENT_DEFAULT_EXTENDED_FLAGS (MARIADB_CLIENT_SUPPORTED_FLAGS &\
240 ~MARIADB_CLIENT_BULK_UNIT_RESULTS)
241
242#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */
243#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */
244#define SERVER_MORE_RESULTS_EXIST 8
245#define SERVER_QUERY_NO_GOOD_INDEX_USED 16
246#define SERVER_QUERY_NO_INDEX_USED 32
247#define SERVER_STATUS_CURSOR_EXISTS 64
248#define SERVER_STATUS_LAST_ROW_SENT 128
249#define SERVER_STATUS_DB_DROPPED 256
250#define SERVER_STATUS_NO_BACKSLASH_ESCAPES 512
251#define SERVER_STATUS_METADATA_CHANGED 1024
252#define SERVER_QUERY_WAS_SLOW 2048
253#define SERVER_PS_OUT_PARAMS 4096
254#define SERVER_STATUS_IN_TRANS_READONLY 8192
255#define SERVER_SESSION_STATE_CHANGED 16384
256#define SERVER_STATUS_ANSI_QUOTES 32768
257
258#define MYSQL_ERRMSG_SIZE 512
259#define NET_READ_TIMEOUT 30 /* Timeout on read */
260#define NET_WRITE_TIMEOUT 60 /* Timeout on write */
261#define NET_WAIT_TIMEOUT (8*60*60) /* Wait for new query */
262
263/* for server integration (mysqlbinlog) */
264#define LIST_PROCESS_HOST_LEN 64
265#define MYSQL50_TABLE_NAME_PREFIX "#mysql50#"
266#define MYSQL50_TABLE_NAME_PREFIX_LENGTH (sizeof(MYSQL50_TABLE_NAME_PREFIX)-1)
267#define SAFE_NAME_LEN (NAME_LEN + MYSQL50_TABLE_NAME_PREFIX_LENGTH)
268
269struct st_ma_pvio;
270typedef struct st_ma_pvio MARIADB_PVIO;
271
272#define MAX_CHAR_WIDTH 255 /* Max length for a CHAR column */
273#define MAX_BLOB_WIDTH 8192 /* Default width for blob */
274
275/* the following defines were added for PHP's mysqli and pdo extensions:
276 see: CONC-56
277*/
278#define MAX_TINYINT_WIDTH 3
279#define MAX_SMALLINT_WIDTH 5
280#define MAX_MEDIUMINT_WIDTH 8
281#define MAX_INT_WIDTH 10
282#define MAX_BIGINT_WIDTH 20
283
284struct st_ma_connection_plugin;
285
286
287typedef struct st_net {
288 MARIADB_PVIO *pvio;
289 unsigned char *buff;
290 unsigned char *buff_end,*write_pos,*read_pos;
291 my_socket fd; /* For Perl DBI/dbd */
292 unsigned long remain_in_buf,length;
293 unsigned long buf_length, where_b;
294 unsigned long max_packet, max_packet_size;
295 unsigned int pkt_nr, compress_pkt_nr;
296 unsigned int write_timeout, read_timeout, retry_count;
297 int fcntl;
298 unsigned int *return_status;
299 unsigned char reading_or_writing;
300 char save_char;
301 char unused_1;
302 unsigned char tls_verify_status;
303 my_bool compress;
304 my_bool unused_2;
305 char *unused_3;
306 unsigned int last_errno;
307 unsigned char error;
308 my_bool unused_5;
309 my_bool unused_6;
310 char last_error[MYSQL_ERRMSG_SIZE];
311 char sqlstate[SQLSTATE_LENGTH+1];
312 struct st_mariadb_net_extension *extension;
313} NET;
314
315#define packet_error ((unsigned int) -1)
316
317/* used by mysql_set_server_option */
318enum enum_mysql_set_option
319{
320 MYSQL_OPTION_MULTI_STATEMENTS_ON,
321 MYSQL_OPTION_MULTI_STATEMENTS_OFF
322};
323
324/* for status callback function */
325enum enum_mariadb_status_info
326{
327 STATUS_TYPE= 0,
328 SESSION_TRACK_TYPE
329};
330
331enum enum_session_state_type
332{
333 SESSION_TRACK_SYSTEM_VARIABLES= 0,
334 SESSION_TRACK_SCHEMA,
335 SESSION_TRACK_STATE_CHANGE,
336 /* currently not supported by MariaDB Server */
337 SESSION_TRACK_GTIDS,
338 SESSION_TRACK_TRANSACTION_CHARACTERISTICS,
339 SESSION_TRACK_TRANSACTION_STATE /* make sure that SESSION_TRACK_END always points
340 to last element of enum !! */
341};
342
343#define SESSION_TRACK_BEGIN 0
344#define SESSION_TRACK_END SESSION_TRACK_TRANSACTION_STATE
345#define SESSION_TRACK_TYPES (SESSION_TRACK_END + 1)
346
347/* SESSION_TRACK_TRANSACTION_TYPE was renamed to SESSION_TRACK_TRANSACTION_STATE
348 in 3e699a1738cdfb0a2c5b8eabfa8301b8d11cf711.
349 This is a workaround to prevent breaking of travis and buildbot tests.
350 TODO: Remove this after server fixes */
351#define SESSION_TRACK_TRANSACTION_TYPE SESSION_TRACK_TRANSACTION_STATE
352
353enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
354 MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
355 MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
356 MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,
357 MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
358 MYSQL_TYPE_DATE, MYSQL_TYPE_TIME,
359 MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
360 MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
361 MYSQL_TYPE_BIT,
362 /*
363 the following types are not used by client,
364 only for mysqlbinlog!!
365 */
366 MYSQL_TYPE_TIMESTAMP2,
367 MYSQL_TYPE_DATETIME2,
368 MYSQL_TYPE_TIME2,
369 /* --------------------------------------------- */
370 MYSQL_TYPE_JSON=245,
371 MYSQL_TYPE_NEWDECIMAL=246,
372 MYSQL_TYPE_ENUM=247,
373 MYSQL_TYPE_SET=248,
374 MYSQL_TYPE_TINY_BLOB=249,
375 MYSQL_TYPE_MEDIUM_BLOB=250,
376 MYSQL_TYPE_LONG_BLOB=251,
377 MYSQL_TYPE_BLOB=252,
378 MYSQL_TYPE_VAR_STRING=253,
379 MYSQL_TYPE_STRING=254,
380 MYSQL_TYPE_GEOMETRY=255,
381 MAX_NO_FIELD_TYPES };
382
383#define FIELD_TYPE_CHAR FIELD_TYPE_TINY /* For compatibility */
384#define FIELD_TYPE_INTERVAL FIELD_TYPE_ENUM /* For compatibility */
385#define FIELD_TYPE_DECIMAL MYSQL_TYPE_DECIMAL
386#define FIELD_TYPE_NEWDECIMAL MYSQL_TYPE_NEWDECIMAL
387#define FIELD_TYPE_TINY MYSQL_TYPE_TINY
388#define FIELD_TYPE_SHORT MYSQL_TYPE_SHORT
389#define FIELD_TYPE_LONG MYSQL_TYPE_LONG
390#define FIELD_TYPE_FLOAT MYSQL_TYPE_FLOAT
391#define FIELD_TYPE_DOUBLE MYSQL_TYPE_DOUBLE
392#define FIELD_TYPE_NULL MYSQL_TYPE_NULL
393#define FIELD_TYPE_TIMESTAMP MYSQL_TYPE_TIMESTAMP
394#define FIELD_TYPE_LONGLONG MYSQL_TYPE_LONGLONG
395#define FIELD_TYPE_INT24 MYSQL_TYPE_INT24
396#define FIELD_TYPE_DATE MYSQL_TYPE_DATE
397#define FIELD_TYPE_TIME MYSQL_TYPE_TIME
398#define FIELD_TYPE_DATETIME MYSQL_TYPE_DATETIME
399#define FIELD_TYPE_YEAR MYSQL_TYPE_YEAR
400#define FIELD_TYPE_NEWDATE MYSQL_TYPE_NEWDATE
401#define FIELD_TYPE_ENUM MYSQL_TYPE_ENUM
402#define FIELD_TYPE_SET MYSQL_TYPE_SET
403#define FIELD_TYPE_TINY_BLOB MYSQL_TYPE_TINY_BLOB
404#define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB
405#define FIELD_TYPE_LONG_BLOB MYSQL_TYPE_LONG_BLOB
406#define FIELD_TYPE_BLOB MYSQL_TYPE_BLOB
407#define FIELD_TYPE_VAR_STRING MYSQL_TYPE_VAR_STRING
408#define FIELD_TYPE_STRING MYSQL_TYPE_STRING
409#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY
410#define FIELD_TYPE_BIT MYSQL_TYPE_BIT
411
412extern unsigned long max_allowed_packet;
413extern unsigned long net_buffer_length;
414
415#define net_new_transaction(net) ((net)->pkt_nr=0)
416
417int ma_net_init(NET *net, MARIADB_PVIO *pvio);
418void ma_net_end(NET *net);
419void ma_net_clear(NET *net);
420int ma_net_flush(NET *net);
421int ma_net_write(NET *net,const unsigned char *packet, size_t len);
422int ma_net_write_buff(NET *net, const char *packet, size_t len);
423int ma_net_write_command(NET *net,unsigned char command,const char *packet,
424 size_t len, my_bool disable_flush);
425int ma_net_real_write(NET *net,const char *packet, size_t len);
426extern unsigned long ma_net_read(NET *net);
427
428struct rand_struct {
429 unsigned long seed1,seed2,max_value;
430 double max_value_dbl;
431};
432
433 /* The following is for user defined functions */
434
435typedef struct st_udf_args
436{
437 unsigned int arg_count; /* Number of arguments */
438 enum Item_result *arg_type; /* Pointer to item_results */
439 char **args; /* Pointer to argument */
440 unsigned long *lengths; /* Length of string arguments */
441 char *maybe_null; /* Set to 1 for all maybe_null args */
442} UDF_ARGS;
443
444 /* This holds information about the result */
445
446typedef struct st_udf_init
447{
448 my_bool maybe_null; /* 1 if function can return NULL */
449 unsigned int decimals; /* for real functions */
450 unsigned int max_length; /* For string functions */
451 char *ptr; /* free pointer for function data */
452 my_bool const_item; /* 0 if result is independent of arguments */
453} UDF_INIT;
454
455/* Connection types */
456#define MARIADB_CONNECTION_UNIXSOCKET 0
457#define MARIADB_CONNECTION_TCP 1
458#define MARIADB_CONNECTION_NAMEDPIPE 2
459#define MARIADB_CONNECTION_SHAREDMEM 3
460
461 /* Constants when using compression */
462#define NET_HEADER_SIZE 4 /* standard header size */
463#define COMP_HEADER_SIZE 3 /* compression header extra size */
464
465 /* Prototypes to password functions */
466#define native_password_plugin_name "mysql_native_password"
467#define old_password_plugin_name "mysql_old_password"
468
469#ifdef __cplusplus
470extern "C" {
471#endif
472
473char *ma_scramble_323(char *to,const char *message,const char *password);
474void ma_scramble_41(const unsigned char *buffer, const char *scramble, const char *password);
475void ma_hash_password(unsigned long *result, const char *password, size_t len);
476void ma_make_scrambled_password(char *to,const char *password);
477
478/* Some other useful functions */
479
480void mariadb_load_defaults(const char *conf_file, const char **groups,
481 int *argc, char ***argv);
482my_bool ma_thread_init(void);
483void ma_thread_end(void);
484
485#ifdef __cplusplus
486}
487#endif
488
489#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */
490
491#endif
492