[Toybox] [PATCH] macOS: move getmountlist.c functions into portability.c.

enh enh at google.com
Tue Dec 4 13:34:45 PST 2018


it'll fail to build if you actually try to build a toy that needs these :-)
On Tue, Dec 4, 2018 at 1:28 PM Reverend Homer <mk.43.ecko at gmail.com> wrote:
>
>
> 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
> _______________________________________________
> Toybox mailing list
> Toybox at lists.landley.net
> http://lists.landley.net/listinfo.cgi/toybox-landley.net



More information about the Toybox mailing list