cvs commit: src/sys/sys extattr.h src/share/man/man9 extattr.9

Kirk McKusick mckusick at FreeBSD.org
Mon Feb 26 06:18:54 UTC 2007


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


More information about the cvs-src mailing list