[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