3
#include "mysql_version.h"
5
enum enum_server_command
7
COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,
8
COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,
9
COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,
10
COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
11
COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
12
COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE,
13
COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON,
18
typedef struct st_vio Vio;
19
typedef struct st_net {
21
unsigned char *buff,*buff_end,*write_pos,*read_pos;
23
unsigned long remain_in_buf,length, buf_length, where_b;
24
unsigned long max_packet,max_packet_size;
25
unsigned int pkt_nr,compress_pkt_nr;
26
unsigned int write_timeout, read_timeout, retry_count;
28
unsigned int *return_status;
29
unsigned char reading_or_writing;
35
unsigned char *unused;
36
unsigned int last_errno;
44
enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
45
MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
46
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
47
MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,
48
MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
49
MYSQL_TYPE_DATE, MYSQL_TYPE_TIME,
50
MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
51
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
53
MYSQL_TYPE_TIMESTAMP2,
56
MYSQL_TYPE_NEWDECIMAL=246,
59
MYSQL_TYPE_TINY_BLOB=249,
60
MYSQL_TYPE_MEDIUM_BLOB=250,
61
MYSQL_TYPE_LONG_BLOB=251,
63
MYSQL_TYPE_VAR_STRING=253,
64
MYSQL_TYPE_STRING=254,
65
MYSQL_TYPE_GEOMETRY=255
67
enum mysql_enum_shutdown_level {
69
SHUTDOWN_WAIT_CONNECTIONS= (unsigned char)(1 << 0),
70
SHUTDOWN_WAIT_TRANSACTIONS= (unsigned char)(1 << 1),
71
SHUTDOWN_WAIT_UPDATES= (unsigned char)(1 << 3),
72
SHUTDOWN_WAIT_ALL_BUFFERS= ((unsigned char)(1 << 3) << 1),
73
SHUTDOWN_WAIT_CRITICAL_BUFFERS= ((unsigned char)(1 << 3) << 1) + 1,
79
CURSOR_TYPE_NO_CURSOR= 0,
80
CURSOR_TYPE_READ_ONLY= 1,
81
CURSOR_TYPE_FOR_UPDATE= 2,
82
CURSOR_TYPE_SCROLLABLE= 4
84
enum enum_mysql_set_option
86
MYSQL_OPTION_MULTI_STATEMENTS_ON,
87
MYSQL_OPTION_MULTI_STATEMENTS_OFF
89
my_bool my_net_init(NET *net, Vio* vio);
90
void my_net_local_init(NET *net);
91
void net_end(NET *net);
92
void net_clear(NET *net, my_bool check_buffer);
93
my_bool net_realloc(NET *net, size_t length);
94
my_bool net_flush(NET *net);
95
my_bool my_net_write(NET *net,const unsigned char *packet, size_t len);
96
my_bool net_write_command(NET *net,unsigned char command,
97
const unsigned char *header, size_t head_len,
98
const unsigned char *packet, size_t len);
99
my_bool net_write_packet(NET *net, const unsigned char *packet, size_t length);
100
unsigned long my_net_read(NET *net);
102
unsigned long seed1,seed2,max_value;
103
double max_value_dbl;
105
enum Item_result {STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT,
107
typedef struct st_udf_args
109
unsigned int arg_count;
110
enum Item_result *arg_type;
112
unsigned long *lengths;
115
unsigned long *attribute_lengths;
118
typedef struct st_udf_init
121
unsigned int decimals;
122
unsigned long max_length;
127
void randominit(struct rand_struct *, unsigned long seed1,
128
unsigned long seed2);
129
double my_rnd(struct rand_struct *);
130
void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st);
131
void hash_password(unsigned long *to, const char *password, unsigned int password_len);
132
void make_scrambled_password_323(char *to, const char *password);
133
void scramble_323(char *to, const char *message, const char *password);
134
my_bool check_scramble_323(const unsigned char *reply, const char *message,
135
unsigned long *salt);
136
void get_salt_from_password_323(unsigned long *res, const char *password);
137
void make_password_from_salt_323(char *to, const unsigned long *salt);
138
void make_scrambled_password(char *to, const char *password);
139
void scramble(char *to, const char *message, const char *password);
140
my_bool check_scramble(const unsigned char *reply, const char *message,
141
const unsigned char *hash_stage2);
142
void get_salt_from_password(unsigned char *res, const char *password);
143
void make_password_from_salt(char *to, const unsigned char *hash_stage2);
144
char *octet2hex(char *to, const char *str, unsigned int len);
145
char *get_tty_password(const char *opt_message);
146
const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
147
my_bool my_thread_init(void);
148
void my_thread_end(void);
149
#include "mysql_time.h"
150
enum enum_mysql_timestamp_type
152
MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1,
153
MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2
155
typedef struct st_mysql_time
157
unsigned int year, month, day, hour, minute, second;
158
unsigned long second_part;
160
enum enum_mysql_timestamp_type time_type;
163
typedef struct st_list {
164
struct st_list *prev,*next;
167
typedef int (*list_walk_action)(void *,void *);
168
extern LIST *list_add(LIST *root,LIST *element);
169
extern LIST *list_delete(LIST *root,LIST *element);
170
extern LIST *list_cons(void *data,LIST *root);
171
extern LIST *list_reverse(LIST *root);
172
extern void list_free(LIST *root,unsigned int free_data);
173
extern unsigned int list_length(LIST *);
174
extern int list_walk(LIST *,list_walk_action action,unsigned char * argument);
175
extern unsigned int mysql_port;
176
extern char *mysql_unix_port;
177
typedef struct st_mysql_field {
185
unsigned long length;
186
unsigned long max_length;
187
unsigned int name_length;
188
unsigned int org_name_length;
189
unsigned int table_length;
190
unsigned int org_table_length;
191
unsigned int db_length;
192
unsigned int catalog_length;
193
unsigned int def_length;
195
unsigned int decimals;
196
unsigned int charsetnr;
197
enum enum_field_types type;
200
typedef char **MYSQL_ROW;
201
typedef unsigned int MYSQL_FIELD_OFFSET;
202
typedef unsigned long long my_ulonglong;
204
#include "my_alloc.h"
205
typedef struct st_used_mem
207
struct st_used_mem *next;
211
typedef struct st_mem_root
218
unsigned int block_num;
219
unsigned int first_block_usage;
220
void (*error_handler)(void);
222
typedef struct st_typelib {
225
const char **type_names;
226
unsigned int *type_lengths;
228
extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position);
229
extern int find_type_or_exit(const char *x, TYPELIB *typelib,
231
extern int find_type(const char *x, const TYPELIB *typelib, unsigned int flags);
232
extern void make_type(char *to,unsigned int nr,TYPELIB *typelib);
233
extern const char *get_type(TYPELIB *typelib,unsigned int nr);
234
extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from);
235
extern TYPELIB sql_protocol_typelib;
236
my_ulonglong find_set_from_flags(const TYPELIB *lib, unsigned int default_name,
237
my_ulonglong cur_set, my_ulonglong default_set,
238
const char *str, unsigned int length,
239
char **err_pos, unsigned int *err_len);
240
typedef struct st_mysql_rows {
241
struct st_mysql_rows *next;
243
unsigned long length;
245
typedef MYSQL_ROWS *MYSQL_ROW_OFFSET;
246
#include "my_alloc.h"
247
typedef struct embedded_query_result EMBEDDED_QUERY_RESULT;
248
typedef struct st_mysql_data {
250
struct embedded_query_result *embedded_info;
258
MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE,
259
MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
260
MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
261
MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
262
MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
263
MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
264
MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
265
MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
266
MYSQL_OPT_SSL_VERIFY_SERVER_CERT, MYSQL_PLUGIN_DIR, MYSQL_DEFAULT_AUTH,
268
MYSQL_OPT_SSL_KEY, MYSQL_OPT_SSL_CERT,
269
MYSQL_OPT_SSL_CA, MYSQL_OPT_SSL_CAPATH, MYSQL_OPT_SSL_CIPHER,
270
MYSQL_OPT_SSL_CRL, MYSQL_OPT_SSL_CRLPATH,
271
MYSQL_OPT_CONNECT_ATTR_RESET, MYSQL_OPT_CONNECT_ATTR_ADD,
272
MYSQL_OPT_CONNECT_ATTR_DELETE,
273
MYSQL_SERVER_PUBLIC_KEY,
274
MYSQL_ENABLE_CLEARTEXT_PLUGIN,
275
MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS
277
struct st_mysql_options_extention;
278
struct st_mysql_options {
279
unsigned int connect_timeout, read_timeout, write_timeout;
280
unsigned int port, protocol;
281
unsigned long client_flag;
282
char *host,*user,*password,*unix_socket,*db;
283
struct st_dynamic_array *init_commands;
284
char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
290
char *shared_memory_base_name;
291
unsigned long max_allowed_packet;
293
my_bool compress,named_pipe;
298
enum mysql_option methods_to_use;
304
my_bool report_data_truncation;
305
int (*local_infile_init)(void **, const char *, void *);
306
int (*local_infile_read)(void *, char *, unsigned int);
307
void (*local_infile_end)(void *);
308
int (*local_infile_error)(void *, char *, unsigned int);
309
void *local_infile_userdata;
310
struct st_mysql_options_extention *extension;
314
MYSQL_STATUS_READY, MYSQL_STATUS_GET_RESULT, MYSQL_STATUS_USE_RESULT,
315
MYSQL_STATUS_STATEMENT_GET_RESULT
317
enum mysql_protocol_type
319
MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
320
MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
322
typedef struct character_set
330
unsigned int mbminlen;
331
unsigned int mbmaxlen;
333
struct st_mysql_methods;
334
struct st_mysql_stmt;
335
typedef struct st_mysql
338
unsigned char *connector_fd;
339
char *host,*user,*passwd,*unix_socket,*server_version,*host_info;
341
struct charset_info_st *charset;
343
MEM_ROOT field_alloc;
344
my_ulonglong affected_rows;
345
my_ulonglong insert_id;
346
my_ulonglong extra_info;
347
unsigned long thread_id;
348
unsigned long packet_length;
350
unsigned long client_flag,server_capabilities;
351
unsigned int protocol_version;
352
unsigned int field_count;
353
unsigned int server_status;
354
unsigned int server_language;
355
unsigned int warning_count;
356
struct st_mysql_options options;
357
enum mysql_status status;
360
char scramble[20 +1];
362
void *unused2, *unused3, *unused4, *unused5;
364
const struct st_mysql_methods *methods;
366
my_bool *unbuffered_fetch_owner;
370
typedef struct st_mysql_res {
371
my_ulonglong row_count;
374
MYSQL_ROWS *data_cursor;
375
unsigned long *lengths;
377
const struct st_mysql_methods *methods;
379
MYSQL_ROW current_row;
380
MEM_ROOT field_alloc;
381
unsigned int field_count, current_field;
383
my_bool unbuffered_fetch_cancelled;
386
typedef struct st_mysql_parameters
388
unsigned long *p_max_allowed_packet;
389
unsigned long *p_net_buffer_length;
392
int mysql_server_init(int argc, char **argv, char **groups);
393
void mysql_server_end(void);
394
MYSQL_PARAMETERS * mysql_get_parameters(void);
395
my_bool mysql_thread_init(void);
396
void mysql_thread_end(void);
397
my_ulonglong mysql_num_rows(MYSQL_RES *res);
398
unsigned int mysql_num_fields(MYSQL_RES *res);
399
my_bool mysql_eof(MYSQL_RES *res);
400
MYSQL_FIELD * mysql_fetch_field_direct(MYSQL_RES *res,
401
unsigned int fieldnr);
402
MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES *res);
403
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res);
404
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *res);
405
unsigned int mysql_field_count(MYSQL *mysql);
406
my_ulonglong mysql_affected_rows(MYSQL *mysql);
407
my_ulonglong mysql_insert_id(MYSQL *mysql);
408
unsigned int mysql_errno(MYSQL *mysql);
409
const char * mysql_error(MYSQL *mysql);
410
const char * mysql_sqlstate(MYSQL *mysql);
411
unsigned int mysql_warning_count(MYSQL *mysql);
412
const char * mysql_info(MYSQL *mysql);
413
unsigned long mysql_thread_id(MYSQL *mysql);
414
const char * mysql_character_set_name(MYSQL *mysql);
415
int mysql_set_character_set(MYSQL *mysql, const char *csname);
416
MYSQL * mysql_init(MYSQL *mysql);
417
my_bool mysql_ssl_set(MYSQL *mysql, const char *key,
418
const char *cert, const char *ca,
419
const char *capath, const char *cipher);
420
const char * mysql_get_ssl_cipher(MYSQL *mysql);
421
my_bool mysql_change_user(MYSQL *mysql, const char *user,
422
const char *passwd, const char *db);
423
MYSQL * mysql_real_connect(MYSQL *mysql, const char *host,
428
const char *unix_socket,
429
unsigned long clientflag);
430
int mysql_select_db(MYSQL *mysql, const char *db);
431
int mysql_query(MYSQL *mysql, const char *q);
432
int mysql_send_query(MYSQL *mysql, const char *q,
433
unsigned long length);
434
int mysql_real_query(MYSQL *mysql, const char *q,
435
unsigned long length);
436
MYSQL_RES * mysql_store_result(MYSQL *mysql);
437
MYSQL_RES * mysql_use_result(MYSQL *mysql);
438
void mysql_get_character_set_info(MYSQL *mysql,
439
MY_CHARSET_INFO *charset);
441
mysql_set_local_infile_handler(MYSQL *mysql,
442
int (*local_infile_init)(void **, const char *,
444
int (*local_infile_read)(void *, char *,
446
void (*local_infile_end)(void *),
447
int (*local_infile_error)(void *, char*,
451
mysql_set_local_infile_default(MYSQL *mysql);
452
int mysql_shutdown(MYSQL *mysql,
453
enum mysql_enum_shutdown_level
455
int mysql_dump_debug_info(MYSQL *mysql);
456
int mysql_refresh(MYSQL *mysql,
457
unsigned int refresh_options);
458
int mysql_kill(MYSQL *mysql,unsigned long pid);
459
int mysql_set_server_option(MYSQL *mysql,
460
enum enum_mysql_set_option
462
int mysql_ping(MYSQL *mysql);
463
const char * mysql_stat(MYSQL *mysql);
464
const char * mysql_get_server_info(MYSQL *mysql);
465
const char * mysql_get_client_info(void);
466
unsigned long mysql_get_client_version(void);
467
const char * mysql_get_host_info(MYSQL *mysql);
468
unsigned long mysql_get_server_version(MYSQL *mysql);
469
unsigned int mysql_get_proto_info(MYSQL *mysql);
470
MYSQL_RES * mysql_list_dbs(MYSQL *mysql,const char *wild);
471
MYSQL_RES * mysql_list_tables(MYSQL *mysql,const char *wild);
472
MYSQL_RES * mysql_list_processes(MYSQL *mysql);
473
int mysql_options(MYSQL *mysql,enum mysql_option option,
475
int mysql_options4(MYSQL *mysql,enum mysql_option option,
476
const void *arg1, const void *arg2);
477
void mysql_free_result(MYSQL_RES *result);
478
void mysql_data_seek(MYSQL_RES *result,
479
my_ulonglong offset);
480
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,
481
MYSQL_ROW_OFFSET offset);
482
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,
483
MYSQL_FIELD_OFFSET offset);
484
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
485
unsigned long * mysql_fetch_lengths(MYSQL_RES *result);
486
MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result);
487
MYSQL_RES * mysql_list_fields(MYSQL *mysql, const char *table,
489
unsigned long mysql_escape_string(char *to,const char *from,
490
unsigned long from_length);
491
unsigned long mysql_hex_string(char *to,const char *from,
492
unsigned long from_length);
493
unsigned long mysql_real_escape_string(MYSQL *mysql,
494
char *to,const char *from,
495
unsigned long length);
496
void mysql_debug(const char *debug);
497
void myodbc_remove_escape(MYSQL *mysql,char *name);
498
unsigned int mysql_thread_safe(void);
499
my_bool mysql_embedded(void);
500
my_bool mysql_read_query_result(MYSQL *mysql);
501
enum enum_mysql_stmt_state
503
MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE,
504
MYSQL_STMT_FETCH_DONE
506
typedef struct st_mysql_bind
508
unsigned long *length;
512
unsigned char *row_ptr;
513
void (*store_param_func)(NET *net, struct st_mysql_bind *param);
514
void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *,
515
unsigned char **row);
516
void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,
517
unsigned char **row);
518
unsigned long buffer_length;
519
unsigned long offset;
520
unsigned long length_value;
521
unsigned int param_number;
522
unsigned int pack_length;
523
enum enum_field_types buffer_type;
526
my_bool long_data_used;
527
my_bool is_null_value;
530
struct st_mysql_stmt_extension;
531
typedef struct st_mysql_stmt
540
MYSQL_ROWS *data_cursor;
541
int (*read_row_func)(struct st_mysql_stmt *stmt,
542
unsigned char **row);
543
my_ulonglong affected_rows;
544
my_ulonglong insert_id;
545
unsigned long stmt_id;
547
unsigned long prefetch_rows;
548
unsigned int server_status;
549
unsigned int last_errno;
550
unsigned int param_count;
551
unsigned int field_count;
552
enum enum_mysql_stmt_state state;
553
char last_error[512];
555
my_bool send_types_to_server;
556
my_bool bind_param_done;
557
unsigned char bind_result_done;
558
my_bool unbuffered_fetch_cancelled;
559
my_bool update_max_length;
560
struct st_mysql_stmt_extension *extension;
562
enum enum_stmt_attr_type
564
STMT_ATTR_UPDATE_MAX_LENGTH,
565
STMT_ATTR_CURSOR_TYPE,
566
STMT_ATTR_PREFETCH_ROWS
568
MYSQL_STMT * mysql_stmt_init(MYSQL *mysql);
569
int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query,
570
unsigned long length);
571
int mysql_stmt_execute(MYSQL_STMT *stmt);
572
int mysql_stmt_fetch(MYSQL_STMT *stmt);
573
int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg,
575
unsigned long offset);
576
int mysql_stmt_store_result(MYSQL_STMT *stmt);
577
unsigned long mysql_stmt_param_count(MYSQL_STMT * stmt);
578
my_bool mysql_stmt_attr_set(MYSQL_STMT *stmt,
579
enum enum_stmt_attr_type attr_type,
581
my_bool mysql_stmt_attr_get(MYSQL_STMT *stmt,
582
enum enum_stmt_attr_type attr_type,
584
my_bool mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
585
my_bool mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
586
my_bool mysql_stmt_close(MYSQL_STMT * stmt);
587
my_bool mysql_stmt_reset(MYSQL_STMT * stmt);
588
my_bool mysql_stmt_free_result(MYSQL_STMT *stmt);
589
my_bool mysql_stmt_send_long_data(MYSQL_STMT *stmt,
590
unsigned int param_number,
592
unsigned long length);
593
MYSQL_RES * mysql_stmt_result_metadata(MYSQL_STMT *stmt);
594
MYSQL_RES * mysql_stmt_param_metadata(MYSQL_STMT *stmt);
595
unsigned int mysql_stmt_errno(MYSQL_STMT * stmt);
596
const char * mysql_stmt_error(MYSQL_STMT * stmt);
597
const char * mysql_stmt_sqlstate(MYSQL_STMT * stmt);
598
MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt,
599
MYSQL_ROW_OFFSET offset);
600
MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt);
601
void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset);
602
my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt);
603
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt);
604
my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt);
605
unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt);
606
my_bool mysql_commit(MYSQL * mysql);
607
my_bool mysql_rollback(MYSQL * mysql);
608
my_bool mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
609
my_bool mysql_more_results(MYSQL *mysql);
610
int mysql_next_result(MYSQL *mysql);
611
int mysql_stmt_next_result(MYSQL_STMT *stmt);
612
void mysql_close(MYSQL *sock);