Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Feb 2007 06:18:54 +0000 (UTC)
From:      Kirk McKusick <mckusick@FreeBSD.org>
To:        src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/sys extattr.h src/share/man/man9 extattr.9
Message-ID:  <200702260618.l1Q6IsXI071636@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
mckusick    2007-02-26 06:18:53 UTC

  FreeBSD src repository

  Modified files:
    sys/sys              extattr.h 
    share/man/man9       extattr.9 
  Log:
  Declare a `struct extattr' that defines the format of an extended
  attribute. Also define some macros to manipulate one of these
  structures. Explain their use in the extattr.9 manual page.
  
  The next step will be to make a sweep through the kernel replacing
  the old pointer manipulation code. To get an idea of how they would
  be used, the ffs_findextattr() function in ufs/ffs/ffs_vnops.c is
  currently written as follows:
  
  /*
   * Vnode operating to retrieve a named extended attribute.
   *
   * Locate a particular EA (nspace:name) in the area (ptr:length), and return
   * the length of the EA, and possibly the pointer to the entry and to the data.
   */
  static int
  ffs_findextattr(u_char *ptr, u_int length, int nspace, const char *name,
      u_char **eap, u_char **eac)
  {
          u_char *p, *pe, *pn, *p0;
          int eapad1, eapad2, ealength, ealen, nlen;
          uint32_t ul;
  
          pe = ptr + length;
          nlen = strlen(name);
  
          for (p = ptr; p < pe; p = pn) {
                  p0 = p;
                  bcopy(p, &ul, sizeof(ul));
                  pn = p + ul;
                  /* make sure this entry is complete */
                  if (pn > pe)
                          break;
                  p += sizeof(uint32_t);
                  if (*p != nspace)
                          continue;
                  p++;
                  eapad2 = *p++;
                  if (*p != nlen)
                          continue;
                  p++;
                  if (bcmp(p, name, nlen))
                          continue;
                  ealength = sizeof(uint32_t) + 3 + nlen;
                  eapad1 = 8 - (ealength % 8);
                  if (eapad1 == 8)
                          eapad1 = 0;
                  ealength += eapad1;
                  ealen = ul - ealength - eapad2;
                  p += nlen + eapad1;
                  if (eap != NULL)
                          *eap = p0;
                  if (eac != NULL)
                          *eac = p;
                  return (ealen);
          }
          return(-1);
  }
  
  After applying the structure and macros, it would look like this:
  
  /*
   * Vnode operating to retrieve a named extended attribute.
   *
   * Locate a particular EA (nspace:name) in the area (ptr:length), and return
   * the length of the EA, and possibly the pointer to the entry and to the data.
   */
  static int
  ffs_findextattr(u_char *ptr, u_int length, int nspace, const char *name,
      u_char **eapp, u_char **eac)
  {
          struct extattr *eap, *eaend;
  
          eaend = (struct extattr *)(ptr + length);
          for (eap = (struct extattr *)ptr; eap < eaend; eap = EXTATTR_NEXT(eap)){
                  /* make sure this entry is complete */
                  if (EXTATTR_NEXT(eap) > eaend)
                          break;
                  if (eap->ea_namespace != nspace ||
                      eap->ea_namelength != length ||
                      bcmp(eap->ea_name, name, length))
                          continue;
                  if (eapp != NULL)
                          *eapp = eap;
                  if (eac != NULL)
                          *eac = EXTATTR_CONTENT(eap);
                  return (EXTATTR_CONTENT_SIZE(eap));
          }
          return(-1);
  }
  
  Not only is it considerably shorter, but it hopefully more readable :-)
  
  Revision  Changes    Path
  1.16      +55 -0     src/share/man/man9/extattr.9
  1.14      +59 -0     src/sys/sys/extattr.h



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200702260618.l1Q6IsXI071636>