]> granicus.if.org Git - sudo/commitdiff
Not all systems have d_namlen
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 22 Apr 2009 20:32:08 +0000 (20:32 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 22 Apr 2009 20:32:08 +0000 (20:32 +0000)
toke.c
toke.l

diff --git a/toke.c b/toke.c
index dd4c67675a862007ef54547d2b8125aa79217c36..c1c86163932381c5db1be1a8b7fa7418dd596b83 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -1372,8 +1372,23 @@ char *yytext;
 #if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS)
 # include <malloc.h>
 #endif /* HAVE_MALLOC_H && !STDC_HEADERS */
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif
 #include <ctype.h>
-#include <dirent.h>
 #include "sudo.h"
 #include "parse.h"
 #include <gram.h>
@@ -1423,7 +1438,7 @@ extern void yyerror               __P((const char *));
 
 #define INSTR 5
 
-#line 1427 "lex.yy.c"
+#line 1442 "lex.yy.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1577,9 +1592,9 @@ YY_DECL
        register char *yy_cp, *yy_bp;
        register int yy_act;
 
-#line 116 "toke.l"
+#line 131 "toke.l"
 
-#line 1583 "lex.yy.c"
+#line 1598 "lex.yy.c"
 
        if ( yy_init )
                {
@@ -1665,12 +1680,12 @@ do_action:      /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 117 "toke.l"
+#line 132 "toke.l"
 BEGIN STARTDEFS;
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 119 "toke.l"
+#line 134 "toke.l"
 {
                            BEGIN INDEFS;
                            LEXTRACE("DEFVAR ");
@@ -1682,7 +1697,7 @@ YY_RULE_SETUP
 
 case 3:
 YY_RULE_SETUP
-#line 128 "toke.l"
+#line 143 "toke.l"
 {
                            BEGIN STARTDEFS;
                            LEXTRACE(", ");
@@ -1691,7 +1706,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 134 "toke.l"
+#line 149 "toke.l"
 {
                            LEXTRACE("= ");
                            return('=');
@@ -1699,7 +1714,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 139 "toke.l"
+#line 154 "toke.l"
 {
                            LEXTRACE("+= ");
                            return('+');
@@ -1707,7 +1722,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 144 "toke.l"
+#line 159 "toke.l"
 {
                            LEXTRACE("-= ");
                            return('-');
@@ -1715,7 +1730,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 149 "toke.l"
+#line 164 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            yylval.string = NULL;
@@ -1724,7 +1739,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 155 "toke.l"
+#line 170 "toke.l"
 {
                            LEXTRACE("WORD(2) ");
                            if (!fill(yytext, yyleng))
@@ -1736,7 +1751,7 @@ YY_RULE_SETUP
 
 case 9:
 YY_RULE_SETUP
-#line 164 "toke.l"
+#line 179 "toke.l"
 {
                            /* Line continuation char followed by newline. */
                            ++sudolineno;
@@ -1745,7 +1760,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 170 "toke.l"
+#line 185 "toke.l"
 {
                            LEXTRACE("ENDSTR ");
                            BEGIN INDEFS;
@@ -1754,7 +1769,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 176 "toke.l"
+#line 191 "toke.l"
 {
                            LEXTRACE("BACKSLASH ");
                            if (!append(yytext, yyleng))
@@ -1763,7 +1778,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 182 "toke.l"
+#line 197 "toke.l"
 {
                            LEXTRACE("STRBODY ");
                            if (!append(yytext, yyleng))
@@ -1774,7 +1789,7 @@ YY_RULE_SETUP
 
 case 13:
 YY_RULE_SETUP
-#line 190 "toke.l"
+#line 205 "toke.l"
 {
                            /* quoted fnmatch glob char, pass verbatim */
                            LEXTRACE("QUOTEDCHAR ");
@@ -1785,7 +1800,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 198 "toke.l"
+#line 213 "toke.l"
 {
                            /* quoted sudoers special char, strip backslash */
                            LEXTRACE("QUOTEDCHAR ");
@@ -1796,7 +1811,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 206 "toke.l"
+#line 221 "toke.l"
 {
                            BEGIN INITIAL;
                            yyless(0);
@@ -1805,7 +1820,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 212 "toke.l"
+#line 227 "toke.l"
 {
                            LEXTRACE("ARG ");
                            if (!fill_args(yytext, yyleng, sawspace))
@@ -1816,7 +1831,7 @@ YY_RULE_SETUP
 
 case 17:
 YY_RULE_SETUP
-#line 220 "toke.l"
+#line 235 "toke.l"
 {
                            char *path;
 
@@ -1832,7 +1847,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 233 "toke.l"
+#line 248 "toke.l"
 {
                            char *path;
 
@@ -1848,7 +1863,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 246 "toke.l"
+#line 261 "toke.l"
 {
                            int n;
                            for (n = 0; isblank((unsigned char)yytext[n]); n++)
@@ -1880,7 +1895,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 275 "toke.l"
+#line 290 "toke.l"
 {
                            int n;
                            for (n = 0; isblank((unsigned char)yytext[n]); n++)
@@ -1903,7 +1918,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 295 "toke.l"
+#line 310 "toke.l"
 {
                                /* cmnd does not require passwd for this user */
                                LEXTRACE("NOPASSWD ");
@@ -1912,7 +1927,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 301 "toke.l"
+#line 316 "toke.l"
 {
                                /* cmnd requires passwd for this user */
                                LEXTRACE("PASSWD ");
@@ -1921,7 +1936,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 307 "toke.l"
+#line 322 "toke.l"
 {
                                LEXTRACE("NOEXEC ");
                                return(NOEXEC);
@@ -1929,7 +1944,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 312 "toke.l"
+#line 327 "toke.l"
 {
                                LEXTRACE("EXEC ");
                                return(EXEC);
@@ -1937,7 +1952,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 317 "toke.l"
+#line 332 "toke.l"
 {
                                LEXTRACE("SETENV ");
                                return(SETENV);
@@ -1945,7 +1960,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 322 "toke.l"
+#line 337 "toke.l"
 {
                                LEXTRACE("NOSETENV ");
                                return(NOSETENV);
@@ -1953,7 +1968,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 327 "toke.l"
+#line 342 "toke.l"
 {
                            /* netgroup */
                            if (!fill(yytext, yyleng))
@@ -1964,7 +1979,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 335 "toke.l"
+#line 350 "toke.l"
 {
                            /* UN*X group */
                            if (!fill(yytext, yyleng))
@@ -1975,7 +1990,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 343 "toke.l"
+#line 358 "toke.l"
 {
                            if (!fill(yytext, yyleng))
                                yyterminate();
@@ -1985,7 +2000,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 350 "toke.l"
+#line 365 "toke.l"
 {
                            if (!fill(yytext, yyleng))
                                yyterminate();
@@ -1995,7 +2010,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 357 "toke.l"
+#line 372 "toke.l"
 {
                            if (!ipv6_valid(yytext)) {
                                LEXTRACE("ERROR ");
@@ -2009,7 +2024,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 368 "toke.l"
+#line 383 "toke.l"
 {
                            if (!ipv6_valid(yytext)) {
                                LEXTRACE("ERROR ");
@@ -2023,7 +2038,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 379 "toke.l"
+#line 394 "toke.l"
 {
                            if (strcmp(yytext, "ALL") == 0) {
                                LEXTRACE("ALL ");
@@ -2048,7 +2063,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 401 "toke.l"
+#line 416 "toke.l"
 {
                            /* no command args allowed for Defaults!/path */
                            if (!fill_cmnd(yytext, yyleng))
@@ -2059,7 +2074,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 409 "toke.l"
+#line 424 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -2069,7 +2084,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 416 "toke.l"
+#line 431 "toke.l"
 {
                            /* directories can't have args... */
                            if (yytext[yyleng - 1] == '/') {
@@ -2087,7 +2102,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 431 "toke.l"
+#line 446 "toke.l"
 {
                            /* a word */
                            if (!fill(yytext, yyleng))
@@ -2098,7 +2113,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 439 "toke.l"
+#line 454 "toke.l"
 {
                            LEXTRACE("( ");
                            return ('(');
@@ -2106,7 +2121,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 444 "toke.l"
+#line 459 "toke.l"
 {
                            LEXTRACE(") ");
                            return(')');
@@ -2114,7 +2129,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 449 "toke.l"
+#line 464 "toke.l"
 {
                            LEXTRACE(", ");
                            return(',');
@@ -2122,7 +2137,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 454 "toke.l"
+#line 469 "toke.l"
 {
                            LEXTRACE("= ");
                            return('=');
@@ -2130,7 +2145,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 459 "toke.l"
+#line 474 "toke.l"
 {
                            LEXTRACE(": ");
                            return(':');
@@ -2138,7 +2153,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 464 "toke.l"
+#line 479 "toke.l"
 {
                            if (yyleng % 2 == 1)
                                return('!');    /* return '!' */
@@ -2146,7 +2161,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 469 "toke.l"
+#line 484 "toke.l"
 {
                            BEGIN INITIAL;
                            ++sudolineno;
@@ -2156,14 +2171,14 @@ YY_RULE_SETUP
        YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 476 "toke.l"
+#line 491 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = TRUE;    /* but remember for fill_args */
                        }
        YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 480 "toke.l"
+#line 495 "toke.l"
 {
                            sawspace = TRUE;    /* remember for fill_args */
                            ++sudolineno;
@@ -2172,7 +2187,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 486 "toke.l"
+#line 501 "toke.l"
 {
                            BEGIN INITIAL;
                            ++sudolineno;
@@ -2182,7 +2197,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 493 "toke.l"
+#line 508 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            return(ERROR);
@@ -2194,7 +2209,7 @@ case YY_STATE_EOF(GOTCMND):
 case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):
-#line 498 "toke.l"
+#line 513 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -2207,10 +2222,10 @@ case YY_STATE_EOF(INSTR):
        YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 508 "toke.l"
+#line 523 "toke.l"
 ECHO;
        YY_BREAK
-#line 2214 "lex.yy.c"
+#line 2229 "lex.yy.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -3099,7 +3114,7 @@ int main()
        return 0;
        }
 #endif
-#line 508 "toke.l"
+#line 523 "toke.l"
 
 static int
 _fill(src, len, olen)
@@ -3259,7 +3274,7 @@ switch_dir(stack, dirpath)
     }
     while ((dent = readdir(dir))) {
        /* Ignore files that end in '~' or have a '.' in them. */
-       if (dent->d_namlen == 0 || dent->d_name[dent->d_namlen - 1] == '~'
+       if (dent->d_name[0] == '\0' || dent->d_name[NAMLEN(dent) - 1] == '~'
            || strchr(dent->d_name, '.') != NULL) {
            continue;
        }
diff --git a/toke.l b/toke.l
index cc18cec9c4c819aa84e40ec3b16437967800163a..ae22ee90921374ac9eae41020d9a9daece437dae 100644 (file)
--- a/toke.l
+++ b/toke.l
 #if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS)
 # include <malloc.h>
 #endif /* HAVE_MALLOC_H && !STDC_HEADERS */
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif
 #include <ctype.h>
-#include <dirent.h>
 #include "sudo.h"
 #include "parse.h"
 #include <gram.h>
@@ -664,7 +679,7 @@ switch_dir(stack, dirpath)
     }
     while ((dent = readdir(dir))) {
        /* Ignore files that end in '~' or have a '.' in them. */
-       if (dent->d_namlen == 0 || dent->d_name[dent->d_namlen - 1] == '~'
+       if (dent->d_name[0] == '\0' || dent->d_name[NAMLEN(dent) - 1] == '~'
            || strchr(dent->d_name, '.') != NULL) {
            continue;
        }