diff options
| author | Eli Zaretskii | 2013-02-16 13:08:49 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2013-02-16 13:08:49 +0200 |
| commit | f277993be3a50b375c670351cb4051c806edd97f (patch) | |
| tree | c92aa8b73303472c251fc6cb8ca42d3822ac3296 /src | |
| parent | 2b0afdd959577f6049dbcb64e17885fcf75a95b9 (diff) | |
| download | emacs-f277993be3a50b375c670351cb4051c806edd97f.tar.gz emacs-f277993be3a50b375c670351cb4051c806edd97f.zip | |
Don't set h_errno on MS-Windows except in gethostbyname.
See http://lists.gnu.org/archive/html/emacs-devel/2013-02/msg00293.html
and the following discussion for the details.
src/w32.c (set_errno): Reset h_errno and don't set it to any other
value. Set errno instead.
(check_errno): Reset h_errno.
(sys_socket, socket_to_fd, sys_bind, sys_connect)
(sys_gethostname, sys_getservbyname, sys_getpeername)
(sys_shutdown, sys_setsockopt, sys_listen, sys_getsockname)
(sys_accept, sys_recvfrom, sys_sendto, fcntl, sys_read): Don't set
h_errno.
(sys_gethostbyname): Set h_errno only errors detected.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 12 | ||||
| -rw-r--r-- | src/w32.c | 128 |
2 files changed, 81 insertions, 59 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 6ff25edac50..d326532ecb7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,15 @@ | |||
| 1 | 2013-02-16 Eli Zaretskii <eliz@gnu.org> | ||
| 2 | |||
| 3 | * w32.c (set_errno): Reset h_errno and don't set it to any other | ||
| 4 | value. Set errno instead. | ||
| 5 | (check_errno): Reset h_errno. | ||
| 6 | (sys_socket, socket_to_fd, sys_bind, sys_connect) | ||
| 7 | (sys_gethostname, sys_getservbyname, sys_getpeername) | ||
| 8 | (sys_shutdown, sys_setsockopt, sys_listen, sys_getsockname) | ||
| 9 | (sys_accept, sys_recvfrom, sys_sendto, fcntl, sys_read): Don't set | ||
| 10 | h_errno. | ||
| 11 | (sys_gethostbyname): Set h_errno only errors detected. | ||
| 12 | |||
| 1 | 2013-02-15 Paul Eggert <eggert@cs.ucla.edu> | 13 | 2013-02-15 Paul Eggert <eggert@cs.ucla.edu> |
| 2 | 14 | ||
| 3 | * process.c (h_errno) [!HAVE_H_ERRNO]: Remove unused decl. | 15 | * process.c (h_errno) [!HAVE_H_ERRNO]: Remove unused decl. |
| @@ -6092,35 +6092,39 @@ init_winsock (int load_now) | |||
| 6092 | 6092 | ||
| 6093 | int h_errno = 0; | 6093 | int h_errno = 0; |
| 6094 | 6094 | ||
| 6095 | /* function to set h_errno for compatibility; map winsock error codes to | 6095 | /* Function to map winsock error codes to errno codes for those errno |
| 6096 | normal system codes where they overlap (non-overlapping definitions | 6096 | code defined in errno.h (errno values not defined by errno.h are |
| 6097 | are already in <sys/socket.h> */ | 6097 | already in nt/inc/sys/socket.h). */ |
| 6098 | static void | 6098 | static void |
| 6099 | set_errno (void) | 6099 | set_errno (void) |
| 6100 | { | 6100 | { |
| 6101 | int wsa_err; | ||
| 6102 | |||
| 6103 | h_errno = 0; | ||
| 6101 | if (winsock_lib == NULL) | 6104 | if (winsock_lib == NULL) |
| 6102 | h_errno = EINVAL; | 6105 | wsa_err = EINVAL; |
| 6103 | else | 6106 | else |
| 6104 | h_errno = pfn_WSAGetLastError (); | 6107 | wsa_err = pfn_WSAGetLastError (); |
| 6105 | 6108 | ||
| 6106 | switch (h_errno) | 6109 | switch (wsa_err) |
| 6107 | { | 6110 | { |
| 6108 | case WSAEACCES: h_errno = EACCES; break; | 6111 | case WSAEACCES: errno = EACCES; break; |
| 6109 | case WSAEBADF: h_errno = EBADF; break; | 6112 | case WSAEBADF: errno = EBADF; break; |
| 6110 | case WSAEFAULT: h_errno = EFAULT; break; | 6113 | case WSAEFAULT: errno = EFAULT; break; |
| 6111 | case WSAEINTR: h_errno = EINTR; break; | 6114 | case WSAEINTR: errno = EINTR; break; |
| 6112 | case WSAEINVAL: h_errno = EINVAL; break; | 6115 | case WSAEINVAL: errno = EINVAL; break; |
| 6113 | case WSAEMFILE: h_errno = EMFILE; break; | 6116 | case WSAEMFILE: errno = EMFILE; break; |
| 6114 | case WSAENAMETOOLONG: h_errno = ENAMETOOLONG; break; | 6117 | case WSAENAMETOOLONG: errno = ENAMETOOLONG; break; |
| 6115 | case WSAENOTEMPTY: h_errno = ENOTEMPTY; break; | 6118 | case WSAENOTEMPTY: errno = ENOTEMPTY; break; |
| 6119 | default: errno = wsa_err; break; | ||
| 6116 | } | 6120 | } |
| 6117 | errno = h_errno; | ||
| 6118 | } | 6121 | } |
| 6119 | 6122 | ||
| 6120 | static void | 6123 | static void |
| 6121 | check_errno (void) | 6124 | check_errno (void) |
| 6122 | { | 6125 | { |
| 6123 | if (h_errno == 0 && winsock_lib != NULL) | 6126 | h_errno = 0; |
| 6127 | if (winsock_lib != NULL) | ||
| 6124 | pfn_WSASetLastError (0); | 6128 | pfn_WSASetLastError (0); |
| 6125 | } | 6129 | } |
| 6126 | 6130 | ||
| @@ -6232,7 +6236,7 @@ sys_socket (int af, int type, int protocol) | |||
| 6232 | 6236 | ||
| 6233 | if (winsock_lib == NULL) | 6237 | if (winsock_lib == NULL) |
| 6234 | { | 6238 | { |
| 6235 | errno = h_errno = ENETDOWN; | 6239 | errno = ENETDOWN; |
| 6236 | return INVALID_SOCKET; | 6240 | return INVALID_SOCKET; |
| 6237 | } | 6241 | } |
| 6238 | 6242 | ||
| @@ -6242,13 +6246,7 @@ sys_socket (int af, int type, int protocol) | |||
| 6242 | s = pfn_socket (af, type, protocol); | 6246 | s = pfn_socket (af, type, protocol); |
| 6243 | 6247 | ||
| 6244 | if (s != INVALID_SOCKET) | 6248 | if (s != INVALID_SOCKET) |
| 6245 | { | 6249 | return socket_to_fd (s); |
| 6246 | int retval = socket_to_fd (s); | ||
| 6247 | |||
| 6248 | if (retval == -1) | ||
| 6249 | errno = h_errno; | ||
| 6250 | return retval; | ||
| 6251 | } | ||
| 6252 | 6250 | ||
| 6253 | set_errno (); | 6251 | set_errno (); |
| 6254 | return -1; | 6252 | return -1; |
| @@ -6344,8 +6342,9 @@ socket_to_fd (SOCKET s) | |||
| 6344 | /* clean up */ | 6342 | /* clean up */ |
| 6345 | _close (fd); | 6343 | _close (fd); |
| 6346 | } | 6344 | } |
| 6345 | else | ||
| 6347 | pfn_closesocket (s); | 6346 | pfn_closesocket (s); |
| 6348 | h_errno = EMFILE; | 6347 | errno = EMFILE; |
| 6349 | return -1; | 6348 | return -1; |
| 6350 | } | 6349 | } |
| 6351 | 6350 | ||
| @@ -6354,7 +6353,7 @@ sys_bind (int s, const struct sockaddr * addr, int namelen) | |||
| 6354 | { | 6353 | { |
| 6355 | if (winsock_lib == NULL) | 6354 | if (winsock_lib == NULL) |
| 6356 | { | 6355 | { |
| 6357 | errno = h_errno = ENOTSOCK; | 6356 | errno = ENOTSOCK; |
| 6358 | return SOCKET_ERROR; | 6357 | return SOCKET_ERROR; |
| 6359 | } | 6358 | } |
| 6360 | 6359 | ||
| @@ -6366,7 +6365,7 @@ sys_bind (int s, const struct sockaddr * addr, int namelen) | |||
| 6366 | set_errno (); | 6365 | set_errno (); |
| 6367 | return rc; | 6366 | return rc; |
| 6368 | } | 6367 | } |
| 6369 | errno = h_errno = ENOTSOCK; | 6368 | errno = ENOTSOCK; |
| 6370 | return SOCKET_ERROR; | 6369 | return SOCKET_ERROR; |
| 6371 | } | 6370 | } |
| 6372 | 6371 | ||
| @@ -6375,7 +6374,7 @@ sys_connect (int s, const struct sockaddr * name, int namelen) | |||
| 6375 | { | 6374 | { |
| 6376 | if (winsock_lib == NULL) | 6375 | if (winsock_lib == NULL) |
| 6377 | { | 6376 | { |
| 6378 | errno = h_errno = ENOTSOCK; | 6377 | errno = ENOTSOCK; |
| 6379 | return SOCKET_ERROR; | 6378 | return SOCKET_ERROR; |
| 6380 | } | 6379 | } |
| 6381 | 6380 | ||
| @@ -6387,7 +6386,7 @@ sys_connect (int s, const struct sockaddr * name, int namelen) | |||
| 6387 | set_errno (); | 6386 | set_errno (); |
| 6388 | return rc; | 6387 | return rc; |
| 6389 | } | 6388 | } |
| 6390 | errno = h_errno = ENOTSOCK; | 6389 | errno = ENOTSOCK; |
| 6391 | return SOCKET_ERROR; | 6390 | return SOCKET_ERROR; |
| 6392 | } | 6391 | } |
| 6393 | 6392 | ||
| @@ -6416,12 +6415,20 @@ int | |||
| 6416 | sys_gethostname (char * name, int namelen) | 6415 | sys_gethostname (char * name, int namelen) |
| 6417 | { | 6416 | { |
| 6418 | if (winsock_lib != NULL) | 6417 | if (winsock_lib != NULL) |
| 6419 | return pfn_gethostname (name, namelen); | 6418 | { |
| 6419 | int retval; | ||
| 6420 | |||
| 6421 | check_errno (); | ||
| 6422 | retval = pfn_gethostname (name, namelen); | ||
| 6423 | if (retval == SOCKET_ERROR) | ||
| 6424 | set_errno (); | ||
| 6425 | return retval; | ||
| 6426 | } | ||
| 6420 | 6427 | ||
| 6421 | if (namelen > MAX_COMPUTERNAME_LENGTH) | 6428 | if (namelen > MAX_COMPUTERNAME_LENGTH) |
| 6422 | return !GetComputerName (name, (DWORD *)&namelen); | 6429 | return !GetComputerName (name, (DWORD *)&namelen); |
| 6423 | 6430 | ||
| 6424 | errno = h_errno = EFAULT; | 6431 | errno = EFAULT; |
| 6425 | return SOCKET_ERROR; | 6432 | return SOCKET_ERROR; |
| 6426 | } | 6433 | } |
| 6427 | 6434 | ||
| @@ -6429,17 +6436,24 @@ struct hostent * | |||
| 6429 | sys_gethostbyname (const char * name) | 6436 | sys_gethostbyname (const char * name) |
| 6430 | { | 6437 | { |
| 6431 | struct hostent * host; | 6438 | struct hostent * host; |
| 6439 | int h_err = h_errno; | ||
| 6432 | 6440 | ||
| 6433 | if (winsock_lib == NULL) | 6441 | if (winsock_lib == NULL) |
| 6434 | { | 6442 | { |
| 6435 | errno = h_errno = ENETDOWN; | 6443 | h_errno = NO_RECOVERY; |
| 6444 | errno = ENETDOWN; | ||
| 6436 | return NULL; | 6445 | return NULL; |
| 6437 | } | 6446 | } |
| 6438 | 6447 | ||
| 6439 | check_errno (); | 6448 | check_errno (); |
| 6440 | host = pfn_gethostbyname (name); | 6449 | host = pfn_gethostbyname (name); |
| 6441 | if (!host) | 6450 | if (!host) |
| 6442 | set_errno (); | 6451 | { |
| 6452 | set_errno (); | ||
| 6453 | h_errno = errno; | ||
| 6454 | } | ||
| 6455 | else | ||
| 6456 | h_errno = h_err; | ||
| 6443 | return host; | 6457 | return host; |
| 6444 | } | 6458 | } |
| 6445 | 6459 | ||
| @@ -6450,7 +6464,7 @@ sys_getservbyname (const char * name, const char * proto) | |||
| 6450 | 6464 | ||
| 6451 | if (winsock_lib == NULL) | 6465 | if (winsock_lib == NULL) |
| 6452 | { | 6466 | { |
| 6453 | errno = h_errno = ENETDOWN; | 6467 | errno = ENETDOWN; |
| 6454 | return NULL; | 6468 | return NULL; |
| 6455 | } | 6469 | } |
| 6456 | 6470 | ||
| @@ -6466,7 +6480,7 @@ sys_getpeername (int s, struct sockaddr *addr, int * namelen) | |||
| 6466 | { | 6480 | { |
| 6467 | if (winsock_lib == NULL) | 6481 | if (winsock_lib == NULL) |
| 6468 | { | 6482 | { |
| 6469 | errno = h_errno = ENETDOWN; | 6483 | errno = ENETDOWN; |
| 6470 | return SOCKET_ERROR; | 6484 | return SOCKET_ERROR; |
| 6471 | } | 6485 | } |
| 6472 | 6486 | ||
| @@ -6478,7 +6492,7 @@ sys_getpeername (int s, struct sockaddr *addr, int * namelen) | |||
| 6478 | set_errno (); | 6492 | set_errno (); |
| 6479 | return rc; | 6493 | return rc; |
| 6480 | } | 6494 | } |
| 6481 | errno = h_errno = ENOTSOCK; | 6495 | errno = ENOTSOCK; |
| 6482 | return SOCKET_ERROR; | 6496 | return SOCKET_ERROR; |
| 6483 | } | 6497 | } |
| 6484 | 6498 | ||
| @@ -6487,7 +6501,7 @@ sys_shutdown (int s, int how) | |||
| 6487 | { | 6501 | { |
| 6488 | if (winsock_lib == NULL) | 6502 | if (winsock_lib == NULL) |
| 6489 | { | 6503 | { |
| 6490 | errno = h_errno = ENETDOWN; | 6504 | errno = ENETDOWN; |
| 6491 | return SOCKET_ERROR; | 6505 | return SOCKET_ERROR; |
| 6492 | } | 6506 | } |
| 6493 | 6507 | ||
| @@ -6499,7 +6513,7 @@ sys_shutdown (int s, int how) | |||
| 6499 | set_errno (); | 6513 | set_errno (); |
| 6500 | return rc; | 6514 | return rc; |
| 6501 | } | 6515 | } |
| 6502 | errno = h_errno = ENOTSOCK; | 6516 | errno = ENOTSOCK; |
| 6503 | return SOCKET_ERROR; | 6517 | return SOCKET_ERROR; |
| 6504 | } | 6518 | } |
| 6505 | 6519 | ||
| @@ -6508,7 +6522,7 @@ sys_setsockopt (int s, int level, int optname, const void * optval, int optlen) | |||
| 6508 | { | 6522 | { |
| 6509 | if (winsock_lib == NULL) | 6523 | if (winsock_lib == NULL) |
| 6510 | { | 6524 | { |
| 6511 | errno = h_errno = ENETDOWN; | 6525 | errno = ENETDOWN; |
| 6512 | return SOCKET_ERROR; | 6526 | return SOCKET_ERROR; |
| 6513 | } | 6527 | } |
| 6514 | 6528 | ||
| @@ -6521,7 +6535,7 @@ sys_setsockopt (int s, int level, int optname, const void * optval, int optlen) | |||
| 6521 | set_errno (); | 6535 | set_errno (); |
| 6522 | return rc; | 6536 | return rc; |
| 6523 | } | 6537 | } |
| 6524 | errno = h_errno = ENOTSOCK; | 6538 | errno = ENOTSOCK; |
| 6525 | return SOCKET_ERROR; | 6539 | return SOCKET_ERROR; |
| 6526 | } | 6540 | } |
| 6527 | 6541 | ||
| @@ -6530,7 +6544,7 @@ sys_listen (int s, int backlog) | |||
| 6530 | { | 6544 | { |
| 6531 | if (winsock_lib == NULL) | 6545 | if (winsock_lib == NULL) |
| 6532 | { | 6546 | { |
| 6533 | errno = h_errno = ENETDOWN; | 6547 | errno = ENETDOWN; |
| 6534 | return SOCKET_ERROR; | 6548 | return SOCKET_ERROR; |
| 6535 | } | 6549 | } |
| 6536 | 6550 | ||
| @@ -6544,7 +6558,7 @@ sys_listen (int s, int backlog) | |||
| 6544 | fd_info[s].flags |= FILE_LISTEN; | 6558 | fd_info[s].flags |= FILE_LISTEN; |
| 6545 | return rc; | 6559 | return rc; |
| 6546 | } | 6560 | } |
| 6547 | errno = h_errno = ENOTSOCK; | 6561 | errno = ENOTSOCK; |
| 6548 | return SOCKET_ERROR; | 6562 | return SOCKET_ERROR; |
| 6549 | } | 6563 | } |
| 6550 | 6564 | ||
| @@ -6553,7 +6567,7 @@ sys_getsockname (int s, struct sockaddr * name, int * namelen) | |||
| 6553 | { | 6567 | { |
| 6554 | if (winsock_lib == NULL) | 6568 | if (winsock_lib == NULL) |
| 6555 | { | 6569 | { |
| 6556 | errno = h_errno = ENETDOWN; | 6570 | errno = ENETDOWN; |
| 6557 | return SOCKET_ERROR; | 6571 | return SOCKET_ERROR; |
| 6558 | } | 6572 | } |
| 6559 | 6573 | ||
| @@ -6565,7 +6579,7 @@ sys_getsockname (int s, struct sockaddr * name, int * namelen) | |||
| 6565 | set_errno (); | 6579 | set_errno (); |
| 6566 | return rc; | 6580 | return rc; |
| 6567 | } | 6581 | } |
| 6568 | errno = h_errno = ENOTSOCK; | 6582 | errno = ENOTSOCK; |
| 6569 | return SOCKET_ERROR; | 6583 | return SOCKET_ERROR; |
| 6570 | } | 6584 | } |
| 6571 | 6585 | ||
| @@ -6574,7 +6588,7 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen) | |||
| 6574 | { | 6588 | { |
| 6575 | if (winsock_lib == NULL) | 6589 | if (winsock_lib == NULL) |
| 6576 | { | 6590 | { |
| 6577 | errno = h_errno = ENETDOWN; | 6591 | errno = ENETDOWN; |
| 6578 | return -1; | 6592 | return -1; |
| 6579 | } | 6593 | } |
| 6580 | 6594 | ||
| @@ -6586,11 +6600,7 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen) | |||
| 6586 | if (t == INVALID_SOCKET) | 6600 | if (t == INVALID_SOCKET) |
| 6587 | set_errno (); | 6601 | set_errno (); |
| 6588 | else | 6602 | else |
| 6589 | { | 6603 | fd = socket_to_fd (t); |
| 6590 | fd = socket_to_fd (t); | ||
| 6591 | if (fd < 0) | ||
| 6592 | errno = h_errno; /* socket_to_fd sets h_errno */ | ||
| 6593 | } | ||
| 6594 | 6604 | ||
| 6595 | if (fd >= 0) | 6605 | if (fd >= 0) |
| 6596 | { | 6606 | { |
| @@ -6599,7 +6609,7 @@ sys_accept (int s, struct sockaddr * addr, int * addrlen) | |||
| 6599 | } | 6609 | } |
| 6600 | return fd; | 6610 | return fd; |
| 6601 | } | 6611 | } |
| 6602 | errno = h_errno = ENOTSOCK; | 6612 | errno = ENOTSOCK; |
| 6603 | return -1; | 6613 | return -1; |
| 6604 | } | 6614 | } |
| 6605 | 6615 | ||
| @@ -6609,7 +6619,7 @@ sys_recvfrom (int s, char * buf, int len, int flags, | |||
| 6609 | { | 6619 | { |
| 6610 | if (winsock_lib == NULL) | 6620 | if (winsock_lib == NULL) |
| 6611 | { | 6621 | { |
| 6612 | errno = h_errno = ENETDOWN; | 6622 | errno = ENETDOWN; |
| 6613 | return SOCKET_ERROR; | 6623 | return SOCKET_ERROR; |
| 6614 | } | 6624 | } |
| 6615 | 6625 | ||
| @@ -6621,7 +6631,7 @@ sys_recvfrom (int s, char * buf, int len, int flags, | |||
| 6621 | set_errno (); | 6631 | set_errno (); |
| 6622 | return rc; | 6632 | return rc; |
| 6623 | } | 6633 | } |
| 6624 | errno = h_errno = ENOTSOCK; | 6634 | errno = ENOTSOCK; |
| 6625 | return SOCKET_ERROR; | 6635 | return SOCKET_ERROR; |
| 6626 | } | 6636 | } |
| 6627 | 6637 | ||
| @@ -6631,7 +6641,7 @@ sys_sendto (int s, const char * buf, int len, int flags, | |||
| 6631 | { | 6641 | { |
| 6632 | if (winsock_lib == NULL) | 6642 | if (winsock_lib == NULL) |
| 6633 | { | 6643 | { |
| 6634 | errno = h_errno = ENETDOWN; | 6644 | errno = ENETDOWN; |
| 6635 | return SOCKET_ERROR; | 6645 | return SOCKET_ERROR; |
| 6636 | } | 6646 | } |
| 6637 | 6647 | ||
| @@ -6643,7 +6653,7 @@ sys_sendto (int s, const char * buf, int len, int flags, | |||
| 6643 | set_errno (); | 6653 | set_errno (); |
| 6644 | return rc; | 6654 | return rc; |
| 6645 | } | 6655 | } |
| 6646 | errno = h_errno = ENOTSOCK; | 6656 | errno = ENOTSOCK; |
| 6647 | return SOCKET_ERROR; | 6657 | return SOCKET_ERROR; |
| 6648 | } | 6658 | } |
| 6649 | 6659 | ||
| @@ -6654,7 +6664,7 @@ fcntl (int s, int cmd, int options) | |||
| 6654 | { | 6664 | { |
| 6655 | if (winsock_lib == NULL) | 6665 | if (winsock_lib == NULL) |
| 6656 | { | 6666 | { |
| 6657 | errno = h_errno = ENETDOWN; | 6667 | errno = ENETDOWN; |
| 6658 | return -1; | 6668 | return -1; |
| 6659 | } | 6669 | } |
| 6660 | 6670 | ||
| @@ -6673,11 +6683,11 @@ fcntl (int s, int cmd, int options) | |||
| 6673 | } | 6683 | } |
| 6674 | else | 6684 | else |
| 6675 | { | 6685 | { |
| 6676 | h_errno = EINVAL; | 6686 | errno = EINVAL; |
| 6677 | return SOCKET_ERROR; | 6687 | return SOCKET_ERROR; |
| 6678 | } | 6688 | } |
| 6679 | } | 6689 | } |
| 6680 | errno = h_errno = ENOTSOCK; | 6690 | errno = ENOTSOCK; |
| 6681 | return SOCKET_ERROR; | 6691 | return SOCKET_ERROR; |
| 6682 | } | 6692 | } |
| 6683 | 6693 | ||
| @@ -7108,7 +7118,7 @@ sys_read (int fd, char * buffer, unsigned int count) | |||
| 7108 | pfn_ioctlsocket (SOCK_HANDLE (fd), FIONREAD, &waiting); | 7118 | pfn_ioctlsocket (SOCK_HANDLE (fd), FIONREAD, &waiting); |
| 7109 | if (waiting == 0 && nchars == 0) | 7119 | if (waiting == 0 && nchars == 0) |
| 7110 | { | 7120 | { |
| 7111 | h_errno = errno = EWOULDBLOCK; | 7121 | errno = EWOULDBLOCK; |
| 7112 | return -1; | 7122 | return -1; |
| 7113 | } | 7123 | } |
| 7114 | 7124 | ||