@brief returns buffer, to be assigned in handler_iterator struct */
| 367 | returns buffer, to be assigned in handler_iterator struct |
| 368 | */ |
| 369 | enum handler_create_iterator_result |
| 370 | fl_log_iterator_buffer_init(struct handler_iterator *iterator) |
| 371 | { |
| 372 | MY_DIR *dirp; |
| 373 | struct fl_buff *buff; |
| 374 | char *name_ptr; |
| 375 | uchar *ptr; |
| 376 | FILEINFO *file; |
| 377 | uint32 i; |
| 378 | |
| 379 | /* to be able to make my_free without crash in case of error */ |
| 380 | iterator->buffer= 0; |
| 381 | |
| 382 | if (!(dirp = my_dir(fl_dir, MYF(0)))) |
| 383 | { |
| 384 | return HA_ITERATOR_ERROR; |
| 385 | } |
| 386 | if ((ptr= (uchar*)my_malloc(ALIGN_SIZE(sizeof(fl_buff)) + |
| 387 | ((ALIGN_SIZE(sizeof(LEX_STRING)) + |
| 388 | sizeof(enum log_status) + |
| 389 | + FN_REFLEN + 1) * |
| 390 | (uint) dirp->number_off_files), |
| 391 | MYF(0))) == 0) |
| 392 | { |
| 393 | return HA_ITERATOR_ERROR; |
| 394 | } |
| 395 | buff= (struct fl_buff *)ptr; |
| 396 | buff->entries= buff->current= 0; |
| 397 | ptr= ptr + (ALIGN_SIZE(sizeof(fl_buff))); |
| 398 | buff->names= (LEX_STRING*) (ptr); |
| 399 | ptr= ptr + ((ALIGN_SIZE(sizeof(LEX_STRING)) * |
| 400 | (uint) dirp->number_off_files)); |
| 401 | buff->statuses= (enum log_status *)(ptr); |
| 402 | name_ptr= (char *)(ptr + (sizeof(enum log_status) * |
| 403 | (uint) dirp->number_off_files)); |
| 404 | for (i=0 ; i < (uint) dirp->number_off_files ; i++) |
| 405 | { |
| 406 | enum log_status st; |
| 407 | file= dirp->dir_entry + i; |
| 408 | if ((file->name[0] == '.' && |
| 409 | ((file->name[1] == '.' && file->name[2] == '\0') || |
| 410 | file->name[1] == '\0'))) |
| 411 | continue; |
| 412 | if ((st= fl_get_log_status(file->name)) == HA_LOG_STATUS_NOSUCHLOG) |
| 413 | continue; |
| 414 | name_ptr= strxnmov(buff->names[buff->entries].str= name_ptr, |
| 415 | FN_REFLEN, fl_dir, file->name, NullS); |
| 416 | buff->names[buff->entries].length= (name_ptr - |
| 417 | buff->names[buff->entries].str); |
| 418 | buff->statuses[buff->entries]= st; |
| 419 | buff->entries++; |
| 420 | } |
| 421 | |
| 422 | iterator->buffer= buff; |
| 423 | iterator->next= &fl_log_iterator_next; |
| 424 | iterator->destroy= &fl_log_iterator_destroy; |
| 425 | return HA_ITERATOR_OK; |
| 426 | } |
no test coverage detected