dev_t * get_mounted_devices (size_t *n) { size_t alloc_size = 0u; size_t used = 0u; struct mount_entry *entries, *entry; dev_t *result = NULL; /* Use read_file_system_list() rather than must_read_fs_list() * because on some system this is always called at startup, * and find should only exit fatally if it needs to use the * result of this operation. If we can't get the fs list * but we never need the information, there is no need to fail. */ for (entry = entries = read_file_system_list(false); entry; entry = entry->me_next) { result = extendbuf(result, sizeof(dev_t)*(used+1), &alloc_size); set_fstype_devno(entry); result[used] = entry->me_dev; ++used; } free_file_system_list(entries); *n = used; return result; }
char * get_mounted_filesystems (void) { char *result = NULL; size_t alloc_size = 0u; size_t used = 0u; struct mount_entry *entries, *entry; entries = must_read_fs_list(false); for (entry=entries; entry; entry=entry->me_next) { size_t len; #ifdef MNTTYPE_IGNORE if (!strcmp (entry->me_type, MNTTYPE_IGNORE)) continue; #endif set_fstype_devno(entry); len = strlen(entry->me_mountdir) + 1; result = extendbuf(result, used+len, &alloc_size); strcpy(&result[used], entry->me_mountdir); used += len; /* len already includes one for the \0 */ } free_file_system_list(entries); return result; }
void * xextendbuf (void* existing, size_t wanted, size_t *allocated) { void *p = extendbuf (existing, wanted, allocated); if (NULL == p) { free (existing); xalloc_die (); } return p; }
static char * old_savedirinfo (const char *dir, struct savedir_extrainfo **extra) { DIR *dirp; struct dirent *dp; char *name_space; size_t namebuf_allocated = 0u, namebuf_used = 0u; #if defined(HAVE_STRUCT_DIRENT_D_TYPE) && defined(USE_STRUCT_DIRENT_D_TYPE) size_t extra_allocated = 0u, extra_used = 0u; struct savedir_extrainfo *info = NULL; #endif int save_errno; if (extra) *extra = NULL; dirp = opendir (dir); if (dirp == NULL) return NULL; errno = 0; name_space = NULL; while ((dp = readdir (dirp)) != NULL) { /* Skip "", ".", and "..". "" is returned by at least one buggy implementation: Solaris 2.4 readdir on NFS file systems. */ char const *entry = dp->d_name; if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0') { /* Remember the name. */ size_t entry_size = strlen (entry) + 1; name_space = extendbuf(name_space, namebuf_used+entry_size, &namebuf_allocated); memcpy (name_space + namebuf_used, entry, entry_size); namebuf_used += entry_size; #if defined(HAVE_STRUCT_DIRENT_D_TYPE) && defined(USE_STRUCT_DIRENT_D_TYPE) /* Remember the type. */ if (extra) { info = extendbuf(info, (extra_used+1) * sizeof(struct savedir_dirinfo), &extra_allocated); info[extra_used].type_info = type_to_mode(dp->d_type); ++extra_used; } #endif } } name_space = extendbuf(name_space, namebuf_used+1, &namebuf_allocated); name_space[namebuf_used] = '\0'; save_errno = errno; if (CLOSEDIR (dirp) != 0) save_errno = errno; if (save_errno != 0) { free (name_space); errno = save_errno; return NULL; } #if defined(HAVE_STRUCT_DIRENT_D_TYPE) && defined(USE_STRUCT_DIRENT_D_TYPE) if (extra && info) *extra = info; #endif return name_space; }
struct savedir_dirinfo * xsavedir(const char *dir, int flags) { DIR *dirp; struct dirent *dp; struct savedir_dirinfo *result = NULL; struct new_savedir_direntry_internal *internal; size_t namebuf_allocated = 0u, namebuf_used = 0u; size_t entrybuf_allocated = 0u; int save_errno; dirp = opendir (dir); if (dirp == NULL) return NULL; errno = 0; result = xmalloc(sizeof(*result)); result->buffer = NULL; result->size = 0u; result->entries = NULL; internal = NULL; while ((dp = readdir (dirp)) != NULL) { /* Skip "", ".", and "..". "" is returned by at least one buggy implementation: Solaris 2.4 readdir on NFS file systems. */ char const *entry = dp->d_name; if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0') { /* Remember the name. */ size_t entry_size = strlen (entry) + 1; result->buffer = extendbuf(result->buffer, namebuf_used+entry_size, &namebuf_allocated); memcpy ((result->buffer) + namebuf_used, entry, entry_size); /* Remember the other stuff. */ internal = extendbuf(internal, (1+result->size)*sizeof(*internal), &entrybuf_allocated); internal[result->size].flags = 0; #if defined(HAVE_STRUCT_DIRENT_D_TYPE) && defined(USE_STRUCT_DIRENT_D_TYPE) internal[result->size].type_info = type_to_mode(dp->d_type); if (dp->d_type != DT_UNKNOWN) internal[result->size].flags |= SavedirHaveFileType; #else internal[result->size].type_info = 0; #endif internal[result->size].buffer_offset = namebuf_used; /* Prepare for the next iteration */ ++(result->size); namebuf_used += entry_size; } } result->buffer = extendbuf(result->buffer, namebuf_used+1, &namebuf_allocated); result->buffer[namebuf_used] = '\0'; /* convert the result to its externally-usable form. */ result->entries = convertentries(result, internal); free(internal); internal = NULL; if (flags & SavedirSort) { qsort(result->entries, result->size, sizeof(*result->entries), savedir_cmp); } save_errno = errno; if (CLOSEDIR (dirp) != 0) save_errno = errno; if (save_errno != 0) { free (result->buffer); free (result); errno = save_errno; return NULL; } return result; }