summaryrefslogtreecommitdiffstats
path: root/isys/minifind.c
diff options
context:
space:
mode:
authorJeremy Katz <katzj@redhat.com>2002-10-23 16:40:35 +0000
committerJeremy Katz <katzj@redhat.com>2002-10-23 16:40:35 +0000
commitab76ae268d8b78cad2f71908770e4b967e29ed37 (patch)
treef153fdfb3e99c6e075f47628172a7d9beb63c502 /isys/minifind.c
parent28a42efbdbc9bcf42a4b749b4636664dd3fa7ccd (diff)
downloadanaconda-ab76ae268d8b78cad2f71908770e4b967e29ed37.tar.gz
anaconda-ab76ae268d8b78cad2f71908770e4b967e29ed37.tar.xz
anaconda-ab76ae268d8b78cad2f71908770e4b967e29ed37.zip
* build with diet on ppc
* support for determining smp for pSeries and mac patches from dan burcaw (dburcaw@terrasoftsolutions.com)
Diffstat (limited to 'isys/minifind.c')
-rw-r--r--isys/minifind.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/isys/minifind.c b/isys/minifind.c
new file mode 100644
index 000000000..9da9f62ef
--- /dev/null
+++ b/isys/minifind.c
@@ -0,0 +1,79 @@
+/* minifind.c -- simple find library
+ *
+ * Copyright (c) 2002 Terra Soft Solutions, Inc.
+ * Written by Dan Burcaw <dburcaw@terrasoftsolutions.com>
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * library public license.
+ *
+ * You should have received a copy of the GNU Library Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "minifind.h"
+
+// insert a node at head of linked-list
+void insert_node(struct pathNode *n, char *path)
+{
+ struct pathNode *new = (struct pathNode *) malloc(sizeof(struct pathNode));
+ new->path = path;
+ new->next = n->next;
+ n->next = new;
+}
+
+// return input strip less last character
+char *stripLastChar(char *in)
+{
+ int i;
+
+ char *out = malloc(sizeof(char)*strlen(in));
+ snprintf(out, strlen(in) - 1, "%s", in);
+ return out;
+}
+
+// do the work
+char *minifind(char *dir, char *search, struct findNode *list)
+{
+ char *d = NULL;
+ int n;
+ struct dirent **namelist;
+ struct stat buf;
+
+ if (dir[strlen(dir)-1] == '/')
+ dir = stripLastChar(dir);
+
+ // check is there is an exact filematch to dir
+ // when search is not specified
+ if (search == NULL)
+ {
+ if (lstat(dir, &buf) == 0)
+ insert_node(list->result, dir);
+ return 0;
+ }
+
+ n = scandir(dir, &namelist, 0, alphasort);
+ if (n >= 0)
+ {
+ while (n--)
+ {
+ d = malloc(sizeof(char) * (strlen(dir) \
+ + strlen(namelist[n]->d_name)+1));
+ sprintf(d, "%s/%s", dir, namelist[n]->d_name);
+ if (strstr(namelist[n]->d_name, search))
+ insert_node(list->result, d);
+
+ if ((lstat(d, &buf) == 0) && S_ISDIR(buf.st_mode))
+ {
+ if (strcmp(namelist[n]->d_name, ".") &&
+ strcmp(namelist[n]->d_name, ".."))
+ d = minifind(d, search, list);
+ }
+ free(namelist[n]);
+ }
+ free(namelist);
+ return d;
+ }
+ return 0;
+}