summaryrefslogtreecommitdiffstats
path: root/usr.bin/ncftp/glob.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/ncftp/glob.c')
-rw-r--r--usr.bin/ncftp/glob.c655
1 files changed, 0 insertions, 655 deletions
diff --git a/usr.bin/ncftp/glob.c b/usr.bin/ncftp/glob.c
deleted file mode 100644
index b0f31d1..0000000
--- a/usr.bin/ncftp/glob.c
+++ /dev/null
@@ -1,655 +0,0 @@
-/* glob.c */
-
-/* $RCSfile: glob.c,v $
- * $Revision: 14020.11 $
- * $Date: 93/05/21 05:44:32 $
- */
-
-#include "sys.h"
-
-#include <sys/stat.h>
-
-/* Dir.h. Try <sys/dir.h> (add -DSYSDIRH) if <dirent.h> doesn't exist. */
-
-#ifndef SYSDIRH
-# include <dirent.h>
-#else
-# include <sys/dir.h>
-#endif
-
-#ifdef SCO324
-# define direct dirent
-#endif
-
-#include <errno.h>
-#include <pwd.h>
-#include "util.h"
-#include "glob.h"
-#include "cmds.h"
-#include "copyright.h"
-
-#ifndef NCARGS
-# define NCARGS 4096 /* # characters in exec arglist */
-#endif
-
-#define L_CURLY '{'
-#define R_CURLY '}'
-
-#define QUOTE 0200
-#define TRIM 0177
-#define eq(a,b) (strcmp(a, b)==0)
-#define GAVSIZ (NCARGS/6)
-#define isdir(d) ((d.st_mode & S_IFMT) == S_IFDIR)
-
-static void ginit(char **agargv);
-static void collect(char *as);
-static void acollect(char *as);
-static void sort(void);
-static void expand(char *as);
-static void matchdir(char *pattern);
-static int execbrc(char *p, char *s);
-static match(char *s, char *p);
-static amatch(char *s, char *p);
-#if UNUSED
-static Gmatch(char *s, char *p);
-#endif
-static void Gcat(char *s1, char *s2);
-static void addpath(char c);
-static void rscan(char **t, int (*f )(char));
-static tglob(char c);
-static char *strspl(char *cp, char *dp);
-static char *strend(char *cp);
-
-static char **gargv; /* Pointer to the (stack) arglist */
-static int gargc; /* Number args in gargv */
-static int gnleft;
-static short gflag;
-char *globerr;
-char *home; /* you must initialize this elsewhere! */
-extern int errno;
-
-static int globcnt;
-
-char *globchars = "`{[*?";
-
-static char *gpath, *gpathp, *lastgpathp;
-static int globbed;
-static char *entp;
-static char **sortbas;
-
-char **
-glob(char *v)
-{
- char agpath[BUFSIZ];
- char *agargv[GAVSIZ];
- char *vv[2];
- vv[0] = v;
- vv[1] = 0;
- gflag = (short) 0;
- rscan(vv, tglob);
- if (gflag == (short) 0)
- return (copyblk(vv));
-
- globerr = 0;
- gpath = agpath; gpathp = gpath; *gpathp = 0;
- lastgpathp = &gpath[sizeof agpath - 2];
- ginit(agargv); globcnt = 0;
- collect(v);
- if (globcnt == 0 && (gflag & (short)1)) {
- blkfree(gargv), gargv = 0;
- return (0);
- } else
- return (gargv = copyblk(gargv));
-}
-
-static
-void ginit(char **agargv)
-{
- agargv[0] = 0; gargv = agargv; sortbas = agargv; gargc = 0;
- gnleft = NCARGS - 4;
-}
-
-static
-void collect(char *as)
-{
- if (eq(as, "{") || eq(as, "{}")) {
- Gcat(as, "");
- sort();
- } else
- acollect(as);
-}
-
-static
-void acollect(char *as)
-{
- register int ogargc = gargc;
-
- gpathp = gpath; *gpathp = 0; globbed = 0;
- expand(as);
- if (gargc != ogargc)
- sort();
-}
-
-static
-void sort(void)
-{
- register char **p1, **p2, *c;
- char **Gvp = &gargv[gargc];
-
- p1 = sortbas;
- while (p1 < Gvp-1) {
- p2 = p1;
- while (++p2 < Gvp)
- if (strcmp(*p1, *p2) > 0)
- c = *p1, *p1 = *p2, *p2 = c;
- p1++;
- }
- sortbas = Gvp;
-}
-
-static
-void expand(char *as)
-{
- register char *cs;
- register char *sgpathp, *oldcs;
- struct stat stb;
-
- sgpathp = gpathp;
- cs = as;
- if (*cs == '~' && gpathp == gpath) {
- addpath('~');
- for (cs++; letter(*cs) || digit(*cs) || *cs == '-';)
- addpath(*cs++);
- if (!*cs || *cs == '/') {
- if (gpathp != gpath + 1) {
- *gpathp = 0;
- if (gethdir(gpath + 1))
- globerr = "Unknown user name after ~";
- (void) strcpy(gpath, gpath + 1);
- } else
- (void) strcpy(gpath, home);
- gpathp = strend(gpath);
- }
- }
- while (!any(*cs, globchars)) {
- if (*cs == 0) {
- if (!globbed)
- Gcat(gpath, "");
- else if (stat(gpath, &stb) >= 0) {
- Gcat(gpath, "");
- globcnt++;
- }
- goto endit;
- }
- addpath(*cs++);
- }
- oldcs = cs;
- while (cs > as && *cs != '/')
- cs--, gpathp--;
- if (*cs == '/')
- cs++, gpathp++;
- *gpathp = 0;
- if (*oldcs == L_CURLY) {
- (void) execbrc(cs, ((char *)0));
- return;
- }
- matchdir(cs);
-endit:
- gpathp = sgpathp;
- *gpathp = 0;
-}
-
-static
-void matchdir(char *pattern)
-{
- struct stat stb;
-#ifdef SYSDIRH
- register struct direct *dp;
-#else
- register struct dirent *dp;
-#endif
- DIR *dirp;
-
- dirp = opendir((*gpath ? gpath : "."));
- if (dirp == NULL) {
- if (globbed)
- return;
- goto patherr2;
- }
- if (fstat(dirp->dd_fd, &stb) < 0)
- goto patherr1;
- if (!isdir(stb)) {
- errno = ENOTDIR;
- goto patherr1;
- }
- while ((dp = readdir(dirp)) != NULL) {
- if (dp->d_ino == 0)
- continue;
- if (match(dp->d_name, pattern)) {
- Gcat(gpath, dp->d_name);
- globcnt++;
- }
- }
- (void) closedir(dirp);
- return;
-
-patherr1:
- (void) closedir(dirp);
-patherr2:
- globerr = "Bad directory components";
-}
-
-static
-int execbrc(char *p, char *s)
-{
- char restbuf[BUFSIZ + 2];
- register char *pe, *pm, *pl;
- int brclev = 0;
- char *lm, savec, *sgpathp;
-
- for (lm = restbuf; *p != L_CURLY; *lm++ = *p++)
- continue;
- for (pe = ++p; *pe; pe++)
- switch (*pe) {
-
- case L_CURLY:
- brclev++;
- continue;
-
- case R_CURLY:
- if (brclev == 0)
- goto pend;
- brclev--;
- continue;
-
- case '[':
- for (pe++; *pe && *pe != ']'; pe++)
- continue;
- continue;
- }
-pend:
- brclev = 0;
- for (pl = pm = p; pm <= pe; pm++)
- switch (*pm & (QUOTE|TRIM)) {
-
- case L_CURLY:
- brclev++;
- continue;
-
- case R_CURLY:
- if (brclev) {
- brclev--;
- continue;
- }
- goto doit;
-
- case ','|QUOTE:
- case ',':
- if (brclev)
- continue;
-doit:
- savec = *pm;
- *pm = 0;
- (void) strcpy(lm, pl);
- (void) strcat(restbuf, pe + 1);
- *pm = savec;
- if (s == 0) {
- sgpathp = gpathp;
- expand(restbuf);
- gpathp = sgpathp;
- *gpathp = 0;
- } else if (amatch(s, restbuf))
- return (1);
- sort();
- pl = pm + 1;
- if (brclev)
- return (0);
- continue;
-
- case '[':
- for (pm++; *pm && *pm != ']'; pm++)
- continue;
- if (!*pm)
- pm--;
- continue;
- }
- if (brclev)
- goto doit;
- return (0);
-}
-
-static
-int match(char *s, char *p)
-{
- register int c;
- register char *sentp;
- char sglobbed = globbed;
-
- if (*s == '.' && *p != '.')
- return (0);
- sentp = entp;
- entp = s;
- c = amatch(s, p);
- entp = sentp;
- globbed = sglobbed;
- return (c);
-}
-
-static
-int amatch(char *s, char *p)
-{
- register int scc;
- int ok, lc;
- char *sgpathp;
- struct stat stb;
- int c, cc;
-
- globbed = 1;
- for (;;) {
- scc = *s++ & TRIM;
- switch (c = *p++) {
-
- case L_CURLY:
- return (execbrc(p - 1, s - 1));
-
- case '[':
- ok = 0;
- lc = 077777;
- while ((cc = *p++) != '\0') {
- if (cc == ']') {
- if (ok)
- break;
- return (0);
- }
- if (cc == '-') {
- if (lc <= scc && scc <= *p++)
- ok++;
- } else
- if (scc == (lc = cc))
- ok++;
- }
- if (cc == 0)
- if (ok)
- p--;
- else
- return 0;
- continue;
-
- case '*':
- if (!*p)
- return (1);
- if (*p == '/') {
- p++;
- goto slash;
- }
- s--;
- do {
- if (amatch(s, p))
- return (1);
- } while (*s++);
- return (0);
-
- case 0:
- return (scc == 0);
-
- default:
- if (c != scc)
- return (0);
- continue;
-
- case '?':
- if (scc == 0)
- return (0);
- continue;
-
- case '/':
- if (scc)
- return (0);
-slash:
- s = entp;
- sgpathp = gpathp;
- while (*s)
- addpath(*s++);
- addpath('/');
- if (stat(gpath, &stb) == 0 && isdir(stb))
- if (*p == 0) {
- Gcat(gpath, "");
- globcnt++;
- } else
- expand(p);
- gpathp = sgpathp;
- *gpathp = 0;
- return (0);
- }
- }
-}
-
-#if UNUSED
-static
-Gmatch(char *s, char *p)
-{
- register int scc;
- int ok, lc;
- int c, cc;
-
- for (;;) {
- scc = *s++ & TRIM;
- switch (c = *p++) {
-
- case '[':
- ok = 0;
- lc = 077777;
- while (cc = *p++) {
- if (cc == ']') {
- if (ok)
- break;
- return (0);
- }
- if (cc == '-') {
- if (lc <= scc && scc <= *p++)
- ok++;
- } else
- if (scc == (lc = cc))
- ok++;
- }
- if (cc == 0)
- if (ok)
- p--;
- else
- return 0;
- continue;
-
- case '*':
- if (!*p)
- return (1);
- for (s--; *s; s++)
- if (Gmatch(s, p))
- return (1);
- return (0);
-
- case 0:
- return (scc == 0);
-
- default:
- if ((c & TRIM) != scc)
- return (0);
- continue;
-
- case '?':
- if (scc == 0)
- return (0);
- continue;
-
- }
- }
-}
-#endif
-
-static
-void Gcat(char *s1, char *s2)
-{
- register int len = strlen(s1) + strlen(s2) + 1;
-
- if (len >= gnleft || gargc >= GAVSIZ - 1)
- globerr = "Arguments too long";
- else {
- gargc++;
- gnleft -= len;
- gargv[gargc] = 0;
- gargv[gargc - 1] = strspl(s1, s2);
- }
-}
-
-static
-void addpath(char c)
-{
-
- if (gpathp >= lastgpathp)
- globerr = "Pathname too long";
- else {
- *gpathp++ = c;
- *gpathp = 0;
- }
-}
-
-static
-void rscan(char **t, int (*f )(char))
-{
- register char *p, c;
-
- while ((p = *t++) != 0) {
- if (f == tglob)
- if (*p == '~')
- gflag |= (short) 2;
- else if (eq(p, "{") || eq(p, "{}"))
- continue;
- while ((c = *p++) != '\0')
- (*f)(c);
- }
-}
-/*
-static
-scan(t, f)
- register char **t;
- int (*f)(char);
-{
- register char *p, c;
-
- while (p = *t++)
- while (c = *p)
- *p++ = (*f)(c);
-} */
-
-static
-int tglob(char c)
-{
-
- if (any(c, globchars))
- gflag |= (c == L_CURLY ? (short)2 : (short)1);
- return (c);
-}
-/*
-static
-trim(c)
- char c;
-{
-
- return (c & TRIM);
-} */
-
-
-int letter(char c)
-{
- return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_');
-}
-
-int digit(char c)
-{
- return (c >= '0' && c <= '9');
-}
-
-int any(int c, char *s)
-{
- while (*s)
- if (*s++ == c)
- return(1);
- return(0);
-}
-
-int blklen(char **av)
-{
- register int i = 0;
-
- while (*av++)
- i++;
- return (i);
-}
-
-char **
-blkcpy(char **oav, char **bv)
-{
- register char **av = oav;
-
- while ((*av++ = *bv++) != 0)
- continue;
- return (oav);
-}
-
-void blkfree(char **av0)
-{
- register char **av = av0;
-
- while (*av)
- free(*av++);
-}
-
-static
-char *
-strspl(char *cp, char *dp)
-{
- register char *ep = (char *) malloc((size_t)(strlen(cp) + strlen(dp) + 1L));
-
- if (ep == (char *)0)
- fatal("Out of memory");
- (void) strcpy(ep, cp);
- (void) strcat(ep, dp);
- return (ep);
-}
-
-char **
-copyblk(char **v)
-{
- register char **nv = (char **)malloc((size_t)((blklen(v) + 1) *
- sizeof(char **)));
- if (nv == (char **)0)
- fatal("Out of memory");
-
- return (blkcpy(nv, v));
-}
-
-static
-char *
-strend(char *cp)
-{
- while (*cp)
- cp++;
- return (cp);
-}
-
-/*
- * Extract a home directory from the password file
- * The argument points to a buffer where the name of the
- * user whose home directory is sought is currently.
- * We write the home directory of the user back there.
- */
-int gethdir(char *home_dir)
-{
- register struct passwd *pp = getpwnam(home_dir);
-
- if (pp == 0)
- return (1);
- (void) strcpy(home_dir, pp->pw_dir);
- return (0);
-} /* gethdir */
-
-/* eof glob.c */
OpenPOWER on IntegriCloud