[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