[Toybox] [PATCH] macOS: move getmountlist.c functions into portability.c.
Reverend Homer
mk.43.ecko at gmail.com
Tue Dec 4 13:28:20 PST 2018
On 04/12/2018 23:48, enh via Toybox wrote:
> <...>
> +
> +// Get a linked list of mount points, with stat information.
> +#ifdef __APPLE__
> +
> +// Not implemented for macOS.
> +// See <sys/mount.h>'s getmntinfo(3) for the BSD API.
> +
Shouldn't there be some warning?
R.H.
> +#else
> +
> +#include <mntent.h>
> +
> +static void octal_deslash(char *s)
> +{
> + char *o = s;
> +
> + while (*s) {
> + if (*s == '\\') {
> + int i, oct = 0;
> +
> + for (i = 1; i < 4; i++) {
> + if (!isdigit(s[i])) break;
> + oct = (oct<<3)+s[i]-'0';
> + }
> + if (i == 4) {
> + *o++ = oct;
> + s += i;
> + continue;
> + }
> + }
> + *o++ = *s++;
> + }
> +
> + *o = 0;
> +}
> +
> +// Check if this type matches list.
> +// Odd syntax: typelist all yes = if any, typelist all no = if none.
> +
> +int mountlist_istype(struct mtab_list *ml, char *typelist)
> +{
> + int len, skip;
> + char *t;
> +
> + if (!typelist) return 1;
> +
> + skip = strncmp(typelist, "no", 2);
> +
> + for (;;) {
> + if (!(t = comma_iterate(&typelist, &len))) break;
> + if (!skip) {
> + // If one -t starts with "no", the rest must too
> + if (strncmp(t, "no", 2)) error_exit("bad typelist");
> + if (!strncmp(t+2, ml->type, len-2)) {
> + skip = 1;
> + break;
> + }
> + } else if (!strncmp(t, ml->type, len) && !ml->type[len]) {
> + skip = 0;
> + break;
> + }
> + }
> +
> + return !skip;
> +}
> +
> +// Get list of mounted filesystems, including stat and statvfs info.
> +// Returns a reversed list, which is good for finding overmounts and such.
> +
> +struct mtab_list *xgetmountlist(char *path)
> +{
> + struct mtab_list *mtlist = 0, *mt;
> + struct mntent *me;
> + FILE *fp;
> + char *p = path ? path : "/proc/mounts";
> +
> + if (!(fp = setmntent(p, "r"))) perror_exit("bad %s", p);
> +
> + // The "test" part of the loop is done before the first time through and
> + // again after each "increment", so putting the actual load there avoids
> + // duplicating it. If the load was NULL, the loop stops.
> +
> + while ((me = getmntent(fp))) {
> + mt = xzalloc(sizeof(struct mtab_list) + strlen(me->mnt_fsname) +
> + strlen(me->mnt_dir) + strlen(me->mnt_type) + strlen(me->mnt_opts) + 4);
> + dlist_add_nomalloc((void *)&mtlist, (void *)mt);
> +
> + // Collect details about mounted filesystem
> + // Don't report errors, just leave data zeroed
> + if (!path) {
> + stat(me->mnt_dir, &(mt->stat));
> + statvfs(me->mnt_dir, &(mt->statvfs));
> + }
> +
> + // Remember information from /proc/mounts
> + mt->dir = stpcpy(mt->type, me->mnt_type)+1;
> + mt->device = stpcpy(mt->dir, me->mnt_dir)+1;
> + mt->opts = stpcpy(mt->device, me->mnt_fsname)+1;
> + strcpy(mt->opts, me->mnt_opts);
> +
> + octal_deslash(mt->dir);
> + octal_deslash(mt->device);
> + }
> + endmntent(fp);
> +
> + return mtlist;
> +}
> +
> +#endif
>
> _______________________________________________
> Toybox mailing list
> Toybox at lists.landley.net
> http://lists.landley.net/listinfo.cgi/toybox-landley.net
More information about the Toybox
mailing list