Initial revision
authorroot <devnull@localhost>
Wed, 22 May 1996 17:24:20 +0000 (17:24 +0000)
committerroot <devnull@localhost>
Wed, 22 May 1996 17:24:20 +0000 (17:24 +0000)
CVS patchset: 579
CVS date: 1996/05/22 17:24:20

build/myftw.c [new file with mode: 0644]
build/myftw.h [new file with mode: 0644]
build/vspec.c [new file with mode: 0644]

diff --git a/build/myftw.c b/build/myftw.c
new file mode 100644 (file)
index 0000000..2f6f469
--- /dev/null
@@ -0,0 +1,216 @@
+/* Modified ftw() -- uses lstat() instead of stat() */
+
+/* Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ian Lance Taylor (ian@airs.com).
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <ansidecl.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <ftw.h>
+#include "myftw.h"
+
+/* Traverse one level of a directory tree.  */
+
+static int
+myftw_dir (DIR **dirs, int level, int descriptors,
+          char *dir, size_t len, 
+          __ftw_func_t func)
+{
+  int got;
+  struct dirent *entry;
+  int d_namlen;
+
+  got = 0;
+
+  errno = 0;
+
+  while ((entry = readdir (dirs[level])) != NULL)
+    {
+      struct stat s;
+      int flag, retval, newlev = 0;
+
+      ++got;
+
+      if (entry->d_name[0] == '.'
+         && (entry->d_name [1] == '\0' ||
+             (entry->d_name [2] == '\0' && entry->d_name[1] == '.')))
+       {
+         errno = 0;
+         continue;
+       }
+
+      d_namlen = strlen (entry->d_name) + 1;
+      if (d_namlen + len > PATH_MAX)
+       {
+#ifdef ENAMETOOLONG
+         errno = ENAMETOOLONG;
+#else
+         errno = ENOMEM;
+#endif
+         return -1;
+       }
+
+      dir[len] = '/';
+      memcpy ((PTR) (dir + len + 1), (PTR) entry->d_name, d_namlen);
+
+      if (lstat (dir, &s) < 0)
+       {
+         /* Following POSIX.1 2.4 ENOENT is returned if the file cannot
+          * be stat'ed.  This can happen for a file returned by readdir
+          * if it's an unresolved symbolic link.  This should be regarded
+          * as an forgivable error.  -- Uli.  */
+         if (errno != EACCES && errno != ENOENT)
+           return -1;
+         flag = FTW_NS;
+       }
+      else if (S_ISDIR (s.st_mode))
+       {
+         newlev = (level + 1) % descriptors;
+
+         if (dirs[newlev] != NULL)
+           closedir (dirs[newlev]);
+
+         dirs[newlev] = opendir (dir);
+         if (dirs[newlev] != NULL)
+           flag = FTW_D;
+         else
+           {
+             if (errno != EACCES)
+               return -1;
+             flag = FTW_DNR;
+           }
+       }
+      else
+       flag = FTW_F;
+
+      retval = (*func) (dir, &s, flag);
+
+      if (flag == FTW_D)
+       {
+         if (retval == 0)
+           retval = myftw_dir (dirs, newlev, descriptors, dir,
+                               d_namlen + len, func);
+         if (dirs[newlev] != NULL)
+           {
+             int save;
+
+             save = errno;
+             closedir (dirs[newlev]);
+             errno = save;
+             dirs[newlev] = NULL;
+           }
+       }
+
+      if (retval != 0)
+       return retval;
+
+      if (dirs[level] == NULL)
+       {
+         int skip;
+
+         dir[len] = '\0';
+         dirs[level] = opendir (dir);
+         if (dirs[level] == NULL)
+           return -1;
+         skip = got;
+         while (skip-- != 0)
+           {
+             errno = 0;
+             if (readdir (dirs[level]) == NULL)
+               return errno == 0 ? 0 : -1;
+           }
+       }
+
+      errno = 0;
+    }
+
+  return errno == 0 ? 0 : -1;
+}
+
+/* Call a function on every element in a directory tree.  */
+
+
+int myftw (const char *dir, __ftw_func_t func, int descriptors)
+{
+  DIR **dirs;
+  size_t len;
+  char buf[PATH_MAX + 1];
+  struct stat s;
+  int flag, retval;
+  int i;
+
+  if (descriptors <= 0)
+    descriptors = 1;
+
+  dirs = (DIR **) __alloca (descriptors * sizeof (DIR *));
+  i = descriptors;
+  while (i-- > 0)
+    dirs[i] = NULL;
+
+  if (lstat (dir, &s) < 0)
+    {
+      /* Following POSIX.1 2.4 ENOENT is returned if the file cannot
+       * be stat'ed.  This can happen for a file returned by readdir
+       * if it's an unresolved symbolic link.  This should be regarded
+       * as an forgivable error.  -- Uli.  */
+      if (errno != EACCES && errno != ENOENT)
+       return -1;
+      flag = FTW_NS;
+    }
+  else if (S_ISDIR (s.st_mode))
+    {
+      dirs[0] = opendir (dir);
+      if (dirs[0] != NULL)
+       flag = FTW_D;
+      else
+       {
+         if (errno != EACCES)
+           return -1;
+         flag = FTW_DNR;
+       }
+    }
+  else
+    flag = FTW_F;
+
+  len = strlen (dir);
+  memcpy ((PTR) buf, (PTR) dir, len + 1);
+
+  retval = (*func) (buf, &s, flag);
+
+  if (flag == FTW_D)
+    {
+      if (retval == 0)
+       retval = myftw_dir (dirs, 0, descriptors, buf, len, func);
+      if (dirs[0] != NULL)
+       {
+         int save;
+
+         save = errno;
+         closedir (dirs[0]);
+         errno = save;
+       }
+    }
+
+  return retval;
+}
diff --git a/build/myftw.h b/build/myftw.h
new file mode 100644 (file)
index 0000000..061feb9
--- /dev/null
@@ -0,0 +1,3 @@
+/* myftw.h -- ftw() using lstat() instead of stat() */
+
+int myftw (const char *dir, __ftw_func_t func, int descriptors);
diff --git a/build/vspec.c b/build/vspec.c
new file mode 100644 (file)
index 0000000..592e61c
--- /dev/null
@@ -0,0 +1,55 @@
+/* Routine to "verify" a parsed spec file */
+
+/***************
+
+Here's what we do
+
+. check for duplicate fields
+. check for duplicate sources/patch numbers
+. make sure a certain set of fields are present
+. in subpackages, make sure a certain set of fields are present
+. in subpackages, make sure certain fields are *not* present
+. do some checking on the field values for legit characters
+
+****************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "header.h"
+#include "spec.h"
+#include "specP.h"
+#include "rpmerr.h"
+#include "messages.h"
+#include "rpmlib.h"
+#include "stringbuf.h"
+#include "misc.h"
+
+#define EMPTY(s) ((!(s)) || (!(*(s))))
+#define OOPS(s) {fprintf(stderr, "verifySpec: %s\n", s); res = 1;}
+
+int checkHeaderDups(Header h)
+{
+    return 0;
+}
+
+int verifySpec(Spec s)
+{
+    int res;
+    struct PackageRec *pr;
+    
+    if (EMPTY(s->name)) {
+       OOPS("No Name field");
+    }
+
+    /* Check each package/subpackage */
+    pr = s->packages;
+    while (pr) {
+       if (checkHeaderDups(pr->header)) {
+           res = 1;
+       }
+       pr = pr->next;
+    }
+    
+    return 0;
+}