- /* The length returned includes all the '\0' terminators. */
- list_len = sys_llistxattr(fname, namebuf, namebuf_len);
- if (list_len > (ssize_t)namebuf_len) {
- list_len = -1;
- errno = ERANGE;
- }
- if (list_len >= 0)
- return list_len;
- if (errno == ENOTSUP)
- return 0;
- if (errno == ERANGE) {
- list_len = sys_llistxattr(fname, NULL, 0);
- if (list_len < 0) {
+ while (1) {
+ /* The length returned includes all the '\0' terminators. */
+ list_len = sys_llistxattr(fname, namebuf, namebuf_len);
+ if (list_len >= 0) {
+ if ((size_t)list_len <= namebuf_len)
+ break;
+ } else if (errno == ENOTSUP)
+ return 0;
+ else if (errno != ERANGE) {
+ arg = (double)namebuf_len;
+ got_error: