]> git.pld-linux.org Git - packages/shadow.git/blob - shadow-selinux.patch
- release 3
[packages/shadow.git] / shadow-selinux.patch
1 --- shadow-4.0.3.orig/lib/prototypes.h
2 +++ shadow-4.0.3/lib/prototypes.h
3 @@ -37,6 +37,10 @@
4  extern int isexpired(const struct passwd *);
5  #endif
6  
7 +#ifdef CONFIG_FLASK
8 +#include <linux/flask/flask_types.h>
9 +#endif
10 +
11  /* basename() renamed to Basename() to avoid libc name space confusion */
12  /* basename.c */
13  extern char *Basename(char *str);
14 @@ -48,7 +52,11 @@
15  extern int chown_tree(const char *, uid_t, uid_t, gid_t, gid_t);
16  
17  /* chowntty.c */
18 -extern void chown_tty(const char *, const struct passwd *);
19 +extern void chown_tty(const char *, const struct passwd *
20 +#ifdef CONFIG_FLASK
21 +, int FLASK_flag, security_id_t user_sid, security_id_t *ttyn_sid
22 +#endif
23 +);
24  
25  /* console.c */
26  extern int console(const char *);
27 @@ -179,8 +187,16 @@
28  /* setupenv.c */
29  extern void setup_env(struct passwd *);
30  
31 +#ifdef CONFIG_FLASK
32 +#include <linux/flask/flask_types.h>
33 +#endif
34 +
35  /* shell.c */
36 -extern void shell(const char *, const char *);
37 +extern void shell(const char *, const char *
38 +#ifdef CONFIG_FLASK
39 +  , int FLASK_flag, security_id_t user_sid
40 +#endif
41 + );
42  
43  #ifdef SHADOWPWD
44  /* spdbm.c */
45 --- shadow-4.0.3.orig/src/su.c
46 +++ shadow-4.0.3/src/su.c
47 @@ -49,6 +49,7 @@
48  #include <grp.h>
49  #include <signal.h>
50  #include <pwd.h>
51 +#include <getopt.h>
52  #include "pwauth.h"
53  #include "getdef.h"
54  
55 @@ -79,6 +80,18 @@
56  
57  /* local function prototypes */
58  
59 +/* If nonzero, change some environment vars to indicate the user su'd to.  */
60 +static int change_environment;
61 +
62 +static struct option const longopts[] =
63 +{
64 +  {"command", required_argument, 0, 'c'},
65 +  {"preserve-environment", no_argument, 0, 'p'},
66 +  {"shell", required_argument, 0, 's'},
67 +  {"help", no_argument, 0, 'h'},
68 +  {0, 0, 0, 0}
69 +};
70 +
71  #ifndef USE_PAM
72  
73  static RETSIGTYPE die (int);
74 @@ -118,6 +131,96 @@
75  }
76  #endif                         /* !USE_PAM */
77  
78 +/* borrowed from GNU sh-utils' "su.c" */
79 +static int
80 +restricted_shell (const char *shell)
81 +{
82 +       char *line;
83 +
84 +       setusershell ();
85 +       while ((line = getusershell ()) != NULL) {
86 +               if (*line != '#' && strcmp (line, shell) == 0) {
87 +                       endusershell ();
88 +                       return 0;
89 +               }
90 +       }
91 +       endusershell ();
92 +       return 1;
93 +}
94 +
95 +/* borrowed from GNU sh-utils' "su.c" */
96 +static int
97 +elements (char **arr)
98 +{
99 +  int n = 0;
100 +
101 +  for (n = 0; *arr; ++arr)
102 +    ++n;
103 +  return n;
104 +}
105 +
106 +/* borrowed from GNU sh-utils' "su.c" */
107 +static void
108 +run_shell (char *shell, const char *command, char **additional_args, int login)
109 +{
110 +  const char **args;
111 +  int argno = 1;
112 +  char cmd[BUFSIZ];
113 +  int cmd_len_left = sizeof(cmd) - 1;
114 +
115 +  cmd[0] = '\0';
116 +
117 +  if (additional_args)
118 +    args = (const char **) xmalloc (sizeof (char *)
119 +                                    * (10 + elements (additional_args)));
120 +  else
121 +    args = (const char **) xmalloc (sizeof (char *) * 10);
122 +
123 +  if (login)
124 +    {
125 +      char *arg0;
126 +      char *shell_basename;
127 +
128 +      shell_basename = getdef_str("SU_NAME");
129 +      if (!shell_basename)
130 +       shell_basename = Basename(shell);
131 +
132 +      arg0 = xmalloc (strlen (shell_basename) + 2);
133 +      arg0[0] = '-';
134 +      strcpy (arg0 + 1, shell_basename);
135 +      args[0] = arg0;
136 +    }
137 +  else
138 +    args[0] = Basename(shell);
139 +  if (command || additional_args)
140 +    args[argno++] = "-c";
141 +  if (command) {
142 +    if (strlen(command) > cmd_len_left) {
143 +      fprintf(stderr, _("Command line args too long\n"));
144 +      exit(1);
145 +    }
146 +    strcat(cmd, command);
147 +    cmd_len_left -= strlen(command);
148 +  }
149 +  if (additional_args)
150 +    for (; *additional_args; ++additional_args) {
151 +      if ((strlen(*additional_args) + 1) > cmd_len_left) {
152 +       fprintf(stderr, _("Command line args too long\n"));
153 +       exit(1);
154 +      }
155 +      if (cmd[0]) {
156 +       strcat(cmd, " ");
157 +       cmd_len_left--;
158 +      }
159 +      strcat(cmd, *additional_args);
160 +      cmd_len_left -= strlen(*additional_args);
161 +    }
162 +  if (cmd[0]) args[argno++] = cmd;
163 +  args[argno] = NULL;
164 +  execv (shell, (char **) args);
165 +  fprintf (stderr, _("No shell\n"));
166 +  SYSLOG((LOG_WARN, "Cannot execute %s\n", shell));
167 +}
168  
169  static void su_failure (const char *tty)
170  {
171 @@ -153,13 +256,14 @@
172  {
173         char *cp;
174         const char *tty = 0;    /* Name of tty SU is run from        */
175 -       int doshell = 0;
176         int fakelogin = 0;
177         int amroot = 0;
178         uid_t my_uid;
179         struct passwd *pw = 0;
180         char **envp = environ;
181 -
182 +       char *command = 0, *shell = 0, **additional_args = 0;
183 +       int optc;
184 +       char *tmp_name;
185  #ifdef USE_PAM
186         int ret;
187  #else                          /* !USE_PAM */
188 @@ -174,12 +278,14 @@
189  #endif
190  #endif                         /* !USE_PAM */
191  
192 -       sanitize_env ();
193 +       /* sanitize_env (); */
194  
195         setlocale (LC_ALL, "");
196         bindtextdomain (PACKAGE, LOCALEDIR);
197         textdomain (PACKAGE);
198  
199 +       change_environment = 1;
200 +
201         /*
202          * Get the program name. The program name is used as a prefix to
203          * most error messages.
204 @@ -224,14 +330,66 @@
205          * Process the command line arguments. 
206          */
207  
208 -       argc--;
209 -       argv++;                 /* shift out command name */
210 -
211 -       if (argc > 0 && strcmp (argv[0], "-") == 0) {
212 +       while ((optc = getopt_long (argc, argv, "c:mps:h", longopts, NULL)) != -1) {
213 +               switch (optc) {
214 +                   case 0:
215 +                       break;
216 +                   case 'c':
217 +                       command = optarg;
218 +                       break;
219 +                   case 'm':
220 +                   case 'p':
221 +                       change_environment = 0;
222 +                       break;
223 +                   case 's':
224 +                       shell = optarg;
225 +                       break;
226 +                   default:
227 +                       fprintf(stderr, _("\
228 +Usage: su [OPTS] [-] [username [ARGS]]\n\
229 +       -       make this a login shell\n\
230 +       -c, --command=<command>\n\
231 +               pass command to the invoked shell using its -c\n\
232 +               option\n\
233 +       -m, -p, --preserve-environment\n\
234 +               do not reset environment variables, and keep the\n\
235 +               same shell\n\
236 +       -s, --shell=<shell>\n\
237 +               use shell instead of the default in /etc/passwd\n"));
238 +                       exit(1);
239 +               }
240 +       }
241 +       
242 +        if (optind < argc && !strcmp (argv[optind], "-")) {
243                 fakelogin = 1;
244 -               argc--;
245 -               argv++;         /* shift ... */
246 +               ++optind;
247 +       }
248 +
249 +       if (optind < argc)
250 +               strncpy(name, argv[optind++], sizeof(name) - 1);
251 +       else {
252 +               struct passwd *root_pw = getpwuid(0);
253 +               if (root_pw == NULL) {
254 +                 SYSLOG((LOG_CRIT, "There is no UID 0 user."));
255 +                 su_failure(tty);
256 +               }
257 +                strcpy(name, root_pw->pw_name);
258 +       }
259 +
260 +       if (optind < argc)
261 +               additional_args = argv + optind;
262 +
263 +       /*
264 +        * Get the user's real name.  The current UID is used to determine
265 +        * who has executed su.  That user ID must exist.
266 +        */
267 +
268 +       pw = get_my_pwent();
269 +       if (!pw) {
270 +               SYSLOG((LOG_CRIT, "Unknown UID: %d\n", (int) my_uid));
271 +               su_failure(tty);
272         }
273 +       STRFCPY(oldname, pw->pw_name);
274  
275         /*
276          * If a new login is being set up, the old environment will be
277 @@ -257,35 +415,6 @@
278                         addenv (*envp++, NULL);
279         }
280  
281 -       /*
282 -        * The next argument must be either a user ID, or some flag to a
283 -        * subshell. Pretty sticky since you can't have an argument which
284 -        * doesn't start with a "-" unless you specify the new user name.
285 -        * Any remaining arguments will be passed to the user's login shell.
286 -        */
287 -
288 -       if (argc > 0 && argv[0][0] != '-') {
289 -               STRFCPY (name, argv[0]);        /* use this login id */
290 -               argc--;
291 -               argv++;         /* shift ... */
292 -       }
293 -       if (!name[0])           /* use default user ID */
294 -               (void) strcpy (name, "root");
295 -
296 -       doshell = argc == 0;    /* any arguments remaining? */
297 -
298 -       /*
299 -        * Get the user's real name. The current UID is used to determine
300 -        * who has executed su. That user ID must exist.
301 -        */
302 -
303 -       pw = get_my_pwent ();
304 -       if (!pw) {
305 -               SYSLOG ((LOG_CRIT, "Unknown UID: %u", my_uid));
306 -               su_failure (tty);
307 -       }
308 -       STRFCPY (oldname, pw->pw_name);
309 -
310  #ifndef USE_PAM
311  #ifdef SU_ACCESS
312         /*
313 @@ -399,9 +528,17 @@
314          * Set the default shell.
315          */
316  
317 -       if (pwent.pw_shell[0] == '\0')
318 -               pwent.pw_shell = "/bin/sh";     /* XXX warning: const */
319 +       if (pwent.pw_shell == NULL || pwent.pw_shell[0] == '\0')
320 +               pwent.pw_shell = (char *) "/bin/sh";
321  
322 +       if (shell == 0 && change_environment == 0)
323 +               shell = getenv ("SHELL");
324 +       if (shell != 0 && getuid () && restricted_shell (pwent.pw_shell))
325 +               shell = 0;
326 +       if (shell == 0)
327 +       shell = (char *) strdup (pwent.pw_shell);
328 +
329 +       signal(SIGINT, SIG_IGN);
330  #ifdef USE_PAM
331         ret = pam_authenticate (pamh, 0);
332         if (ret != PAM_SUCCESS) {
333 @@ -427,6 +564,14 @@
334                         su_failure (tty);
335                 }
336         }
337 +       ret = pam_get_item(pamh, PAM_USER, (const void **) &tmp_name);
338 +       if (ret != PAM_SUCCESS) {
339 +               SYSLOG((LOG_ERR, "pam_get_item: internal PAM error\n"));
340 +               fprintf(stderr, "%s: Internal PAM error retrieving username\n", Prog);
341 +               pam_end(pamh, ret);
342 +               su_failure(tty);
343 +       }
344 +       strncpy(name, tmp_name, sizeof(name) - 1);
345  #else                          /* !USE_PAM */
346         /*
347          * Set up a signal handler in case the user types QUIT.
348 @@ -507,10 +652,14 @@
349         }
350  #endif
351  
352 -       environ = newenvp;      /* make new environment active */
353 -
354 -       if (getenv ("IFS"))     /* don't export user IFS ... */
355 -               addenv ("IFS= \t\n", NULL);     /* ... instead, set a safe IFS */
356 +       if (change_environment || restricted_shell(pwent.pw_shell)) {
357 +               environ = newenvp;                      /* make new environment active */
358 +               if (getenv ("IFS"))                     /* don't export user IFS ... */
359 +                       addenv("IFS= \t\n", NULL);      /* ... instead, set a safe IFS */
360 +       } else {
361 +               if (getenv ("IFS"))
362 +                       putenv("IFS= \t\n");
363 +       }
364  
365         if (pwent.pw_shell[0] == '*') { /* subsystem root required */
366                 pwent.pw_shell++;       /* skip the '*' */
367 @@ -554,17 +703,56 @@
368                 pam_end (pamh, ret);
369                 exit (1);
370         }
371 +       ret = pam_open_session(pamh, 0);
372 +       if (ret != PAM_SUCCESS) {
373 +               SYSLOG((LOG_ERR, "pam_open_session: %s\n", pam_strerror(pamh, ret)));
374 +               fprintf(stderr, "%s: %s\n", Prog, pam_strerror(pamh, ret));
375 +               pam_setcred(pamh, PAM_DELETE_CRED);
376 +               pam_end(pamh, ret);
377 +               exit(1);
378 +       }
379 +       /* We must fork before setuid() because we need to call
380 +        * pam_close_session() as root.
381 +        */
382 +
383 +       /* We let the admin configure whether they need to keep login
384 +          around to close sessions */
385 +       if (getdef_bool("CLOSE_SESSIONS")) {
386 +               pid_t pid;
387 +               int status;
388 +
389 +               signal(SIGINT, SIG_IGN);
390 +               pid = fork();
391 +
392 +               switch(pid) {
393 +               case -1:
394 +                       SYSLOG((LOG_ERR, "su: fork failure: %m"));
395 +                       perror("su: fork failure");
396 +                       pam_setcred(pamh, PAM_DELETE_CRED);
397 +                       pam_close_session(pamh, 0);
398 +                       pam_end(pamh, PAM_ABORT);
399 +                       exit(1);
400 +               case 0: /* child */
401 +                       signal(SIGINT, SIG_DFL);
402 +                       break;
403 +               default: /* parent */
404 +                       waitpid(pid, &status, 0);
405 +                       /* now we are done using PAM */
406 +                       pam_setcred(pamh, PAM_DELETE_CRED);
407 +                       ret = pam_close_session(pamh, 0);
408 +                       pam_end(pamh, ret);
409 +                       exit(WEXITSTATUS(status));
410 +               }
411 +       }
412  
413         /* become the new user */
414         if (change_uid (&pwent)) {
415 +               pam_close_session(pamh, 0);
416                 pam_setcred (pamh, PAM_DELETE_CRED);
417                 pam_end (pamh, PAM_ABORT);
418                 exit (1);
419         }
420  
421 -       /* now we are done using PAM */
422 -       pam_end (pamh, PAM_SUCCESS);
423 -
424  #else                          /* !USE_PAM */
425         if (!amroot)            /* no limits if su from root */
426                 setup_limits (&pwent);
427 @@ -573,11 +761,14 @@
428                 exit (1);
429  #endif                         /* !USE_PAM */
430  
431 -       if (fakelogin)
432 -               setup_env (&pwent);
433 +       if (fakelogin && (change_environment || restricted_shell(pwent.pw_shell)))
434 +               setup_env(&pwent);
435  #if 1                          /* Suggested by Joey Hess. XXX - is this right?  */
436 -       else
437 -               addenv ("HOME", pwent.pw_dir);
438 +       else if (change_environment || restricted_shell(pwent.pw_shell)) {
439 +               addenv("HOME", pwent.pw_dir);
440 +               addenv("USER", pwent.pw_name);
441 +               addenv("SHELL", shell);
442 +       }
443  #endif
444  
445         /*
446 @@ -589,46 +780,6 @@
447          */
448         closelog ();
449  
450 -       /*
451 -        * See if the user has extra arguments on the command line. In that
452 -        * case they will be provided to the new user's shell as arguments.
453 -        */
454 -
455 -       if (fakelogin) {
456 -               char *arg0;
457 -
458 -#if 0                          /* XXX - GNU su doesn't do this.  --marekm */
459 -               if (!hushed (&pwent)) {
460 -                       motd ();
461 -                       mailcheck ();
462 -               }
463 -#endif
464 -               cp = getdef_str ("SU_NAME");
465 -               if (!cp)
466 -                       cp = Basename (pwent.pw_shell);
467 -
468 -               arg0 = xmalloc (strlen (cp) + 2);
469 -               arg0[0] = '-';
470 -               strcpy (arg0 + 1, cp);
471 -               cp = arg0;
472 -       } else
473 -               cp = Basename (pwent.pw_shell);
474 -
475 -       if (!doshell) {
476 -
477 -               /*
478 -                * Use new user's shell from /etc/passwd and create an argv
479 -                * with the rest of the command line included.
480 -                */
481 -
482 -               argv[-1] = pwent.pw_shell;
483 -               (void) execv (pwent.pw_shell, &argv[-1]);
484 -               (void) fprintf (stderr, _("No shell\n"));
485 -               SYSLOG ((LOG_WARN, "Cannot execute %s", pwent.pw_shell));
486 -               closelog ();
487 -               exit (1);
488 -       }
489 -
490 -       shell (pwent.pw_shell, cp);
491 +       run_shell (shell, command, additional_args, fakelogin);
492          /*NOTREACHED*/ exit (1);
493  }
494 --- shadow-4.0.3.orig/src/groupadd.c
495 +++ shadow-4.0.3/src/groupadd.c
496 @@ -29,6 +29,8 @@
497  
498  #include <config.h>
499  
500 +#undef USE_PAM
501 +
502  #include "rcsid.h"
503  RCSID (PKG_VER "$Id$")
504  #include <sys/types.h>
505 --- shadow-4.0.3.orig/src/groupdel.c
506 +++ shadow-4.0.3/src/groupdel.c
507 @@ -29,6 +29,8 @@
508  
509  #include <config.h>
510  
511 +#undef USE_PAM
512 +
513  #include "rcsid.h"
514  RCSID(PKG_VER "$Id$")
515  
516 --- shadow-4.0.3.orig/src/groupmod.c
517 +++ shadow-4.0.3/src/groupmod.c
518 @@ -29,6 +29,8 @@
519  
520  #include <config.h>
521  
522 +#undef USE_PAM
523 +
524  #include "rcsid.h"
525  RCSID (PKG_VER "$Id$")
526  #include <sys/types.h>
527 --- shadow-4.0.3.orig/src/chpasswd.c
528 +++ shadow-4.0.3/src/chpasswd.c
529 @@ -29,6 +29,8 @@
530  
531  #include <config.h>
532  
533 +#undef USE_PAM
534 +
535  #include "rcsid.h"
536  RCSID (PKG_VER "$Id$")
537  #include <stdio.h>
538 --- shadow-4.0.3.orig/src/newusers.c
539 +++ shadow-4.0.3/src/newusers.c
540 @@ -35,6 +35,8 @@
541  
542  #include <config.h>
543  
544 +#undef USE_PAM
545 +
546  #include "rcsid.h"
547  RCSID (PKG_VER "$Id$")
548  #include <sys/types.h>
549 --- shadow-4.0.3.orig/src/login.c
550 +++ shadow-4.0.3/src/login.c
551 @@ -58,6 +58,11 @@
552  #include <sys/proc.h>
553  #include <sys/sysi86.h>
554  #endif
555 +
556 +#ifndef MAXHOSTNAMELEN
557 +#define MAXHOSTNAMELEN 64
558 +#endif
559 +
560  #ifdef RADIUS
561  /*
562   * Support for RADIUS authentication based on a hacked util-linux login
563 @@ -289,6 +294,8 @@
564         for (arg = 1; arg < argc; arg++) {
565                 if (argv[arg][0] == '-' && strlen (argv[arg]) > 2)
566                         usage ();
567 +               if (!strcmp(argv[arg], "--"))
568 +                       break; /* stop checking on a "--" */
569         }
570  }
571  
572 @@ -424,11 +431,39 @@
573         static char temp_pw[2];
574         static char temp_shell[] = "/bin/sh";
575  
576 +#ifdef CONFIG_FLASK
577 +#include <linux/flask/flask_types.h>
578 +#include <selinux/flask_util.h>
579 +#include <selinux/fs_secure.h>
580 +#include <selinux/ss.h>
581 +#include <selinux/get_user_sid.h>
582 +#endif
583 +
584  #ifdef USE_PAM
585         int retcode;
586         pid_t child;
587         char *pam_user;
588  #endif                         /* USE_PAM */
589 +#ifdef CONFIG_FLASK
590 +#define CONTEXTLEN 255
591 +       security_context_t user_context;
592 +       int user_context_len = CONTEXTLEN;
593 +       security_id_t user_sid;
594 +       security_id_t* sidlist;
595 +#define SIDLISTLEN 10
596 +       int sidlistlen = SIDLISTLEN;
597 +       int num_sids = 0;
598 +       security_id_t ttyn_sid;  /* The current sid of ttyn device */
599 +       int FLASK_flag;
600 +#ifdef CHOWNCVS
601 +       security_id_t vcsn_sid;  /* The current sid of vcsn device */
602 +       security_id_t vcsan_sid;  /* The current sid of vcsan device */
603 +#endif
604 +       security_id_t newdev_sid;   /* The new sid of a device */
605 +       struct stat statbuf;
606 +       int flask_enabled;
607 +       int rc;
608 +#endif
609  #if defined(SHADOWPWD) && !defined(USE_PAM)
610         struct spwd *spwd = NULL;
611  #endif
612 @@ -466,7 +501,7 @@
613  
614         check_flags (argc, argv);
615  
616 -       while ((flag = getopt (argc, argv, "d:f:h:pr:")) != EOF) {
617 +       while ((flag = getopt (argc, argv, "d:f::h:pr:")) != EOF) {
618                 switch (flag) {
619                 case 'p':
620                         pflg++;
621 @@ -475,11 +510,16 @@
622                         /*
623                          * username must be a separate token
624                          * (-f root, *not* -froot).  --marekm
625 +                        *
626 +                        * if -f has an arg, use that, else use the
627 +                        * normal user name passed after all options
628 +                        * --benc
629                          */
630 -                       if (optarg != argv[optind - 1])
631 +                       if (optarg != NULL && optarg != argv[optind - 1])
632                                 usage ();
633                         fflg++;
634 -                       STRFCPY (username, optarg);
635 +                       if (optarg)
636 +                         STRFCPY (username, optarg);
637                         break;
638  #ifdef RLOGIN
639                 case 'r':
640 @@ -633,7 +673,7 @@
641                 init_env ();
642  
643                 if (optind < argc) {    /* get the user name */
644 -                       if (rflg || fflg)
645 +                       if (rflg || (fflg && username[0]))
646                                 usage ();
647  
648  #ifdef SVR4
649 @@ -763,49 +803,98 @@
650                          * MAX_LOGIN_TRIES?
651                          */
652  
653 -                       retcode = pam_authenticate (pamh, 0);
654 -                       while ((failcount++ < retries) &&
655 -                              ((retcode == PAM_AUTH_ERR) ||
656 -                               (retcode == PAM_USER_UNKNOWN) ||
657 -                               (retcode == PAM_CRED_INSUFFICIENT) ||
658 -                               (retcode == PAM_AUTHINFO_UNAVAIL))) {
659 -                               pam_get_item (pamh, PAM_USER,
660 -                                             (const void **) &pam_user);
661 -                               syslog (LOG_NOTICE,
662 -                                       "FAILED LOGIN %d FROM %s FOR %s, %s",
663 -                                       failcount, hostname, pam_user,
664 -                                       pam_strerror (pamh, retcode));
665 -#ifdef HAVE_PAM_FAIL_DELAY
666 -                               pam_fail_delay (pamh, 1000000 * delay);
667 +                       failcount = 0;
668 +                       while (1) {
669 +                         const char *failent_user;
670 +                         failed = 0;
671 +                         
672 +                         failcount++;
673 +                         if (delay > 0)
674 +                           retcode = pam_fail_delay(pamh, 1000000*delay);
675 +                         
676 +                         retcode = pam_authenticate (pamh, 0);
677 +                         
678 +                         pam_get_item (pamh, PAM_USER,
679 +                                       (const void **) &pam_user);
680 +                         
681 +                         if (pam_user && pam_user[0]) {
682 +                           pwd = getpwnam(pam_user);
683 +                           if (pwd) {
684 +                             pwent = *pwd;
685 +                             failent_user = pwent.pw_name;
686 +                           } else {
687 +                             if (getdef_bool("LOG_UNKFAIL_ENAB") && pam_user)
688 +                               failent_user = pam_user;
689 +                             else
690 +                               failent_user = "UNKNOWN";
691 +                           }
692 +                         } else {
693 +                           pwd = NULL;
694 +                           failent_user = "UNKNOWN";
695 +                         }
696 +                         
697 +                         if (retcode == PAM_MAXTRIES || failcount >= retries) {
698 +                           syslog (LOG_NOTICE,
699 +                                   _("TOO MANY LOGIN TRIES (%d)%s FOR `%s'"),
700 +                                   failcount, fromhost, failent_user);
701 +#ifndef USE_PAM
702 +                           if (pwd && getdef_bool("FAILLOG_ENAB"))
703 +                             failure (pwent.pw_uid, tty, &faillog);
704 +#endif
705 +                           fprintf(stderr,
706 +                                   _("Maximum number of tries exceeded (%d)\n"),
707 +                                   failcount);
708 +                           PAM_END;
709 +                           exit(0);
710 +                         } else if (retcode == PAM_ABORT) {
711 +                           /* Serious problems, quit now */
712 +                           fprintf(stderr,_("login: abort requested by PAM\n"));
713 +                           syslog(LOG_ERR,_("PAM_ABORT returned from pam_authenticate()"));
714 +                           PAM_END;
715 +                           exit(99);
716 +                         } else if (retcode != PAM_SUCCESS) {
717 +                           syslog(LOG_NOTICE,_("FAILED LOGIN (%d)%s FOR `%s', %s"),
718 +                                  failcount, fromhost, failent_user,
719 +                                  pam_strerror (pamh, retcode));
720 +                           failed = 1;
721 +                         }
722 +#ifndef USE_PAM
723 +                         if (pwd && getdef_bool("FAILLOG_ENAB") &&
724 +                             ! failcheck (pwent.pw_uid, &faillog, failed)) {
725 +                           SYSLOG((LOG_CRIT, FAILURE_CNT, failent_user, fromhost));
726 +                           failed = 1;
727 +                         }
728  #endif
729 -                               fprintf (stderr, "Login incorrect\n\n");
730 -                               pam_set_item (pamh, PAM_USER, NULL);
731 -                               retcode = pam_authenticate (pamh, 0);
732 -                       }
733  
734 -                       if (retcode != PAM_SUCCESS) {
735 -                               pam_get_item (pamh, PAM_USER,
736 -                                             (const void **) &pam_user);
737 -
738 -                               if (retcode == PAM_MAXTRIES)
739 -                                       syslog (LOG_NOTICE,
740 -                                               "TOO MANY LOGIN TRIES (%d) FROM %s FOR %s, %s",
741 -                                               failcount, hostname,
742 -                                               pam_user,
743 -                                               pam_strerror (pamh,
744 -                                                             retcode));
745 -                               else
746 -                                       syslog (LOG_NOTICE,
747 -                                               "FAILED LOGIN SESSION FROM %s FOR %s, %s",
748 -                                               hostname, pam_user,
749 -                                               pam_strerror (pamh,
750 -                                                             retcode));
751 -
752 -                               fprintf (stderr, "\nLogin incorrect\n");
753 -                               pam_end (pamh, retcode);
754 -                               exit (0);
755 +                         if (!failed)
756 +                           break;
757 +                         
758 +                         fprintf(stderr,"Login incorrect\n\n");
759 +#ifndef USE_PAM
760 +                         if (pwd && getdef_bool("FAILLOG_ENAB"))
761 +                           failure (pwent.pw_uid, tty, &faillog);
762 +#endif
763 +                         if (getdef_str("FTMP_FILE") != NULL) {
764 +#if HAVE_UTMPX_H
765 +                           failent = utxent;
766 +                           gettimeofday(&(failent.ut_tv), NULL);
767 +#else
768 +                           failent = utent;
769 +                           time(&failent.ut_time);
770 +#endif
771 +                           strncpy(failent.ut_user, failent_user, sizeof(failent.ut_user));
772 +#ifdef USER_PROCESS
773 +                           failent.ut_type = USER_PROCESS;
774 +#endif
775 +                           failtmp(&failent);
776 +                         }
777 +                         
778 +                         /* Let's give it another go around */
779 +                         pam_set_item(pamh,PAM_USER,NULL);
780                         }
781  
782 +                       /* We don't get here unless they were authenticated above */
783 +                       alarm(0);
784                         retcode = pam_acct_mgmt (pamh, 0);
785  
786                         if (retcode == PAM_NEW_AUTHTOK_REQD) {
787 @@ -828,11 +917,14 @@
788  
789                 if (!pwd || setup_groups (pwd))
790                         exit (1);
791 +               else
792 +                       pwent = *pwd;
793  
794                 retcode = pam_setcred (pamh, PAM_ESTABLISH_CRED);
795                 PAM_FAIL_CHECK;
796  
797 -               retcode = pam_open_session (pamh, 0);
798 +               retcode = pam_open_session (pamh,
799 +                                           hushed(&pwent) ? PAM_SILENT : 0);
800                 PAM_FAIL_CHECK;
801  
802  #else                          /* ! USE_PAM */
803 @@ -1002,6 +1094,7 @@
804                         failed = 1;
805                 }
806  #endif
807 +#ifndef USE_PAM
808                 if (pwd && getdef_bool ("FAILLOG_ENAB") &&
809                     !failcheck (pwent.pw_uid, &faillog, failed)) {
810                         SYSLOG ((LOG_CRIT, 
811 @@ -1009,12 +1102,15 @@
812                                  username, fromhost));
813                         failed = 1;
814                 }
815 +#endif
816                 if (!failed)
817                         break;
818  
819 +#ifndef USE_PAM
820                 /* don't log non-existent users */
821                 if (pwd && getdef_bool ("FAILLOG_ENAB"))
822                         failure (pwent.pw_uid, tty, &faillog);
823 +#endif
824                 if (getdef_str ("FTMP_FILE") != NULL) {
825                         const char *failent_user;
826  
827 @@ -1078,6 +1174,66 @@
828         }               /* while (1) */
829  #endif                         /* ! USE_PAM */
830         alarm (0);      /* turn off alarm clock */
831 +
832 +#ifdef CONFIG_FLASK
833 +       /* Make sure FLASK is really installed on this system */
834 +       if( (FLASK_flag = is_flask_enabled()) )
835 +       {
836 +               /* Get security context and SID for user */
837 +               sidlistlen = SIDLISTLEN;
838 +               sidlist = malloc (sidlistlen*sizeof(security_id_t));
839 +               if (sidlist == 0) {
840 +                       fprintf(stderr, "login: no memory for SID list.\n");
841 +                       exit (0);
842 +               }
843 +
844 +               num_sids = get_ordered_sid_list (pam_user, 0, sidlist, &sidlistlen);
845 +               if (num_sids <= 0 && sidlistlen > SIDLISTLEN) {
846 +                       security_id_t *tmplist;
847 +                       tmplist = realloc (sidlist, sidlistlen*sizeof(security_id_t));
848 +                       if (tmplist) {
849 +                               sidlist = tmplist;
850 +                               num_sids = get_ordered_sid_list (pam_user, 0, sidlist, &sidlistlen);
851 +                       }
852 +               }
853 +
854 +               if (num_sids <= 0)  {
855 +                       fprintf(stderr, "login: unable to obtain SIDs for %s.\n", pam_user);
856 +                       if (manual_user_enter_sid (pam_user, &user_sid))
857 +                       {
858 +                               syslog (LOG_ERR, "UNABLE TO GET VALID SID FOR %s", pam_user);
859 +                               exit(0);
860 +                       }
861 +               }
862 +               else
863 +               {
864 +                       query_user_sid (sidlist, num_sids, &user_sid);
865 +               }
866 +               free (sidlist);
867 +               user_context_len = CONTEXTLEN;
868 +               user_context = malloc(user_context_len);
869 +               if (!user_context) {
870 +                       fprintf(stderr, "login: no memory for security context.\n");
871 +                       exit (0);
872 +               }
873 +               rc = security_sid_to_context(user_sid,user_context,&user_context_len);
874 +               if (rc < 0 && user_context_len > CONTEXTLEN)
875 +               {
876 +                       security_context_t tmpcon;
877 +                       tmpcon = realloc (user_context, user_context_len);
878 +                       if (tmpcon) {
879 +                               user_context = tmpcon;
880 +                               rc = security_sid_to_context (user_sid, user_context, &user_context_len);
881 +                       }
882 +               }
883 +               if (rc < 0) {
884 +                       free (user_context);
885 +                       syslog (LOG_ERR, "PROBLEM OBTAINING CONTEXT FOR %s", pam_user);
886 +                       exit (0);
887 +               }
888 +       }
889 +#endif
890 +
891  #ifndef USE_PAM                        /* PAM does this */
892         /*
893          * porttime checks moved here, after the user has been
894 @@ -1172,7 +1328,11 @@
895  #endif
896         setup_limits (&pwent);  /* nice, ulimit etc. */
897  #endif                         /* ! USE_PAM */
898 -       chown_tty (tty, &pwent);
899 +       chown_tty(tty, &pwent
900 +#ifdef CONFIG_FLASK
901 +       , FLASK_flag, user_sid, &ttyn_sid
902 +#endif
903 +       );
904  
905  #ifdef LOGIN_FBTAB
906         /*
907 @@ -1338,6 +1498,16 @@
908                          * session
909                          */
910                         wait (NULL);
911 +#ifdef CONFIG_FLASK
912 +                       if (FLASK_flag)
913 +                       {
914 +                               /* We need to change the contexts of the
915 +                                * terminal devices back to the system when
916 +                                * the user's session ends.  */
917 +                               if(chsid(tty, ttyn_sid) != 0)
918 +                                       perror("chsid");
919 +                       }
920 +#endif
921                         PAM_END;
922                         exit (0);
923                 }
924 @@ -1354,10 +1524,33 @@
925  #ifdef SHADOWGRP
926         endsgent ();    /* stop access to shadow group file */
927  #endif
928 +#ifdef CONFIG_FLASK
929 +       if(FLASK_flag)
930 +       {
931 +               if(pwent.pw_uid == 0)
932 +                       SYSLOG((LOG_NOTICE, "ROOT LOGIN %s", fromhost));
933 +               else if(getdef_bool("LOG_OK_LOGINS"))
934 +#ifdef USE_PAM
935 +                       SYSLOG((LOG_INFO, "`%s' logged in %s", pam_user, fromhost, user_context));
936 +#else
937 +                       SYSLOG((LOG_INFO, "`%s' logged in %s", username, fromhost, user_context));
938 +#endif
939 +               free(user_context);
940 +       }
941 +       else
942 +       {
943 +#endif
944         if (pwent.pw_uid == 0)
945                 SYSLOG ((LOG_NOTICE, "ROOT LOGIN %s", fromhost));
946         else if (getdef_bool ("LOG_OK_LOGINS"))
947 +#ifdef USE_PAM
948 +               SYSLOG ((LOG_INFO, "`%s' logged in %s", pam_user, fromhost));
949 +#else
950                 SYSLOG ((LOG_INFO, "`%s' logged in %s", username, fromhost));
951 +#endif
952 +#ifdef CONFIG_FLASK
953 +       }
954 +#endif
955         closelog ();
956  #ifdef RADIUS
957         if (is_rad_login) {
958 @@ -1367,8 +1560,16 @@
959         }
960  #endif
961         if ((tmp = getdef_str ("FAKE_SHELL")) != NULL) {
962 -               shell (tmp, pwent.pw_shell);    /* fake shell */
963 +               shell (tmp, pwent.pw_shell
964 +#ifdef CONFIG_FLASK
965 +               , FLASK_flag, user_sid
966 +#endif
967 +       );      /* fake shell */
968         }
969 -       shell (pwent.pw_shell, (char *) 0);     /* exec the shell finally. */
970 +       shell(pwent.pw_shell, (char *) 0
971 +#ifdef CONFIG_FLASK
972 +               , FLASK_flag, user_sid
973 +#endif
974 +       );      /* exec the shell finally. */
975          /*NOTREACHED*/ return 0;
976  }
977 --- shadow-4.0.3.orig/src/passwd.c
978 +++ shadow-4.0.3/src/passwd.c
979 @@ -1173,8 +1173,8 @@
980  
981         if (!amroot && pw->pw_uid != getuid ()) {
982                 fprintf (stderr,
983 -                        _("You may not change the password for %s.\n"),
984 -                        name);
985 +                        _("%s: You may not view or modify password information for %s.\n"),
986 +                        Prog, name);
987                 SYSLOG ((LOG_WARN, "can't change pwd for `%s'", name));
988                 closelog ();
989                 exit (E_NOPERM);
990 --- shadow-4.0.3.orig/src/cppw.c
991 +++ shadow-4.0.3/src/cppw.c
992 @@ -0,0 +1,200 @@
993 +/*
994 +  cppw, cpgr  copy with locking given file over the password or group file
995 +  with -s will copy with locking given file over shadow or gshadow file
996
997 +  Copyright (C) 1999 Stephen Frost <sfrost@snowman.net>
998 +
999 +  Based on vipw, vigr by:
1000 +  Copyright (C) 1997 Guy Maor <maor@ece.utexas.edu>
1001 +
1002 +  This program is free software; you can redistribute it and/or modify
1003 +  it under the terms of the GNU General Public License as published by
1004 +  the Free Software Foundation; either version 2 of the License, or
1005 +  (at your option) any later version.
1006 +
1007 +  This program is distributed in the hope that it will be useful, but
1008 +  WITHOUT ANY WARRANTY; without even the implied warranty of
1009 +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1010 +  General Public License for more details.
1011 +
1012 +  You should have received a copy of the GNU General Public License
1013 +  along with this program; if not, write to the Free Software
1014 +  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1015 +
1016 +  */
1017 +
1018 +#include <config.h>
1019 +#include "defines.h"
1020 +
1021 +#include <errno.h>
1022 +#include <sys/stat.h>
1023 +#include <unistd.h>
1024 +#include <stdio.h>
1025 +#include <stdlib.h>
1026 +#include <sys/types.h>
1027 +#include <signal.h>
1028 +#include <utime.h>
1029 +#include "prototypes.h"
1030 +#include "pwio.h"
1031 +#include "shadowio.h"
1032 +#include "groupio.h"
1033 +#include "sgroupio.h"
1034 +
1035 +
1036 +static const char *progname, *filename, *filenewname;
1037 +static int filelocked = 0;
1038 +static int (*unlock)();
1039 +
1040 +/* local function prototypes */
1041 +static int create_backup_file (FILE *, const char *, struct stat *);
1042 +static void cppwexit (const char *, int, int);
1043 +static void cppwcopy (const char *, const char *, int (*) (void), int (*) (void));
1044 +int main (int, char **);
1045 +
1046 +static int
1047 +create_backup_file(FILE *fp, const char *backup, struct stat *sb)
1048 +{
1049 +  struct utimbuf ub;
1050 +  FILE *bkfp;
1051 +  int c;
1052 +  mode_t mask;
1053 +
1054 +  mask = umask(077);
1055 +  bkfp = fopen(backup, "w");
1056 +  umask(mask);
1057 +  if (!bkfp) return -1;
1058 +
1059 +  rewind(fp);
1060 +  while ((c = getc(fp)) != EOF) {
1061 +    if (putc(c, bkfp) == EOF) break;
1062 +  }
1063 +
1064 +  if (c != EOF || fflush(bkfp)) {
1065 +    fclose(bkfp);
1066 +    unlink(backup);
1067 +    return -1;
1068 +  }
1069 +  if (fclose(bkfp)) {
1070 +    unlink(backup);
1071 +    return -1;
1072 +  }
1073 +
1074 +  ub.actime = sb->st_atime;
1075 +  ub.modtime = sb->st_mtime;
1076 +  if (utime(backup, &ub) ||
1077 +      chmod(backup, sb->st_mode) ||
1078 +      chown(backup, sb->st_uid, sb->st_gid)) {
1079 +    unlink(backup);
1080 +    return -1;
1081 +  }
1082 +  return 0;
1083 +}
1084 +
1085 +static void
1086 +cppwexit(const char *msg, int syserr, int ret)
1087 +{
1088 +  int err = errno;
1089 +  if (filelocked) (*unlock)();
1090 +  if (msg) fprintf(stderr, "%s: %s", progname, msg);
1091 +  if (syserr) fprintf(stderr, ": %s", strerror(err));
1092 +  fprintf(stderr, "\n%s: %s is unchanged\n", progname, filename);
1093 +  exit(ret);
1094 +}
1095 +
1096 +static void
1097 +cppwcopy(const char *file, const char *in_file, int (*file_lock) (void), int (*file_unlock) (void))
1098 +{
1099 +  struct stat st1;
1100 +  FILE *f;
1101 +  char filenew[1024];
1102 +
1103 +  snprintf(filenew, sizeof filenew, "%s.new", file);
1104 +  unlock = file_unlock;
1105 +  filename = file;
1106 +  filenewname = filenew;
1107 +  
1108 +  if (access(file, F_OK)) cppwexit(file, 1, 1);
1109 +  if (!file_lock()) cppwexit("Couldn't lock file", errno, 5);
1110 +  filelocked = 1;
1111 +
1112 +  /* file to copy has same owners, perm */
1113 +  if (stat(file, &st1)) cppwexit(file, 1, 1);
1114 +  if (!(f = fopen(in_file, "r"))) cppwexit(file, 1, 1);
1115 +  if (create_backup_file(f, filenew, &st1))
1116 +    cppwexit("Couldn't make backup", errno, 1);
1117 +  
1118 +  /* XXX - here we should check filenew for errors; if there are any,
1119 +     fail w/ an appropriate error code and let the user manually fix
1120 +     it. Use pwck or grpck to do the check.  - Stephen (Shamelessly
1121 +     stolen from '--marekm's comment) */
1122 +
1123 +  if (rename(filenew, file) == -1) {
1124 +    fprintf(stderr, "%s: can't copy %s: %s)\n",
1125 +           progname, filenew, strerror(errno));
1126 +    cppwexit(0,0,1);
1127 +  }
1128 +
1129 +  (*file_unlock)();
1130 +}
1131 +
1132 +
1133 +int
1134 +main(int argc, char **argv)
1135 +{
1136 +  int flag;
1137 +  int cpshadow = 0;
1138 +  char *in_file;
1139 +  char *c;
1140 +  int e = 1;
1141 +  int do_cppw;
1142 +
1143 +  progname = ((c = strrchr(*argv, '/')) ? c+1 : *argv);
1144 +  do_cppw = (strcmp(progname, "cpgr") != 0);
1145 +
1146 +  while ((flag = getopt(argc, argv, "ghps")) != EOF) {
1147 +    switch (flag) {
1148 +    case 'p':
1149 +      do_cppw = 1;
1150 +      break;
1151 +    case 'g':
1152 +      do_cppw = 0;
1153 +      break;
1154 +    case 's':
1155 +      cpshadow = 1;
1156 +      break;
1157 +    case 'h':
1158 +      e = 0;
1159 +    default:
1160 +      printf("Usage:\n\
1161 +`cppw <file>' copys over /etc/passwd   `cppw -s <file>' copys over /etc/shadow\n\
1162 +`cpgr <file>' copys over /etc/group    `cpgr -s <file>' copys over /etc/gshadow\n\
1163 +");
1164 +      exit(e);
1165 +    }
1166 +  }
1167 +
1168 +  if (optind >= argc) {
1169 +    cppwexit ("missing file argument, -h for usage",0,1);
1170 +  }
1171 +
1172 +  in_file = argv[argc - 1];
1173 +
1174 +  if (do_cppw) {
1175 +#ifdef SHADOWPWD
1176 +    if (cpshadow)
1177 +      cppwcopy(SHADOW_FILE, in_file, spw_lock, spw_unlock);
1178 +    else
1179 +#endif
1180 +      cppwcopy(PASSWD_FILE, in_file, pw_lock, pw_unlock);
1181 +  }
1182 +  else {
1183 +#ifdef SHADOWGRP
1184 +    if (cpshadow)
1185 +      cppwcopy(SGROUP_FILE, in_file, sgr_lock, sgr_unlock);
1186 +    else
1187 +#endif
1188 +      cppwcopy(GROUP_FILE, in_file, gr_lock, gr_unlock);
1189 +  }
1190 +
1191 +  return 0;
1192 +}
1193 --- shadow-4.0.3.orig/src/Makefile.am
1194 +++ shadow-4.0.3/src/Makefile.am
1195 @@ -25,7 +25,7 @@
1196  ubin_PROGRAMS = faillog lastlog chage chfn chsh expiry gpasswd newgrp passwd
1197  usbin_PROGRAMS = chpasswd dpasswd groupadd groupdel groupmod \
1198         logoutd mkpasswd newusers useradd userdel usermod grpck \
1199 -       pwck vipw grpconv grpunconv pwconv pwunconv
1200 +       pwck vipw grpconv grpunconv pwconv pwunconv cppw
1201  
1202  noinst_PROGRAMS = id sulogin
1203  
1204 @@ -34,7 +34,9 @@
1205  suidbins = su
1206  suidubins = chage chfn chsh expiry gpasswd newgrp passwd
1207  
1208 -LDADD = $(top_builddir)/libmisc/libmisc.la \
1209 +LDADD =
1210 +
1211 +LDADD += $(top_builddir)/libmisc/libmisc.la \
1212         $(top_builddir)/lib/libshadow.la
1213  
1214  chpasswd_LDADD = $(LDADD) $(LIBPAM)
1215 @@ -44,17 +46,18 @@
1216  groupadd_LDADD = $(LDADD) $(LIBPAM)
1217  groupdel_LDADD = $(LDADD) $(LIBPAM)
1218  groupmod_LDADD = $(LDADD) $(LIBPAM)
1219 -login_LDADD    = $(LDADD) $(LIBPAM)
1220 +login_LDADD    = $(LDADD) $(LIBPAM) $(SEC_LDADD)
1221  newusers_LDADD = $(LDADD) $(LIBPAM)
1222  passwd_LDADD   = $(LDADD) $(LIBPAM) $(LIBCRACK)
1223  su_SOURCES     = su.c suauth.c
1224 -su_LDADD       = $(LDADD) $(LIBPAM)
1225 +su_LDADD       = $(LDADD) $(LIBPAM) $(SEC_LDADD)
1226  useradd_LDADD  = $(LDADD) $(LIBPAM)
1227  userdel_LDADD  = $(LDADD) $(LIBPAM)
1228  usermod_LDADD  = $(LDADD) $(LIBPAM)
1229 +newgrp_LDADD   = $(LDADD) $(LIBPAM) $(SEC_LDADD)
1230 +sulogin_LDADD  = $(LDADD) $(LIBPAM) $(SEC_LDADD)
1231  
1232  install-exec-hook:
1233 -       ln -sf newgrp   $(DESTDIR)$(bindir)/sg
1234         ln -sf vigr     $(DESTDIR)$(bindir)/vipw
1235         for i in $(suidbins); do \
1236                 chmod 4755 $(DESTDIR)$(bindir)/$$i; \
1237 --- shadow-4.0.3.orig/src/grpck.c
1238 +++ shadow-4.0.3/src/grpck.c
1239 @@ -146,6 +146,7 @@
1240         int errors = 0;
1241         int deleted = 0;
1242         int i;
1243 +       int prune = 0;
1244         struct commonio_entry *gre, *tgre;
1245         struct group *grp;
1246         int sort_mode = 0;
1247 @@ -172,7 +173,7 @@
1248          * Parse the command line arguments
1249          */
1250  
1251 -       while ((arg = getopt (argc, argv, "qrs")) != EOF) {
1252 +       while ((arg = getopt (argc, argv, "qprs")) != EOF) {
1253                 switch (arg) {
1254                 case 'q':
1255                         /* quiet - ignored for now */
1256 @@ -183,6 +184,9 @@
1257                 case 's':
1258                         sort_mode = 1;
1259                         break;
1260 +               case 'p':
1261 +                       prune = 1;
1262 +                       break;
1263                 default:
1264                         usage ();
1265                 }
1266 @@ -315,9 +319,13 @@
1267                         /*
1268                          * prompt the user to delete the entry or not
1269                          */
1270 -
1271 -                       if (!yes_or_no ())
1272 +                       if (!prune) {
1273 +                               if (!yes_or_no ())
1274 +                                       continue;
1275 +                       } else {
1276 +                               puts("Yes");
1277                                 continue;
1278 +                       }
1279  
1280                         /*
1281                          * All group file deletions wind up here. This code
1282 --- shadow-4.0.3.orig/src/newgrp.c
1283 +++ shadow-4.0.3/src/newgrp.c
1284 @@ -91,7 +91,7 @@
1285  
1286  #if ENABLE_NLS
1287         /* XXX - remove when gettext is safe to use in setuid programs */
1288 -       sanitize_env ();
1289 +       /* sanitize_env ();*/
1290  #endif
1291  
1292         setlocale (LC_ALL, "");
1293 @@ -386,8 +386,13 @@
1294                 SYSLOG ((LOG_INFO, "user `%s' switched to group `%s'",
1295                          name, group));
1296         if (getdef_bool ("SYSLOG_SG_ENAB")) {
1297 -               char *loginname = xstrdup (getlogin ());
1298 -               char *tty = xstrdup (ttyname (0));
1299 +               char *loginname = getlogin ();
1300 +               char *tty = ttyname (0);
1301 +
1302 +               if (loginname != NULL)
1303 +                 loginname = xstrdup (loginname);
1304 +               if (tty != NULL)
1305 +                 tty = xstrdup (tty);
1306  
1307                 if (loginname == NULL)
1308                         loginname = "???";
1309 @@ -586,7 +591,11 @@
1310          * the previous environment which should be the user's login shell.
1311          */
1312  
1313 -       shell (prog, initflag ? (char *) 0 : cp);
1314 +       shell(prog, initflag ? (char *) 0 : cp
1315 +#ifdef CONFIG_FLASK
1316 +               , 0, 0
1317 +#endif
1318 +       );
1319         /*NOTREACHED*/ failure:
1320  
1321         /*
1322 --- shadow-4.0.3.orig/src/useradd.c
1323 +++ shadow-4.0.3/src/useradd.c
1324 @@ -29,6 +29,8 @@
1325  
1326  #include <config.h>
1327  
1328 +#undef USE_PAM
1329 +
1330  #include "rcsid.h"
1331  RCSID (PKG_VER "$Id$")
1332  #include "prototypes.h"
1333 --- shadow-4.0.3.orig/src/userdel.c
1334 +++ shadow-4.0.3/src/userdel.c
1335 @@ -29,6 +29,8 @@
1336  
1337  #include <config.h>
1338  
1339 +#undef USE_PAM
1340 +
1341  #include "rcsid.h"
1342  RCSID (PKG_VER "$Id$")
1343  #include <sys/stat.h>
1344 @@ -147,6 +149,7 @@
1345         struct group *ngrp;
1346  
1347  #ifdef SHADOWGRP
1348 +       int deleted_user_group = 0;
1349         const struct sgrp *sgrp;
1350         struct sgrp *nsgrp;
1351  #endif                         /* SHADOWGRP */
1352 @@ -209,6 +212,10 @@
1353  
1354                 gr_remove (grp->gr_name);
1355  
1356 +#ifdef SHADOWGRP
1357 +               deleted_user_group = 1;
1358 +#endif
1359 +
1360                 /*
1361                  * Update the DBM group file with the new entry as well.
1362                  */
1363 @@ -279,6 +286,10 @@
1364                 SYSLOG ((LOG_INFO, "delete `%s' from shadow group `%s'\n",
1365                          user_name, nsgrp->sg_name));
1366         }
1367 +
1368 +       if (deleted_user_group)
1369 +               sgr_remove(user_name);
1370 +
1371  #ifdef NDBM
1372         endsgent ();
1373  #endif                         /* NDBM */
1374 --- shadow-4.0.3.orig/src/usermod.c
1375 +++ shadow-4.0.3/src/usermod.c
1376 @@ -29,6 +29,8 @@
1377  
1378  #include <config.h>
1379  
1380 +#undef USE_PAM
1381 +
1382  #include "rcsid.h"
1383  RCSID (PKG_VER "$Id$")
1384  #include <sys/types.h>
1385 @@ -1544,9 +1546,14 @@
1386                                 if (copy_tree (user_home, user_newhome,
1387                                                uflg ? user_newid : -1,
1388                                                gflg ? user_newgid : -1) ==
1389 -                                   0 && remove_tree (user_home) == 0
1390 -                                   && rmdir (user_home) == 0)
1391 -                                       return;
1392 +                                   0) {
1393 +                                 if (remove_tree (user_home) != 0 ||
1394 +                                   rmdir (user_home) != 0)
1395 +                                   fprintf (stderr,
1396 +                                            _("%s: warning: failed to completely remove old home directory %s"),
1397 +                                            Prog, user_home);
1398 +                                 return;
1399 +                               }
1400  
1401                                 (void) remove_tree (user_newhome);
1402                                 (void) rmdir (user_newhome);
1403 --- shadow-4.0.3.orig/src/sulogin.c
1404 +++ shadow-4.0.3/src/sulogin.c
1405 @@ -268,6 +268,10 @@
1406  #ifdef USE_SYSLOG
1407         closelog ();
1408  #endif
1409 -       shell (pwent.pw_shell, (char *) 0);     /* exec the shell finally. */
1410 +       shell(pwent.pw_shell, (char *) 0
1411 +#ifdef CONFIG_FLASK
1412 +               , 0, 0
1413 +#endif
1414 +       );      /* exec the shell finally. */
1415          /*NOTREACHED*/ return (0);
1416  }
1417 --- shadow-4.0.3.orig/src/chage.c
1418 +++ shadow-4.0.3/src/chage.c
1419 @@ -29,6 +29,8 @@
1420  
1421  #include <config.h>
1422  
1423 +#undef USE_PAM
1424 +
1425  #include "rcsid.h"
1426  RCSID (PKG_VER "$Id$")
1427  #include <sys/types.h>
1428 --- shadow-4.0.3.orig/libmisc/sub.c
1429 +++ shadow-4.0.3/libmisc/sub.c
1430 @@ -75,4 +75,8 @@
1431                 closelog();
1432                 exit (1);
1433         }
1434 +
1435 +       /* Now fixup the shell to get rid of that '*' */
1436 +       if (*pw->pw_shell == '*')
1437 +               pw->pw_shell++;
1438  }
1439 --- shadow-4.0.3.orig/libmisc/pam_pass.c
1440 +++ shadow-4.0.3/libmisc/pam_pass.c
1441 @@ -51,6 +51,7 @@
1442                 exit(10);  /* XXX */
1443         }
1444  
1445 +       fputs("passwd: password updated successfully\n", stderr);
1446         pam_end(pamh, PAM_SUCCESS);
1447  }
1448  #else /* !USE_PAM */
1449 --- shadow-4.0.3.orig/libmisc/shell.c
1450 +++ shadow-4.0.3/libmisc/shell.c
1451 @@ -55,7 +55,11 @@
1452   */
1453  
1454  void
1455 -shell(const char *file, const char *arg)
1456 +shell(const char *file, const char *arg
1457 +#ifdef CONFIG_FLASK
1458 +  , int FLASK_flag, security_id_t user_sid
1459 +#endif
1460 + )
1461  {
1462         char arg0[1024];
1463         int err;
1464 @@ -84,6 +88,11 @@
1465          * grief.
1466          */
1467  
1468 +#ifdef CONFIG_FLASK
1469 +       if(FLASK_flag)
1470 +               execle_secure(file, user_sid, arg, (char *) 0, newenvp);
1471 +       else
1472 +#endif
1473         execle (file, arg, (char *) 0, newenvp);
1474         err = errno;
1475  
1476 @@ -103,6 +112,11 @@
1477                 if ((fp = fopen (file, "r"))) {
1478                         if (getc (fp) == '#' && getc (fp) == '!') {
1479                                 fclose (fp);
1480 +#ifdef CONFIG_FLASK
1481 +                               if(FLASK_flag)
1482 +                                       execle ("/bin/sh", user_sid, "sh", file, (char *) 0, newenvp);
1483 +                               else
1484 +#endif
1485                                 execle ("/bin/sh", "sh",
1486                                         file, (char *) 0, newenvp);
1487                                 err = errno;
1488 --- shadow-4.0.3.orig/libmisc/getdate.c
1489 +++ shadow-4.0.3/libmisc/getdate.c
1490 @@ -1,26 +1,24 @@
1491 -
1492 -/*  A Bison parser, made from getdate.y
1493 - by  GNU Bison version 1.25
1494 -  */
1495 +/* A Bison parser, made from getdate.y
1496 +   by GNU bison 1.33.  */
1497  
1498  #define YYBISON 1  /* Identify Bison output.  */
1499  
1500 -#define        tAGO    258
1501 -#define        tDAY    259
1502 -#define        tDAY_UNIT       260
1503 -#define        tDAYZONE        261
1504 -#define        tDST    262
1505 -#define        tHOUR_UNIT      263
1506 -#define        tID     264
1507 -#define        tMERIDIAN       265
1508 -#define        tMINUTE_UNIT    266
1509 -#define        tMONTH  267
1510 -#define        tMONTH_UNIT     268
1511 -#define        tSEC_UNIT       269
1512 -#define        tSNUMBER        270
1513 -#define        tUNUMBER        271
1514 -#define        tYEAR_UNIT      272
1515 -#define        tZONE   273
1516 +# define       tAGO    257
1517 +# define       tDAY    258
1518 +# define       tDAY_UNIT       259
1519 +# define       tDAYZONE        260
1520 +# define       tDST    261
1521 +# define       tHOUR_UNIT      262
1522 +# define       tID     263
1523 +# define       tMERIDIAN       264
1524 +# define       tMINUTE_UNIT    265
1525 +# define       tMONTH  266
1526 +# define       tMONTH_UNIT     267
1527 +# define       tSEC_UNIT       268
1528 +# define       tSNUMBER        269
1529 +# define       tUNUMBER        270
1530 +# define       tYEAR_UNIT      271
1531 +# define       tZONE   272
1532  
1533  #line 1 "getdate.y"
1534  
1535 @@ -197,16 +195,15 @@
1536  
1537  
1538  #line 175 "getdate.y"
1539 +#ifndef YYSTYPE
1540  typedef union {
1541      int                        Number;
1542      enum _MERIDIAN     Meridian;
1543 -} YYSTYPE;
1544 -#include <stdio.h>
1545 -
1546 -#ifndef __cplusplus
1547 -#ifndef __STDC__
1548 -#define const
1549 +} yystype;
1550 +# define YYSTYPE yystype
1551  #endif
1552 +#ifndef YYDEBUG
1553 +# define YYDEBUG 0
1554  #endif
1555  
1556  
1557 @@ -215,159 +212,187 @@
1558  #define        YYFLAG          -32768
1559  #define        YYNTBASE        22
1560  
1561 -#define YYTRANSLATE(x) ((unsigned)(x) <= 273 ? yytranslate[x] : 32)
1562 +/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
1563 +#define YYTRANSLATE(x) ((unsigned)(x) <= 272 ? yytranslate[x] : 32)
1564  
1565 -static const char yytranslate[] = {     0,
1566 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1567 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1568 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1569 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1570 -     2,     2,     2,    20,     2,     2,    21,     2,     2,     2,
1571 -     2,     2,     2,     2,     2,     2,     2,    19,     2,     2,
1572 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1573 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1574 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1575 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1576 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1577 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1578 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1579 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1580 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1581 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1582 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1583 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1584 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1585 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1586 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1587 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1588 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1589 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1590 -     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1591 -     2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
1592 -     6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
1593 -    16,    17,    18
1594 +/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
1595 +static const char yytranslate[] =
1596 +{
1597 +       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1598 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1599 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1600 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1601 +       2,     2,     2,     2,    20,     2,     2,    21,     2,     2,
1602 +       2,     2,     2,     2,     2,     2,     2,     2,    19,     2,
1603 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1604 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1605 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1606 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1607 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1608 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1609 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1610 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1611 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1612 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1613 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1614 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1615 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1616 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1617 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1618 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1619 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1620 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1621 +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
1622 +       2,     2,     2,     2,     2,     2,     1,     3,     4,     5,
1623 +       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
1624 +      16,    17,    18
1625  };
1626  
1627 -#if YYDEBUG != 0
1628 -static const short yyprhs[] = {     0,
1629 -     0,     1,     4,     6,     8,    10,    12,    14,    16,    19,
1630 -    24,    29,    36,    43,    45,    47,    50,    52,    55,    58,
1631 -    62,    68,    72,    76,    79,    84,    87,    91,    94,    96,
1632 -    99,   102,   104,   107,   110,   112,   115,   118,   120,   123,
1633 -   126,   128,   131,   134,   136,   139,   142,   144,   146,   147
1634 +#if YYDEBUG
1635 +static const short yyprhs[] =
1636 +{
1637 +       0,     0,     1,     4,     6,     8,    10,    12,    14,    16,
1638 +      19,    24,    29,    36,    43,    45,    47,    50,    52,    55,
1639 +      58,    62,    68,    72,    76,    79,    84,    87,    91,    94,
1640 +      96,    99,   102,   104,   107,   110,   112,   115,   118,   120,
1641 +     123,   126,   128,   131,   134,   136,   139,   142,   144,   146,
1642 +     147
1643  };
1644 -
1645 -static const short yyrhs[] = {    -1,
1646 -    22,    23,     0,    24,     0,    25,     0,    27,     0,    26,
1647 -     0,    28,     0,    30,     0,    16,    10,     0,    16,    19,
1648 -    16,    31,     0,    16,    19,    16,    15,     0,    16,    19,
1649 -    16,    19,    16,    31,     0,    16,    19,    16,    19,    16,
1650 -    15,     0,    18,     0,     6,     0,    18,     7,     0,     4,
1651 -     0,     4,    20,     0,    16,     4,     0,    16,    21,    16,
1652 -     0,    16,    21,    16,    21,    16,     0,    16,    15,    15,
1653 -     0,    16,    12,    15,     0,    12,    16,     0,    12,    16,
1654 -    20,    16,     0,    16,    12,     0,    16,    12,    16,     0,
1655 -    29,     3,     0,    29,     0,    16,    17,     0,    15,    17,
1656 -     0,    17,     0,    16,    13,     0,    15,    13,     0,    13,
1657 -     0,    16,     5,     0,    15,     5,     0,     5,     0,    16,
1658 -     8,     0,    15,     8,     0,     8,     0,    16,    11,     0,
1659 -    15,    11,     0,    11,     0,    16,    14,     0,    15,    14,
1660 -     0,    14,     0,    16,     0,     0,    10,     0
1661 +static const short yyrhs[] =
1662 +{
1663 +      -1,    22,    23,     0,    24,     0,    25,     0,    27,     0,
1664 +      26,     0,    28,     0,    30,     0,    16,    10,     0,    16,
1665 +      19,    16,    31,     0,    16,    19,    16,    15,     0,    16,
1666 +      19,    16,    19,    16,    31,     0,    16,    19,    16,    19,
1667 +      16,    15,     0,    18,     0,     6,     0,    18,     7,     0,
1668 +       4,     0,     4,    20,     0,    16,     4,     0,    16,    21,
1669 +      16,     0,    16,    21,    16,    21,    16,     0,    16,    15,
1670 +      15,     0,    16,    12,    15,     0,    12,    16,     0,    12,
1671 +      16,    20,    16,     0,    16,    12,     0,    16,    12,    16,
1672 +       0,    29,     3,     0,    29,     0,    16,    17,     0,    15,
1673 +      17,     0,    17,     0,    16,    13,     0,    15,    13,     0,
1674 +      13,     0,    16,     5,     0,    15,     5,     0,     5,     0,
1675 +      16,     8,     0,    15,     8,     0,     8,     0,    16,    11,
1676 +       0,    15,    11,     0,    11,     0,    16,    14,     0,    15,
1677 +      14,     0,    14,     0,    16,     0,     0,    10,     0
1678  };
1679  
1680  #endif
1681  
1682 -#if YYDEBUG != 0
1683 -static const short yyrline[] = { 0,
1684 -   191,   192,   195,   198,   201,   204,   207,   210,   213,   219,
1685 -   225,   234,   240,   252,   255,   258,   264,   268,   272,   278,
1686 -   282,   300,   306,   312,   316,   321,   325,   332,   340,   343,
1687 -   346,   349,   352,   355,   358,   361,   364,   367,   370,   373,
1688 -   376,   379,   382,   385,   388,   391,   394,   399,   432,   436
1689 +#if YYDEBUG
1690 +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
1691 +static const short yyrline[] =
1692 +{
1693 +       0,   191,   192,   195,   198,   201,   204,   207,   210,   213,
1694 +     219,   225,   234,   240,   252,   255,   258,   264,   268,   272,
1695 +     278,   282,   300,   306,   312,   316,   321,   325,   332,   340,
1696 +     343,   346,   349,   352,   355,   358,   361,   364,   367,   370,
1697 +     373,   376,   379,   382,   385,   388,   391,   394,   399,   432,
1698 +     436
1699  };
1700  #endif
1701  
1702  
1703 -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
1704 +#if (YYDEBUG) || defined YYERROR_VERBOSE
1705  
1706 -static const char * const yytname[] = {   "$","error","$undefined.","tAGO","tDAY",
1707 -"tDAY_UNIT","tDAYZONE","tDST","tHOUR_UNIT","tID","tMERIDIAN","tMINUTE_UNIT",
1708 -"tMONTH","tMONTH_UNIT","tSEC_UNIT","tSNUMBER","tUNUMBER","tYEAR_UNIT","tZONE",
1709 -"':'","','","'/'","spec","item","time","zone","day","date","rel","relunit","number",
1710 -"o_merid", NULL
1711 +/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
1712 +static const char *const yytname[] =
1713 +{
1714 +  "$", "error", "$undefined.", "tAGO", "tDAY", "tDAY_UNIT", "tDAYZONE", 
1715 +  "tDST", "tHOUR_UNIT", "tID", "tMERIDIAN", "tMINUTE_UNIT", "tMONTH", 
1716 +  "tMONTH_UNIT", "tSEC_UNIT", "tSNUMBER", "tUNUMBER", "tYEAR_UNIT", 
1717 +  "tZONE", "':'", "','", "'/'", "spec", "item", "time", "zone", "day", 
1718 +  "date", "rel", "relunit", "number", "o_merid", NULL
1719  };
1720  #endif
1721  
1722 -static const short yyr1[] = {     0,
1723 -    22,    22,    23,    23,    23,    23,    23,    23,    24,    24,
1724 -    24,    24,    24,    25,    25,    25,    26,    26,    26,    27,
1725 -    27,    27,    27,    27,    27,    27,    27,    28,    28,    29,
1726 -    29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
1727 -    29,    29,    29,    29,    29,    29,    29,    30,    31,    31
1728 +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
1729 +static const short yyr1[] =
1730 +{
1731 +       0,    22,    22,    23,    23,    23,    23,    23,    23,    24,
1732 +      24,    24,    24,    24,    25,    25,    25,    26,    26,    26,
1733 +      27,    27,    27,    27,    27,    27,    27,    27,    28,    28,
1734 +      29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
1735 +      29,    29,    29,    29,    29,    29,    29,    29,    30,    31,
1736 +      31
1737  };
1738  
1739 -static const short yyr2[] = {     0,
1740 -     0,     2,     1,     1,     1,     1,     1,     1,     2,     4,
1741 -     4,     6,     6,     1,     1,     2,     1,     2,     2,     3,
1742 -     5,     3,     3,     2,     4,     2,     3,     2,     1,     2,
1743 -     2,     1,     2,     2,     1,     2,     2,     1,     2,     2,
1744 -     1,     2,     2,     1,     2,     2,     1,     1,     0,     1
1745 +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
1746 +static const short yyr2[] =
1747 +{
1748 +       0,     0,     2,     1,     1,     1,     1,     1,     1,     2,
1749 +       4,     4,     6,     6,     1,     1,     2,     1,     2,     2,
1750 +       3,     5,     3,     3,     2,     4,     2,     3,     2,     1,
1751 +       2,     2,     1,     2,     2,     1,     2,     2,     1,     2,
1752 +       2,     1,     2,     2,     1,     2,     2,     1,     1,     0,
1753 +       1
1754  };
1755  
1756 -static const short yydefact[] = {     1,
1757 -     0,    17,    38,    15,    41,    44,     0,    35,    47,     0,
1758 -    48,    32,    14,     2,     3,     4,     6,     5,     7,    29,
1759 -     8,    18,    24,    37,    40,    43,    34,    46,    31,    19,
1760 -    36,    39,     9,    42,    26,    33,    45,     0,    30,     0,
1761 -     0,    16,    28,     0,    23,    27,    22,    49,    20,    25,
1762 -    50,    11,     0,    10,     0,    49,    21,    13,    12,     0,
1763 -     0
1764 +/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
1765 +   doesn't specify something else to do.  Zero means the default is an
1766 +   error. */
1767 +static const short yydefact[] =
1768 +{
1769 +       1,     0,    17,    38,    15,    41,    44,     0,    35,    47,
1770 +       0,    48,    32,    14,     2,     3,     4,     6,     5,     7,
1771 +      29,     8,    18,    24,    37,    40,    43,    34,    46,    31,
1772 +      19,    36,    39,     9,    42,    26,    33,    45,     0,    30,
1773 +       0,     0,    16,    28,     0,    23,    27,    22,    49,    20,
1774 +      25,    50,    11,     0,    10,     0,    49,    21,    13,    12,
1775 +       0,     0
1776  };
1777  
1778 -static const short yydefgoto[] = {     1,
1779 -    14,    15,    16,    17,    18,    19,    20,    21,    54
1780 +static const short yydefgoto[] =
1781 +{
1782 +       1,    14,    15,    16,    17,    18,    19,    20,    21,    54
1783  };
1784  
1785 -static const short yypact[] = {-32768,
1786 -     0,   -19,-32768,-32768,-32768,-32768,   -13,-32768,-32768,    30,
1787 -    15,-32768,    14,-32768,-32768,-32768,-32768,-32768,-32768,    19,
1788 --32768,-32768,     4,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
1789 --32768,-32768,-32768,-32768,    -6,-32768,-32768,    16,-32768,    17,
1790 -    23,-32768,-32768,    24,-32768,-32768,-32768,    27,    28,-32768,
1791 --32768,-32768,    29,-32768,    32,    -8,-32768,-32768,-32768,    50,
1792 --32768
1793 +static const short yypact[] =
1794 +{
1795 +  -32768,     0,   -19,-32768,-32768,-32768,-32768,   -13,-32768,-32768,
1796 +      30,    15,-32768,    14,-32768,-32768,-32768,-32768,-32768,-32768,
1797 +      19,-32768,-32768,     4,-32768,-32768,-32768,-32768,-32768,-32768,
1798 +  -32768,-32768,-32768,-32768,-32768,    -6,-32768,-32768,    16,-32768,
1799 +      17,    23,-32768,-32768,    24,-32768,-32768,-32768,    27,    28,
1800 +  -32768,-32768,-32768,    29,-32768,    32,    -8,-32768,-32768,-32768,
1801 +      50,-32768
1802  };
1803  
1804 -static const short yypgoto[] = {-32768,
1805 --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    -5
1806 +static const short yypgoto[] =
1807 +{
1808 +  -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    -5
1809  };
1810  
1811  
1812  #define        YYLAST          51
1813  
1814  
1815 -static const short yytable[] = {    60,
1816 -    22,    51,    23,     2,     3,     4,    58,     5,    45,    46,
1817 -     6,     7,     8,     9,    10,    11,    12,    13,    30,    31,
1818 -    42,    43,    32,    44,    33,    34,    35,    36,    37,    38,
1819 -    47,    39,    48,    40,    24,    41,    51,    25,    49,    50,
1820 -    26,    52,    27,    28,    56,    53,    29,    57,    55,    61,
1821 -    59
1822 +static const short yytable[] =
1823 +{
1824 +      60,    22,    51,    23,     2,     3,     4,    58,     5,    45,
1825 +      46,     6,     7,     8,     9,    10,    11,    12,    13,    30,
1826 +      31,    42,    43,    32,    44,    33,    34,    35,    36,    37,
1827 +      38,    47,    39,    48,    40,    24,    41,    51,    25,    49,
1828 +      50,    26,    52,    27,    28,    56,    53,    29,    57,    55,
1829 +      61,    59
1830  };
1831  
1832 -static const short yycheck[] = {     0,
1833 -    20,    10,    16,     4,     5,     6,    15,     8,    15,    16,
1834 -    11,    12,    13,    14,    15,    16,    17,    18,     4,     5,
1835 -     7,     3,     8,    20,    10,    11,    12,    13,    14,    15,
1836 -    15,    17,    16,    19,     5,    21,    10,     8,    16,    16,
1837 -    11,    15,    13,    14,    16,    19,    17,    16,    21,     0,
1838 -    56
1839 +static const short yycheck[] =
1840 +{
1841 +       0,    20,    10,    16,     4,     5,     6,    15,     8,    15,
1842 +      16,    11,    12,    13,    14,    15,    16,    17,    18,     4,
1843 +       5,     7,     3,     8,    20,    10,    11,    12,    13,    14,
1844 +      15,    15,    17,    16,    19,     5,    21,    10,     8,    16,
1845 +      16,    11,    15,    13,    14,    16,    19,    17,    16,    21,
1846 +       0,    56
1847  };
1848  /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
1849 -#line 3 "/usr/share/bison.simple"
1850 +#line 3 "/usr/share/bison/bison.simple"
1851  
1852  /* Skeleton output parser for bison,
1853 -   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
1854 +
1855 +   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software
1856 +   Foundation, Inc.
1857  
1858     This program is free software; you can redistribute it and/or modify
1859     it under the terms of the GNU General Public License as published by
1860 @@ -381,183 +406,328 @@
1861  
1862     You should have received a copy of the GNU General Public License
1863     along with this program; if not, write to the Free Software
1864 -   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
1865 +   Foundation, Inc., 59 Temple Place - Suite 330,
1866 +   Boston, MA 02111-1307, USA.  */
1867  
1868  /* As a special exception, when this file is copied by Bison into a
1869     Bison output file, you may use that output file without restriction.
1870     This special exception was added by the Free Software Foundation
1871     in version 1.24 of Bison.  */
1872  
1873 -#ifndef alloca
1874 -#ifdef __GNUC__
1875 -#define alloca __builtin_alloca
1876 -#else /* not GNU C.  */
1877 -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
1878 -#include <alloca.h>
1879 -#else /* not sparc */
1880 -#if defined (MSDOS) && !defined (__TURBOC__)
1881 -#include <malloc.h>
1882 -#else /* not MSDOS, or __TURBOC__ */
1883 -#if defined(_AIX)
1884 -#include <malloc.h>
1885 - #pragma alloca
1886 -#else /* not MSDOS, __TURBOC__, or _AIX */
1887 -#ifdef __hpux
1888 +/* This is the parser code that is written into each bison parser when
1889 +   the %semantic_parser declaration is not specified in the grammar.
1890 +   It was written by Richard Stallman by simplifying the hairy parser
1891 +   used when %semantic_parser is specified.  */
1892 +
1893 +/* All symbols defined below should begin with yy or YY, to avoid
1894 +   infringing on user name space.  This should be done even for local
1895 +   variables, as they might otherwise be expanded by user macros.
1896 +   There are some unavoidable exceptions within include files to
1897 +   define necessary library symbols; they are noted "INFRINGES ON
1898 +   USER NAME SPACE" below.  */
1899 +
1900  #ifdef __cplusplus
1901 -extern "C" {
1902 -void *alloca (unsigned int);
1903 +# define YYSTD(x) std::x
1904 +#else
1905 +# define YYSTD(x) x
1906 +#endif
1907 +
1908 +#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
1909 +
1910 +/* The parser invokes alloca or malloc; define the necessary symbols.  */
1911 +
1912 +# if YYSTACK_USE_ALLOCA
1913 +#  define YYSTACK_ALLOC alloca
1914 +# else
1915 +#  ifndef YYSTACK_USE_ALLOCA
1916 +#   if defined (alloca) || defined (_ALLOCA_H)
1917 +#    define YYSTACK_ALLOC alloca
1918 +#   else
1919 +#    ifdef __GNUC__
1920 +#     define YYSTACK_ALLOC __builtin_alloca
1921 +#    endif
1922 +#   endif
1923 +#  endif
1924 +# endif
1925 +
1926 +# ifdef YYSTACK_ALLOC
1927 +   /* Pacify GCC's `empty if-body' warning. */
1928 +#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
1929 +# else
1930 +#  ifdef __cplusplus
1931 +#   include <cstdlib> /* INFRINGES ON USER NAME SPACE */
1932 +#   define YYSIZE_T std::size_t
1933 +#  else
1934 +#   ifdef __STDC__
1935 +#    include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
1936 +#    define YYSIZE_T size_t
1937 +#   endif
1938 +#  endif
1939 +#  define YYSTACK_ALLOC YYSTD (malloc)
1940 +#  define YYSTACK_FREE YYSTD (free)
1941 +# endif
1942 +
1943 +/* A type that is properly aligned for any stack member.  */
1944 +union yyalloc
1945 +{
1946 +  short yyss;
1947 +  YYSTYPE yyvs;
1948 +# if YYLSP_NEEDED
1949 +  YYLTYPE yyls;
1950 +# endif
1951  };
1952 -#else /* not __cplusplus */
1953 -void *alloca ();
1954 -#endif /* not __cplusplus */
1955 -#endif /* __hpux */
1956 -#endif /* not _AIX */
1957 -#endif /* not MSDOS, or __TURBOC__ */
1958 -#endif /* not sparc.  */
1959 -#endif /* not GNU C.  */
1960 -#endif /* alloca not defined.  */
1961 -
1962 -/* This is the parser code that is written into each bison parser
1963 -  when the %semantic_parser declaration is not specified in the grammar.
1964 -  It was written by Richard Stallman by simplifying the hairy parser
1965 -  used when %semantic_parser is specified.  */
1966 -
1967 -/* Note: there must be only one dollar sign in this file.
1968 -   It is replaced by the list of actions, each action
1969 -   as one case of the switch.  */
1970 +
1971 +/* The size of the maximum gap between one aligned stack and the next.  */
1972 +# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
1973 +
1974 +/* The size of an array large to enough to hold all stacks, each with
1975 +   N elements.  */
1976 +# if YYLSP_NEEDED
1977 +#  define YYSTACK_BYTES(N) \
1978 +     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \
1979 +      + 2 * YYSTACK_GAP_MAX)
1980 +# else
1981 +#  define YYSTACK_BYTES(N) \
1982 +     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
1983 +      + YYSTACK_GAP_MAX)
1984 +# endif
1985 +
1986 +/* Relocate the TYPE STACK from its old location to the new one.  The
1987 +   local variables YYSIZE and YYSTACKSIZE give the old and new number of
1988 +   elements in the stack, and YYPTR gives the new location of the
1989 +   stack.  Advance YYPTR to a properly aligned location for the next
1990 +   stack.  */
1991 +# define YYSTACK_RELOCATE(Type, Stack)                                 \
1992 +    do                                                                 \
1993 +      {                                                                        \
1994 +       YYSIZE_T yynewbytes;                                            \
1995 +       yymemcpy ((char *) yyptr, (char *) (Stack),                     \
1996 +                 yysize * (YYSIZE_T) sizeof (Type));                   \
1997 +       Stack = &yyptr->Stack;                                          \
1998 +       yynewbytes = yystacksize * sizeof (Type) + YYSTACK_GAP_MAX;     \
1999 +       yyptr += yynewbytes / sizeof (*yyptr);                          \
2000 +      }                                                                        \
2001 +    while (0)
2002 +
2003 +#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
2004 +
2005 +
2006 +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
2007 +# define YYSIZE_T __SIZE_TYPE__
2008 +#endif
2009 +#if ! defined (YYSIZE_T) && defined (size_t)
2010 +# define YYSIZE_T size_t
2011 +#endif
2012 +#if ! defined (YYSIZE_T)
2013 +# ifdef __cplusplus
2014 +#  include <cstddef> /* INFRINGES ON USER NAME SPACE */
2015 +#  define YYSIZE_T std::size_t
2016 +# else
2017 +#  ifdef __STDC__
2018 +#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
2019 +#   define YYSIZE_T size_t
2020 +#  endif
2021 +# endif
2022 +#endif
2023 +#if ! defined (YYSIZE_T)
2024 +# define YYSIZE_T unsigned int
2025 +#endif
2026  
2027  #define yyerrok                (yyerrstatus = 0)
2028  #define yyclearin      (yychar = YYEMPTY)
2029  #define YYEMPTY                -2
2030  #define YYEOF          0
2031 -#define YYACCEPT       return(0)
2032 -#define YYABORT        return(1)
2033 +#define YYACCEPT       goto yyacceptlab
2034 +#define YYABORT        goto yyabortlab
2035  #define YYERROR                goto yyerrlab1
2036 -/* Like YYERROR except do call yyerror.
2037 -   This remains here temporarily to ease the
2038 -   transition to the new meaning of YYERROR, for GCC.
2039 +/* Like YYERROR except do call yyerror.  This remains here temporarily
2040 +   to ease the transition to the new meaning of YYERROR, for GCC.
2041     Once GCC version 2 has supplanted version 1, this can go.  */
2042  #define YYFAIL         goto yyerrlab
2043  #define YYRECOVERING()  (!!yyerrstatus)
2044 -#define YYBACKUP(token, value) \
2045 +#define YYBACKUP(Token, Value)                                 \
2046  do                                                             \
2047    if (yychar == YYEMPTY && yylen == 1)                         \
2048 -    { yychar = (token), yylval = (value);                      \
2049 +    {                                                          \
2050 +      yychar = (Token);                                                \
2051 +      yylval = (Value);                                                \
2052        yychar1 = YYTRANSLATE (yychar);                          \
2053        YYPOPSTACK;                                              \
2054        goto yybackup;                                           \
2055      }                                                          \
2056    else                                                         \
2057 -    { yyerror ("syntax error: cannot back up"); YYERROR; }     \
2058 +    {                                                          \
2059 +      yyerror ("syntax error: cannot back up");                        \
2060 +      YYERROR;                                                 \
2061 +    }                                                          \
2062  while (0)
2063  
2064  #define YYTERROR       1
2065  #define YYERRCODE      256
2066  
2067 -#ifndef YYPURE
2068 -#define YYLEX          yylex()
2069 -#endif
2070  
2071 -#ifdef YYPURE
2072 -#ifdef YYLSP_NEEDED
2073 -#ifdef YYLEX_PARAM
2074 -#define YYLEX          yylex(&yylval, &yylloc, YYLEX_PARAM)
2075 -#else
2076 -#define YYLEX          yylex(&yylval, &yylloc)
2077 -#endif
2078 -#else /* not YYLSP_NEEDED */
2079 -#ifdef YYLEX_PARAM
2080 -#define YYLEX          yylex(&yylval, YYLEX_PARAM)
2081 -#else
2082 -#define YYLEX          yylex(&yylval)
2083 -#endif
2084 -#endif /* not YYLSP_NEEDED */
2085 -#endif
2086 -
2087 -/* If nonreentrant, generate the variables here */
2088 +/* YYLLOC_DEFAULT -- Compute the default location (before the actions
2089 +   are run).
2090  
2091 -#ifndef YYPURE
2092 -
2093 -int    yychar;                 /*  the lookahead symbol                */
2094 -YYSTYPE        yylval;                 /*  the semantic value of the           */
2095 -                               /*  lookahead symbol                    */
2096 -
2097 -#ifdef YYLSP_NEEDED
2098 -YYLTYPE yylloc;                        /*  location data for the lookahead     */
2099 -                               /*  symbol                              */
2100 +   When YYLLOC_DEFAULT is run, CURRENT is set the location of the
2101 +   first token.  By default, to implement support for ranges, extend
2102 +   its range to the last symbol.  */
2103 +
2104 +#ifndef YYLLOC_DEFAULT
2105 +# define YYLLOC_DEFAULT(Current, Rhs, N)               \
2106 +   Current.last_line   = Rhs[N].last_line;     \
2107 +   Current.last_column = Rhs[N].last_column;
2108  #endif
2109  
2110 -int yynerrs;                   /*  number of parse errors so far       */
2111 -#endif  /* not YYPURE */
2112  
2113 -#if YYDEBUG != 0
2114 -int yydebug;                   /*  nonzero means print parse trace     */
2115 -/* Since this is uninitialized, it does not stop multiple parsers
2116 -   from coexisting.  */
2117 -#endif
2118 +/* YYLEX -- calling `yylex' with the right arguments.  */
2119 +
2120 +#if YYPURE
2121 +# if YYLSP_NEEDED
2122 +#  ifdef YYLEX_PARAM
2123 +#   define YYLEX               yylex (&yylval, &yylloc, YYLEX_PARAM)
2124 +#  else
2125 +#   define YYLEX               yylex (&yylval, &yylloc)
2126 +#  endif
2127 +# else /* !YYLSP_NEEDED */
2128 +#  ifdef YYLEX_PARAM
2129 +#   define YYLEX               yylex (&yylval, YYLEX_PARAM)
2130 +#  else
2131 +#   define YYLEX               yylex (&yylval)
2132 +#  endif
2133 +# endif /* !YYLSP_NEEDED */
2134 +#else /* !YYPURE */
2135 +# define YYLEX                 yylex ()
2136 +#endif /* !YYPURE */
2137 +
2138 +
2139 +/* Enable debugging if requested.  */
2140 +#if YYDEBUG
2141 +
2142 +# ifndef YYFPRINTF
2143 +#  ifdef __cplusplus
2144 +#   include <cstdio>  /* INFRINGES ON USER NAME SPACE */
2145 +#  else
2146 +#   include <stdio.h> /* INFRINGES ON USER NAME SPACE */
2147 +#  endif
2148 +#  define YYFPRINTF YYSTD (fprintf)
2149 +# endif
2150  
2151 -/*  YYINITDEPTH indicates the initial size of the parser's stacks      */
2152 +# define YYDPRINTF(Args)                       \
2153 +do {                                           \
2154 +  if (yydebug)                                 \
2155 +    YYFPRINTF Args;                            \
2156 +} while (0)
2157 +/* Nonzero means print parse trace. [The following comment makes no
2158 +   sense to me.  Could someone clarify it?  --akim] Since this is
2159 +   uninitialized, it does not stop multiple parsers from coexisting.
2160 +   */
2161 +int yydebug;
2162 +#else /* !YYDEBUG */
2163 +# define YYDPRINTF(Args)
2164 +#endif /* !YYDEBUG */
2165  
2166 +/* YYINITDEPTH -- initial size of the parser's stacks.  */
2167  #ifndef        YYINITDEPTH
2168 -#define YYINITDEPTH 200
2169 +# define YYINITDEPTH 200
2170  #endif
2171  
2172 -/*  YYMAXDEPTH is the maximum size the stacks can grow to
2173 -    (effective only if the built-in stack extension method is used).  */
2174 +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
2175 +   if the built-in stack extension method is used).
2176 +
2177 +   Do not make this value too large; the results are undefined if
2178 +   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
2179 +   evaluated with infinite-precision integer arithmetic.  */
2180  
2181  #if YYMAXDEPTH == 0
2182 -#undef YYMAXDEPTH
2183 +# undef YYMAXDEPTH
2184  #endif
2185  
2186  #ifndef YYMAXDEPTH
2187 -#define YYMAXDEPTH 10000
2188 -#endif
2189 -
2190 -/* Prevent warning if -Wstrict-prototypes.  */
2191 -#ifdef __GNUC__
2192 -int yyparse (void);
2193 +# define YYMAXDEPTH 10000
2194  #endif
2195  \f
2196 -#if __GNUC__ > 1               /* GNU C and GNU C++ define this.  */
2197 -#define __yy_memcpy(TO,FROM,COUNT)     __builtin_memcpy(TO,FROM,COUNT)
2198 -#else                          /* not GNU C or C++ */
2199 -#ifndef __cplusplus
2200 +#if ! defined (yyoverflow) && ! defined (yymemcpy)
2201 +# if __GNUC__ > 1              /* GNU C and GNU C++ define this.  */
2202 +#  define yymemcpy __builtin_memcpy
2203 +# else                         /* not GNU C or C++ */
2204  
2205  /* This is the most reliable way to avoid incompatibilities
2206     in available built-in functions on various systems.  */
2207  static void
2208 -__yy_memcpy (to, from, count)
2209 -     char *to;
2210 -     char *from;
2211 -     int count;
2212 -{
2213 -  register char *f = from;
2214 -  register char *t = to;
2215 -  register int i = count;
2216 +#  if defined (__STDC__) || defined (__cplusplus)
2217 +yymemcpy (char *yyto, const char *yyfrom, YYSIZE_T yycount)
2218 +#  else
2219 +yymemcpy (yyto, yyfrom, yycount)
2220 +     char *yyto;
2221 +     const char *yyfrom;
2222 +     YYSIZE_T yycount;
2223 +#  endif
2224 +{
2225 +  register const char *yyf = yyfrom;
2226 +  register char *yyt = yyto;
2227 +  register YYSIZE_T yyi = yycount;
2228  
2229 -  while (i-- > 0)
2230 -    *t++ = *f++;
2231 +  while (yyi-- != 0)
2232 +    *yyt++ = *yyf++;
2233  }
2234 +# endif
2235 +#endif
2236  
2237 -#else /* __cplusplus */
2238 +#ifdef YYERROR_VERBOSE
2239  
2240 -/* This is the most reliable way to avoid incompatibilities
2241 -   in available built-in functions on various systems.  */
2242 -static void
2243 -__yy_memcpy (char *to, char *from, int count)
2244 +# ifndef yystrlen
2245 +#  if defined (__GLIBC__) && defined (_STRING_H)
2246 +#   define yystrlen strlen
2247 +#  else
2248 +/* Return the length of YYSTR.  */
2249 +static YYSIZE_T
2250 +#   if defined (__STDC__) || defined (__cplusplus)
2251 +yystrlen (const char *yystr)
2252 +#   else
2253 +yystrlen (yystr)
2254 +     const char *yystr;
2255 +#   endif
2256  {
2257 -  register char *f = from;
2258 -  register char *t = to;
2259 -  register int i = count;
2260 +  register const char *yys = yystr;
2261  
2262 -  while (i-- > 0)
2263 -    *t++ = *f++;
2264 +  while (*yys++ != '\0')
2265 +    continue;
2266 +
2267 +  return yys - yystr - 1;
2268  }
2269 +#  endif
2270 +# endif
2271  
2272 -#endif
2273 +# ifndef yystpcpy
2274 +#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
2275 +#   define yystpcpy stpcpy
2276 +#  else
2277 +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
2278 +   YYDEST.  */
2279 +static char *
2280 +#   if defined (__STDC__) || defined (__cplusplus)
2281 +yystpcpy (char *yydest, const char *yysrc)
2282 +#   else
2283 +yystpcpy (yydest, yysrc)
2284 +     char *yydest;
2285 +     const char *yysrc;
2286 +#   endif
2287 +{
2288 +  register char *yyd = yydest;
2289 +  register const char *yys = yysrc;
2290 +
2291 +  while ((*yyd++ = *yys++) != '\0')
2292 +    continue;
2293 +
2294 +  return yyd - 1;
2295 +}
2296 +#  endif
2297 +# endif
2298  #endif
2299  \f
2300 -#line 196 "/usr/share/bison.simple"
2301 +#line 341 "/usr/share/bison/bison.simple"
2302 +
2303  
2304  /* The user can define YYPARSE_PARAM as the name of an argument to be passed
2305     into yyparse.  The argument should have type void *.
2306 @@ -566,66 +736,121 @@
2307     to the proper pointer type.  */
2308  
2309  #ifdef YYPARSE_PARAM
2310 -#ifdef __cplusplus
2311 -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
2312 -#define YYPARSE_PARAM_DECL
2313 -#else /* not __cplusplus */
2314 -#define YYPARSE_PARAM_ARG YYPARSE_PARAM
2315 -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
2316 -#endif /* not __cplusplus */
2317 -#else /* not YYPARSE_PARAM */
2318 -#define YYPARSE_PARAM_ARG
2319 -#define YYPARSE_PARAM_DECL
2320 -#endif /* not YYPARSE_PARAM */
2321 +# ifdef __cplusplus
2322 +#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
2323 +#  define YYPARSE_PARAM_DECL
2324 +# else /* !__cplusplus */
2325 +#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
2326 +#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
2327 +# endif /* !__cplusplus */
2328 +#else /* !YYPARSE_PARAM */
2329 +# define YYPARSE_PARAM_ARG
2330 +# define YYPARSE_PARAM_DECL
2331 +#endif /* !YYPARSE_PARAM */
2332 +
2333 +/* Prevent warning if -Wstrict-prototypes.  */
2334 +#ifdef __GNUC__
2335 +# ifdef YYPARSE_PARAM
2336 +int yyparse (void *);
2337 +# else
2338 +int yyparse (void);
2339 +# endif
2340 +#endif
2341 +
2342 +/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
2343 +   variables are global, or local to YYPARSE.  */
2344 +
2345 +#define YY_DECL_NON_LSP_VARIABLES                      \
2346 +/* The lookahead symbol.  */                           \
2347 +int yychar;                                            \
2348 +                                                       \
2349 +/* The semantic value of the lookahead symbol. */      \
2350 +YYSTYPE yylval;                                                \
2351 +                                                       \
2352 +/* Number of parse errors so far.  */                  \
2353 +int yynerrs;
2354 +
2355 +#if YYLSP_NEEDED
2356 +# define YY_DECL_VARIABLES                     \
2357 +YY_DECL_NON_LSP_VARIABLES                      \
2358 +                                               \
2359 +/* Location data for the lookahead symbol.  */ \
2360 +YYLTYPE yylloc;
2361 +#else
2362 +# define YY_DECL_VARIABLES                     \
2363 +YY_DECL_NON_LSP_VARIABLES
2364 +#endif
2365 +
2366 +
2367 +/* If nonreentrant, generate the variables here. */
2368 +
2369 +#if !YYPURE
2370 +YY_DECL_VARIABLES
2371 +#endif  /* !YYPURE */
2372  
2373  int
2374 -yyparse(YYPARSE_PARAM_ARG)
2375 +yyparse (YYPARSE_PARAM_ARG)
2376       YYPARSE_PARAM_DECL
2377  {
2378 +  /* If reentrant, generate the variables here. */
2379 +#if YYPURE
2380 +  YY_DECL_VARIABLES
2381 +#endif  /* !YYPURE */
2382 +
2383    register int yystate;
2384    register int yyn;
2385 +  int yyresult;
2386 +  /* Number of tokens to shift before error messages enabled.  */
2387 +  int yyerrstatus;
2388 +  /* Lookahead token as an internal (translated) token number.  */
2389 +  int yychar1 = 0;
2390 +
2391 +  /* Three stacks and their tools:
2392 +     `yyss': related to states,
2393 +     `yyvs': related to semantic values,
2394 +     `yyls': related to locations.
2395 +
2396 +     Refer to the stacks thru separate pointers, to allow yyoverflow
2397 +     to reallocate them elsewhere.  */
2398 +
2399 +  /* The state stack. */
2400 +  short        yyssa[YYINITDEPTH];
2401 +  short *yyss = yyssa;
2402    register short *yyssp;
2403 -  register YYSTYPE *yyvsp;
2404 -  int yyerrstatus;     /*  number of tokens to shift before error messages enabled */
2405 -  int yychar1 = 0;             /*  lookahead token as an internal (translated) token number */
2406 -
2407 -  short        yyssa[YYINITDEPTH];     /*  the state stack                     */
2408 -  YYSTYPE yyvsa[YYINITDEPTH];  /*  the semantic value stack            */
2409  
2410 -  short *yyss = yyssa;         /*  refer to the stacks thru separate pointers */
2411 -  YYSTYPE *yyvs = yyvsa;       /*  to allow yyoverflow to reallocate them elsewhere */
2412 +  /* The semantic value stack.  */
2413 +  YYSTYPE yyvsa[YYINITDEPTH];
2414 +  YYSTYPE *yyvs = yyvsa;
2415 +  register YYSTYPE *yyvsp;
2416  
2417 -#ifdef YYLSP_NEEDED
2418 -  YYLTYPE yylsa[YYINITDEPTH];  /*  the location stack                  */
2419 +#if YYLSP_NEEDED
2420 +  /* The location stack.  */
2421 +  YYLTYPE yylsa[YYINITDEPTH];
2422    YYLTYPE *yyls = yylsa;
2423    YYLTYPE *yylsp;
2424 +#endif
2425  
2426 -#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
2427 +#if YYLSP_NEEDED
2428 +# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
2429  #else
2430 -#define YYPOPSTACK   (yyvsp--, yyssp--)
2431 +# define YYPOPSTACK   (yyvsp--, yyssp--)
2432  #endif
2433  
2434 -  int yystacksize = YYINITDEPTH;
2435 +  YYSIZE_T yystacksize = YYINITDEPTH;
2436  
2437 -#ifdef YYPURE
2438 -  int yychar;
2439 -  YYSTYPE yylval;
2440 -  int yynerrs;
2441 -#ifdef YYLSP_NEEDED
2442 -  YYLTYPE yylloc;
2443 -#endif
2444 -#endif
2445  
2446 -  YYSTYPE yyval;               /*  the variable used to return         */
2447 -                               /*  semantic values from the action     */
2448 -                               /*  routines                            */
2449 +  /* The variables used to return semantic value and location from the
2450 +     action routines.  */
2451 +  YYSTYPE yyval;
2452 +#if YYLSP_NEEDED
2453 +  YYLTYPE yyloc;
2454 +#endif
2455  
2456 +  /* When reducing, the number of symbols on the RHS of the reduced
2457 +     rule. */
2458    int yylen;
2459  
2460 -#if YYDEBUG != 0
2461 -  if (yydebug)
2462 -    fprintf(stderr, "Starting parse\n");
2463 -#endif
2464 +  YYDPRINTF ((stderr, "Starting parse\n"));
2465  
2466    yystate = 0;
2467    yyerrstatus = 0;
2468 @@ -637,96 +862,106 @@
2469       so that they stay on the same level as the state stack.
2470       The wasted elements are never initialized.  */
2471  
2472 -  yyssp = yyss - 1;
2473 +  yyssp = yyss;
2474    yyvsp = yyvs;
2475 -#ifdef YYLSP_NEEDED
2476 +#if YYLSP_NEEDED
2477    yylsp = yyls;
2478  #endif
2479 +  goto yysetstate;
2480  
2481 -/* Push a new state, which is found in  yystate  .  */
2482 -/* In all cases, when you get here, the value and location stacks
2483 -   have just been pushed. so pushing a state here evens the stacks.  */
2484 -yynewstate:
2485 +/*------------------------------------------------------------.
2486 +| yynewstate -- Push a new state, which is found in yystate.  |
2487 +`------------------------------------------------------------*/
2488 + yynewstate:
2489 +  /* In all cases, when you get here, the value and location stacks
2490 +     have just been pushed. so pushing a state here evens the stacks.
2491 +     */
2492 +  yyssp++;
2493  
2494 -  *++yyssp = yystate;
2495 + yysetstate:
2496 +  *yyssp = yystate;
2497  
2498    if (yyssp >= yyss + yystacksize - 1)
2499      {
2500 -      /* Give user a chance to reallocate the stack */
2501 -      /* Use copies of these so that the &'s don't force the real ones into memory. */
2502 -      YYSTYPE *yyvs1 = yyvs;
2503 -      short *yyss1 = yyss;
2504 -#ifdef YYLSP_NEEDED
2505 -      YYLTYPE *yyls1 = yyls;
2506 -#endif
2507 -
2508        /* Get the current used size of the three stacks, in elements.  */
2509 -      int size = yyssp - yyss + 1;
2510 +      YYSIZE_T yysize = yyssp - yyss + 1;
2511  
2512  #ifdef yyoverflow
2513 -      /* Each stack pointer address is followed by the size of
2514 -        the data in use in that stack, in bytes.  */
2515 -#ifdef YYLSP_NEEDED
2516 -      /* This used to be a conditional around just the two extra args,
2517 -        but that might be undefined if yyoverflow is a macro.  */
2518 -      yyoverflow("parser stack overflow",
2519 -                &yyss1, size * sizeof (*yyssp),
2520 -                &yyvs1, size * sizeof (*yyvsp),
2521 -                &yyls1, size * sizeof (*yylsp),
2522 -                &yystacksize);
2523 -#else
2524 -      yyoverflow("parser stack overflow",
2525 -                &yyss1, size * sizeof (*yyssp),
2526 -                &yyvs1, size * sizeof (*yyvsp),
2527 -                &yystacksize);
2528 -#endif
2529 -
2530 -      yyss = yyss1; yyvs = yyvs1;
2531 -#ifdef YYLSP_NEEDED
2532 -      yyls = yyls1;
2533 -#endif
2534 +      {
2535 +       /* Give user a chance to reallocate the stack. Use copies of
2536 +          these so that the &'s don't force the real ones into
2537 +          memory.  */
2538 +       YYSTYPE *yyvs1 = yyvs;
2539 +       short *yyss1 = yyss;
2540 +
2541 +       /* Each stack pointer address is followed by the size of the
2542 +          data in use in that stack, in bytes.  */
2543 +# if YYLSP_NEEDED
2544 +       YYLTYPE *yyls1 = yyls;
2545 +       /* This used to be a conditional around just the two extra args,
2546 +          but that might be undefined if yyoverflow is a macro.  */
2547 +       yyoverflow ("parser stack overflow",
2548 +                   &yyss1, yysize * sizeof (*yyssp),
2549 +                   &yyvs1, yysize * sizeof (*yyvsp),
2550 +                   &yyls1, yysize * sizeof (*yylsp),
2551 +                   &yystacksize);
2552 +       yyls = yyls1;
2553 +# else
2554 +       yyoverflow ("parser stack overflow",
2555 +                   &yyss1, yysize * sizeof (*yyssp),
2556 +                   &yyvs1, yysize * sizeof (*yyvsp),
2557 +                   &yystacksize);
2558 +# endif
2559 +       yyss = yyss1;
2560 +       yyvs = yyvs1;
2561 +      }
2562  #else /* no yyoverflow */
2563        /* Extend the stack our own way.  */
2564        if (yystacksize >= YYMAXDEPTH)
2565 -       {
2566 -         yyerror("parser stack overflow");
2567 -         return 2;
2568 -       }
2569 +       goto yyoverflowlab;
2570        yystacksize *= 2;
2571        if (yystacksize > YYMAXDEPTH)
2572         yystacksize = YYMAXDEPTH;
2573 -      yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
2574 -      __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
2575 -      yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
2576 -      __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
2577 -#ifdef YYLSP_NEEDED
2578 -      yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
2579 -      __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
2580 -#endif
2581 +
2582 +      {
2583 +       short *yyss1 = yyss;
2584 +       union yyalloc *yyptr =
2585 +         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
2586 +       if (! yyptr)
2587 +         goto yyoverflowlab;
2588 +       YYSTACK_RELOCATE (short, yyss);
2589 +       YYSTACK_RELOCATE (YYSTYPE, yyvs);
2590 +# if YYLSP_NEEDED
2591 +       YYSTACK_RELOCATE (YYLTYPE, yyls);
2592 +# endif
2593 +# undef YYSTACK_RELOCATE
2594 +       if (yyss1 != yyssa)
2595 +         YYSTACK_FREE (yyss1);
2596 +      }
2597  #endif /* no yyoverflow */
2598  
2599 -      yyssp = yyss + size - 1;
2600 -      yyvsp = yyvs + size - 1;
2601 -#ifdef YYLSP_NEEDED
2602 -      yylsp = yyls + size - 1;
2603 +      yyssp = yyss + yysize - 1;
2604 +      yyvsp = yyvs + yysize - 1;
2605 +#if YYLSP_NEEDED
2606 +      yylsp = yyls + yysize - 1;
2607  #endif
2608  
2609 -#if YYDEBUG != 0
2610 -      if (yydebug)
2611 -       fprintf(stderr, "Stack size increased to %d\n", yystacksize);
2612 -#endif
2613 +      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
2614 +                 (unsigned long int) yystacksize));
2615  
2616        if (yyssp >= yyss + yystacksize - 1)
2617         YYABORT;
2618      }
2619  
2620 -#if YYDEBUG != 0
2621 -  if (yydebug)
2622 -    fprintf(stderr, "Entering state %d\n", yystate);
2623 -#endif
2624 +  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
2625  
2626    goto yybackup;
2627 - yybackup:
2628 +
2629 +
2630 +/*-----------.
2631 +| yybackup.  |
2632 +`-----------*/
2633 +yybackup:
2634  
2635  /* Do appropriate processing given the current state.  */
2636  /* Read a lookahead token if we need one and don't already have one.  */
2637 @@ -745,10 +980,7 @@
2638  
2639    if (yychar == YYEMPTY)
2640      {
2641 -#if YYDEBUG != 0
2642 -      if (yydebug)
2643 -       fprintf(stderr, "Reading a token: ");
2644 -#endif
2645 +      YYDPRINTF ((stderr, "Reading a token: "));
2646        yychar = YYLEX;
2647      }
2648  
2649 @@ -759,25 +991,25 @@
2650        yychar1 = 0;
2651        yychar = YYEOF;          /* Don't call YYLEX any more */
2652  
2653 -#if YYDEBUG != 0
2654 -      if (yydebug)
2655 -       fprintf(stderr, "Now at end of input.\n");
2656 -#endif
2657 +      YYDPRINTF ((stderr, "Now at end of input.\n"));
2658      }
2659    else
2660      {
2661 -      yychar1 = YYTRANSLATE(yychar);
2662 +      yychar1 = YYTRANSLATE (yychar);
2663  
2664 -#if YYDEBUG != 0
2665 +#if YYDEBUG
2666 +     /* We have to keep this `#if YYDEBUG', since we use variables
2667 +       which are defined only if `YYDEBUG' is set.  */
2668        if (yydebug)
2669         {
2670 -         fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
2671 -         /* Give the individual parser a way to print the precise meaning
2672 -            of a token, for further debugging info.  */
2673 -#ifdef YYPRINT
2674 +         YYFPRINTF (stderr, "Next token is %d (%s",
2675 +                    yychar, yytname[yychar1]);
2676 +         /* Give the individual parser a way to print the precise
2677 +            meaning of a token, for further debugging info.  */
2678 +# ifdef YYPRINT
2679           YYPRINT (stderr, yychar, yylval);
2680 -#endif
2681 -         fprintf (stderr, ")\n");
2682 +# endif
2683 +         YYFPRINTF (stderr, ")\n");
2684         }
2685  #endif
2686      }
2687 @@ -809,88 +1041,110 @@
2688      YYACCEPT;
2689  
2690    /* Shift the lookahead token.  */
2691 -
2692 -#if YYDEBUG != 0
2693 -  if (yydebug)
2694 -    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
2695 -#endif
2696 +  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
2697 +             yychar, yytname[yychar1]));
2698  
2699    /* Discard the token being shifted unless it is eof.  */
2700    if (yychar != YYEOF)
2701      yychar = YYEMPTY;
2702  
2703    *++yyvsp = yylval;
2704 -#ifdef YYLSP_NEEDED
2705 +#if YYLSP_NEEDED
2706    *++yylsp = yylloc;
2707  #endif
2708  
2709 -  /* count tokens shifted since error; after three, turn off error status.  */
2710 -  if (yyerrstatus) yyerrstatus--;
2711 +  /* Count tokens shifted since error; after three, turn off error
2712 +     status.  */
2713 +  if (yyerrstatus)
2714 +    yyerrstatus--;
2715  
2716    yystate = yyn;
2717    goto yynewstate;
2718  
2719 -/* Do the default action for the current state.  */
2720 -yydefault:
2721  
2722 +/*-----------------------------------------------------------.
2723 +| yydefault -- do the default action for the current state.  |
2724 +`-----------------------------------------------------------*/
2725 +yydefault:
2726    yyn = yydefact[yystate];
2727    if (yyn == 0)
2728      goto yyerrlab;
2729 +  goto yyreduce;
2730 +
2731  
2732 -/* Do a reduction.  yyn is the number of a rule to reduce with.  */
2733 +/*-----------------------------.
2734 +| yyreduce -- Do a reduction.  |
2735 +`-----------------------------*/
2736  yyreduce:
2737 +  /* yyn is the number of a rule to reduce with.  */
2738    yylen = yyr2[yyn];
2739 -  if (yylen > 0)
2740 -    yyval = yyvsp[1-yylen]; /* implement default value of the action */
2741  
2742 -#if YYDEBUG != 0
2743 +  /* If YYLEN is nonzero, implement the default value of the action:
2744 +     `$$ = $1'.
2745 +
2746 +     Otherwise, the following line sets YYVAL to the semantic value of
2747 +     the lookahead token.  This behavior is undocumented and Bison
2748 +     users should not rely upon it.  Assigning to YYVAL
2749 +     unconditionally makes the parser a bit smaller, and it avoids a
2750 +     GCC warning that YYVAL may be used uninitialized.  */
2751 +  yyval = yyvsp[1-yylen];
2752 +
2753 +#if YYLSP_NEEDED
2754 +  /* Similarly for the default location.  Let the user run additional
2755 +     commands if for instance locations are ranges.  */
2756 +  yyloc = yylsp[1-yylen];
2757 +  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
2758 +#endif
2759 +
2760 +#if YYDEBUG
2761 +  /* We have to keep this `#if YYDEBUG', since we use variables which
2762 +     are defined only if `YYDEBUG' is set.  */
2763    if (yydebug)
2764      {
2765 -      int i;
2766 +      int yyi;
2767  
2768 -      fprintf (stderr, "Reducing via rule %d (line %d), ",
2769 -              yyn, yyrline[yyn]);
2770 +      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
2771 +                yyn, yyrline[yyn]);
2772  
2773        /* Print the symbols being reduced, and their result.  */
2774 -      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
2775 -       fprintf (stderr, "%s ", yytname[yyrhs[i]]);
2776 -      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
2777 +      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
2778 +       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
2779 +      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
2780      }
2781  #endif
2782  
2783 -
2784    switch (yyn) {
2785  
2786  case 3:
2787  #line 195 "getdate.y"
2788  {
2789             yyHaveTime++;
2790 -       ;
2791 -    break;}
2792 +       }
2793 +    break;
2794  case 4:
2795  #line 198 "getdate.y"
2796  {
2797             yyHaveZone++;
2798 -       ;
2799 -    break;}
2800 +       }
2801 +    break;
2802  case 5:
2803  #line 201 "getdate.y"
2804  {
2805             yyHaveDate++;
2806 -       ;
2807 -    break;}
2808 +       }
2809 +    break;
2810  case 6:
2811  #line 204 "getdate.y"
2812  {
2813             yyHaveDay++;
2814 -       ;
2815 -    break;}
2816 +       }
2817 +    break;
2818  case 7:
2819  #line 207 "getdate.y"
2820  {
2821             yyHaveRel++;
2822 -       ;
2823 -    break;}
2824 +       }
2825 +    break;
2826  case 9:
2827  #line 213 "getdate.y"
2828  {
2829 @@ -898,8 +1152,8 @@
2830             yyMinutes = 0;
2831             yySeconds = 0;
2832             yyMeridian = yyvsp[0].Meridian;
2833 -       ;
2834 -    break;}
2835 +       }
2836 +    break;
2837  case 10:
2838  #line 219 "getdate.y"
2839  {
2840 @@ -907,8 +1161,8 @@
2841             yyMinutes = yyvsp[-1].Number;
2842             yySeconds = 0;
2843             yyMeridian = yyvsp[0].Meridian;
2844 -       ;
2845 -    break;}
2846 +       }
2847 +    break;
2848  case 11:
2849  #line 225 "getdate.y"
2850  {
2851 @@ -919,8 +1173,8 @@
2852             yyTimezone = (yyvsp[0].Number < 0
2853                           ? -yyvsp[0].Number % 100 + (-yyvsp[0].Number / 100) * 60
2854                           : - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60));
2855 -       ;
2856 -    break;}
2857 +       }
2858 +    break;
2859  case 12:
2860  #line 234 "getdate.y"
2861  {
2862 @@ -928,8 +1182,8 @@
2863             yyMinutes = yyvsp[-3].Number;
2864             yySeconds = yyvsp[-1].Number;
2865             yyMeridian = yyvsp[0].Meridian;
2866 -       ;
2867 -    break;}
2868 +       }
2869 +    break;
2870  case 13:
2871  #line 240 "getdate.y"
2872  {
2873 @@ -941,54 +1195,54 @@
2874             yyTimezone = (yyvsp[0].Number < 0
2875                           ? -yyvsp[0].Number % 100 + (-yyvsp[0].Number / 100) * 60
2876                           : - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60));
2877 -       ;
2878 -    break;}
2879 +       }
2880 +    break;
2881  case 14:
2882  #line 252 "getdate.y"
2883  {
2884             yyTimezone = yyvsp[0].Number;
2885 -       ;
2886 -    break;}
2887 +       }
2888 +    break;
2889  case 15:
2890  #line 255 "getdate.y"
2891  {
2892             yyTimezone = yyvsp[0].Number - 60;
2893 -       ;
2894 -    break;}
2895 +       }
2896 +    break;
2897  case 16:
2898  #line 259 "getdate.y"
2899  {
2900             yyTimezone = yyvsp[-1].Number - 60;
2901 -       ;
2902 -    break;}
2903 +       }
2904 +    break;
2905  case 17:
2906  #line 264 "getdate.y"
2907  {
2908             yyDayOrdinal = 1;
2909             yyDayNumber = yyvsp[0].Number;
2910 -       ;
2911 -    break;}
2912 +       }
2913 +    break;
2914  case 18:
2915  #line 268 "getdate.y"
2916  {
2917             yyDayOrdinal = 1;
2918             yyDayNumber = yyvsp[-1].Number;
2919 -       ;
2920 -    break;}
2921 +       }
2922 +    break;
2923  case 19:
2924  #line 272 "getdate.y"
2925  {
2926             yyDayOrdinal = yyvsp[-1].Number;
2927             yyDayNumber = yyvsp[0].Number;
2928 -       ;
2929 -    break;}
2930 +       }
2931 +    break;
2932  case 20:
2933  #line 278 "getdate.y"
2934  {
2935             yyMonth = yyvsp[-2].Number;
2936             yyDay = yyvsp[0].Number;
2937 -       ;
2938 -    break;}
2939 +       }
2940 +    break;
2941  case 21:
2942  #line 282 "getdate.y"
2943  {
2944 @@ -1008,8 +1262,8 @@
2945               yyDay = yyvsp[-2].Number;
2946               yyYear = yyvsp[0].Number;
2947             }
2948 -       ;
2949 -    break;}
2950 +       }
2951 +    break;
2952  case 22:
2953  #line 300 "getdate.y"
2954  {
2955 @@ -1017,8 +1271,8 @@
2956             yyYear = yyvsp[-2].Number;
2957             yyMonth = -yyvsp[-1].Number;
2958             yyDay = -yyvsp[0].Number;
2959 -       ;
2960 -    break;}
2961 +       }
2962 +    break;
2963  case 23:
2964  #line 306 "getdate.y"
2965  {
2966 @@ -1026,38 +1280,38 @@
2967             yyDay = yyvsp[-2].Number;
2968             yyMonth = yyvsp[-1].Number;
2969             yyYear = -yyvsp[0].Number;
2970 -       ;
2971 -    break;}
2972 +       }
2973 +    break;
2974  case 24:
2975  #line 312 "getdate.y"
2976  {
2977             yyMonth = yyvsp[-1].Number;
2978             yyDay = yyvsp[0].Number;
2979 -       ;
2980 -    break;}
2981 +       }
2982 +    break;
2983  case 25:
2984  #line 316 "getdate.y"
2985  {
2986             yyMonth = yyvsp[-3].Number;
2987             yyDay = yyvsp[-2].Number;
2988             yyYear = yyvsp[0].Number;
2989 -       ;
2990 -    break;}
2991 +       }
2992 +    break;
2993  case 26:
2994  #line 321 "getdate.y"
2995  {
2996             yyMonth = yyvsp[0].Number;
2997             yyDay = yyvsp[-1].Number;
2998 -       ;
2999 -    break;}
3000 +       }
3001 +    break;
3002  case 27:
3003  #line 325 "getdate.y"
3004  {
3005             yyMonth = yyvsp[-1].Number;
3006             yyDay = yyvsp[-2].Number;
3007             yyYear = yyvsp[0].Number;
3008 -       ;
3009 -    break;}
3010 +       }
3011 +    break;
3012  case 28:
3013  #line 332 "getdate.y"
3014  {
3015 @@ -1067,116 +1321,116 @@
3016             yyRelDay = -yyRelDay;
3017             yyRelMonth = -yyRelMonth;
3018             yyRelYear = -yyRelYear;
3019 -       ;
3020 -    break;}
3021 +       }
3022 +    break;
3023  case 30:
3024  #line 343 "getdate.y"
3025  {
3026             yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
3027 -       ;
3028 -    break;}
3029 +       }
3030 +    break;
3031  case 31:
3032  #line 346 "getdate.y"
3033  {
3034             yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
3035 -       ;
3036 -    break;}
3037 +       }
3038 +    break;
3039  case 32:
3040  #line 349 "getdate.y"
3041  {
3042             yyRelYear++;
3043 -       ;
3044 -    break;}
3045 +       }
3046 +    break;
3047  case 33:
3048  #line 352 "getdate.y"
3049  {
3050             yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
3051 -       ;
3052 -    break;}
3053 +       }
3054 +    break;
3055  case 34:
3056  #line 355 "getdate.y"
3057  {
3058             yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
3059 -       ;
3060 -    break;}
3061 +       }
3062 +    break;
3063  case 35:
3064  #line 358 "getdate.y"
3065  {
3066             yyRelMonth++;
3067 -       ;
3068 -    break;}
3069 +       }
3070 +    break;
3071  case 36:
3072  #line 361 "getdate.y"
3073  {
3074             yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
3075 -       ;
3076 -    break;}
3077 +       }
3078 +    break;
3079  case 37:
3080  #line 364 "getdate.y"
3081  {
3082             yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
3083 -       ;
3084 -    break;}
3085 +       }
3086 +    break;
3087  case 38:
3088  #line 367 "getdate.y"
3089  {
3090             yyRelDay++;
3091 -       ;
3092 -    break;}
3093 +       }
3094 +    break;
3095  case 39:
3096  #line 370 "getdate.y"
3097  {
3098             yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
3099 -       ;
3100 -    break;}
3101 +       }
3102 +    break;
3103  case 40:
3104  #line 373 "getdate.y"
3105  {
3106             yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
3107 -       ;
3108 -    break;}
3109 +       }
3110 +    break;
3111  case 41:
3112  #line 376 "getdate.y"
3113  {
3114             yyRelHour++;
3115 -       ;
3116 -    break;}
3117 +       }
3118 +    break;
3119  case 42:
3120  #line 379 "getdate.y"
3121  {
3122             yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
3123 -       ;
3124 -    break;}
3125 +       }
3126 +    break;
3127  case 43:
3128  #line 382 "getdate.y"
3129  {
3130             yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
3131 -       ;
3132 -    break;}
3133 +       }
3134 +    break;
3135  case 44:
3136  #line 385 "getdate.y"
3137  {
3138             yyRelMinutes++;
3139 -       ;
3140 -    break;}
3141 +       }
3142 +    break;
3143  case 45:
3144  #line 388 "getdate.y"
3145  {
3146             yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
3147 -       ;
3148 -    break;}
3149 +       }
3150 +    break;
3151  case 46:
3152  #line 391 "getdate.y"
3153  {
3154             yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
3155 -       ;
3156 -    break;}
3157 +       }
3158 +    break;
3159  case 47:
3160  #line 394 "getdate.y"
3161  {
3162             yyRelSeconds++;
3163 -       ;
3164 -    break;}
3165 +       }
3166 +    break;
3167  case 48:
3168  #line 400 "getdate.y"
3169  {
3170 @@ -1208,64 +1462,50 @@
3171                     yyMeridian = MER24;
3172                   }
3173               }
3174 -         ;
3175 -    break;}
3176 +         }
3177 +    break;
3178  case 49:
3179  #line 433 "getdate.y"
3180  {
3181             yyval.Meridian = MER24;
3182 -         ;
3183 -    break;}
3184 +         }
3185 +    break;
3186  case 50:
3187  #line 437 "getdate.y"
3188  {
3189             yyval.Meridian = yyvsp[0].Meridian;
3190 -         ;
3191 -    break;}
3192 +         }
3193 +    break;
3194  }
3195 -   /* the action file gets copied in in place of this dollarsign */
3196 -#line 498 "/usr/share/bison.simple"
3197 +
3198 +#line 727 "/usr/share/bison/bison.simple"
3199 +
3200  \f
3201    yyvsp -= yylen;
3202    yyssp -= yylen;
3203 -#ifdef YYLSP_NEEDED
3204 +#if YYLSP_NEEDED
3205    yylsp -= yylen;
3206  #endif
3207  
3208 -#if YYDEBUG != 0
3209 +#if YYDEBUG
3210    if (yydebug)
3211      {
3212 -      short *ssp1 = yyss - 1;
3213 -      fprintf (stderr, "state stack now");
3214 -      while (ssp1 != yyssp)
3215 -       fprintf (stderr, " %d", *++ssp1);
3216 -      fprintf (stderr, "\n");
3217 +      short *yyssp1 = yyss - 1;
3218 +      YYFPRINTF (stderr, "state stack now");
3219 +      while (yyssp1 != yyssp)
3220 +       YYFPRINTF (stderr, " %d", *++yyssp1);
3221 +      YYFPRINTF (stderr, "\n");
3222      }
3223  #endif
3224  
3225    *++yyvsp = yyval;
3226 -
3227 -#ifdef YYLSP_NEEDED
3228 -  yylsp++;
3229 -  if (yylen == 0)
3230 -    {
3231 -      yylsp->first_line = yylloc.first_line;
3232 -      yylsp->first_column = yylloc.first_column;
3233 -      yylsp->last_line = (yylsp-1)->last_line;
3234 -      yylsp->last_column = (yylsp-1)->last_column;
3235 -      yylsp->text = 0;
3236 -    }
3237 -  else
3238 -    {
3239 -      yylsp->last_line = (yylsp+yylen-1)->last_line;
3240 -      yylsp->last_column = (yylsp+yylen-1)->last_column;
3241 -    }
3242 +#if YYLSP_NEEDED
3243 +  *++yylsp = yyloc;
3244  #endif
3245  
3246 -  /* Now "shift" the result of the reduction.
3247 -     Determine what state that goes to,
3248 -     based on the state we popped back to
3249 -     and the rule number reduced by.  */
3250 +  /* Now `shift' the result of the reduction.  Determine what state
3251 +     that goes to, based on the state we popped back to and the rule
3252 +     number reduced by.  */
3253  
3254    yyn = yyr1[yyn];
3255  
3256 @@ -1277,10 +1517,13 @@
3257  
3258    goto yynewstate;
3259  
3260 -yyerrlab:   /* here on detecting error */
3261  
3262 -  if (! yyerrstatus)
3263 -    /* If not already recovering from an error, report this error.  */
3264 +/*------------------------------------.
3265 +| yyerrlab -- here on detecting error |
3266 +`------------------------------------*/
3267 +yyerrlab:
3268 +  /* If not already recovering from an error, report this error.  */
3269 +  if (!yyerrstatus)
3270      {
3271        ++yynerrs;
3272  
3273 @@ -1289,102 +1532,121 @@
3274  
3275        if (yyn > YYFLAG && yyn < YYLAST)
3276         {
3277 -         int size = 0;
3278 -         char *msg;
3279 -         int x, count;
3280 -
3281 -         count = 0;
3282 -         /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
3283 -         for (x = (yyn < 0 ? -yyn : 0);
3284 -              x < (sizeof(yytname) / sizeof(char *)); x++)
3285 -           if (yycheck[x + yyn] == x)
3286 -             size += strlen(yytname[x]) + 15, count++;
3287 -         msg = (char *) malloc(size + 15);
3288 -         if (msg != 0)
3289 +         YYSIZE_T yysize = 0;
3290 +         char *yymsg;
3291 +         int yyx, yycount;
3292 +
3293 +         yycount = 0;
3294 +         /* Start YYX at -YYN if negative to avoid negative indexes in
3295 +            YYCHECK.  */
3296 +         for (yyx = yyn < 0 ? -yyn : 0;
3297 +              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
3298 +           if (yycheck[yyx + yyn] == yyx)
3299 +             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
3300 +         yysize += yystrlen ("parse error, unexpected ") + 1;
3301 +         yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
3302 +         yymsg = (char *) YYSTACK_ALLOC (yysize);
3303 +         if (yymsg != 0)
3304             {
3305 -             strcpy(msg, "parse error");
3306 +             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
3307 +             yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
3308  
3309 -             if (count < 5)
3310 +             if (yycount < 5)
3311                 {
3312 -                 count = 0;
3313 -                 for (x = (yyn < 0 ? -yyn : 0);
3314 -                      x < (sizeof(yytname) / sizeof(char *)); x++)
3315 -                   if (yycheck[x + yyn] == x)
3316 +                 yycount = 0;
3317 +                 for (yyx = yyn < 0 ? -yyn : 0;
3318 +                      yyx < (int) (sizeof (yytname) / sizeof (char *));
3319 +                      yyx++)
3320 +                   if (yycheck[yyx + yyn] == yyx)
3321                       {
3322 -                       strcat(msg, count == 0 ? ", expecting `" : " or `");
3323 -                       strcat(msg, yytname[x]);
3324 -                       strcat(msg, "'");
3325 -                       count++;
3326 +                       const char *yyq = ! yycount ? ", expecting " : " or ";
3327 +                       yyp = yystpcpy (yyp, yyq);
3328 +                       yyp = yystpcpy (yyp, yytname[yyx]);
3329 +                       yycount++;
3330                       }
3331                 }
3332 -             yyerror(msg);
3333 -             free(msg);
3334 +             yyerror (yymsg);
3335 +             YYSTACK_FREE (yymsg);
3336             }
3337           else
3338 -           yyerror ("parse error; also virtual memory exceeded");
3339 +           yyerror ("parse error; also virtual memory exhausted");
3340         }
3341        else
3342 -#endif /* YYERROR_VERBOSE */
3343 -       yyerror("parse error");
3344 +#endif /* defined (YYERROR_VERBOSE) */
3345 +       yyerror ("parse error");
3346      }
3347 -
3348    goto yyerrlab1;
3349 -yyerrlab1:   /* here on error raised explicitly by an action */
3350  
3351 +
3352 +/*--------------------------------------------------.
3353 +| yyerrlab1 -- error raised explicitly by an action |
3354 +`--------------------------------------------------*/
3355 +yyerrlab1:
3356    if (yyerrstatus == 3)
3357      {
3358 -      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
3359 +      /* If just tried and failed to reuse lookahead token after an
3360 +        error, discard it.  */
3361  
3362        /* return failure if at end of input */
3363        if (yychar == YYEOF)
3364         YYABORT;
3365 -
3366 -#if YYDEBUG != 0
3367 -      if (yydebug)
3368 -       fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
3369 -#endif
3370 -
3371 +      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
3372 +                 yychar, yytname[yychar1]));
3373        yychar = YYEMPTY;
3374      }
3375  
3376 -  /* Else will try to reuse lookahead token
3377 -     after shifting the error token.  */
3378 +  /* Else will try to reuse lookahead token after shifting the error
3379 +     token.  */
3380  
3381    yyerrstatus = 3;             /* Each real token shifted decrements this */
3382  
3383    goto yyerrhandle;
3384  
3385 -yyerrdefault:  /* current state does not do anything special for the error token. */
3386  
3387 +/*-------------------------------------------------------------------.
3388 +| yyerrdefault -- current state does not do anything special for the |
3389 +| error token.                                                       |
3390 +`-------------------------------------------------------------------*/
3391 +yyerrdefault:
3392  #if 0
3393    /* This is wrong; only states that explicitly want error tokens
3394       should shift them.  */
3395 -  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
3396 -  if (yyn) goto yydefault;
3397 +
3398 +  /* If its default is to accept any token, ok.  Otherwise pop it.  */
3399 +  yyn = yydefact[yystate];
3400 +  if (yyn)
3401 +    goto yydefault;
3402  #endif
3403  
3404 -yyerrpop:   /* pop the current state because it cannot handle the error token */
3405  
3406 -  if (yyssp == yyss) YYABORT;
3407 +/*---------------------------------------------------------------.
3408 +| yyerrpop -- pop the current state because it cannot handle the |
3409 +| error token                                                    |
3410 +`---------------------------------------------------------------*/
3411 +yyerrpop:
3412 +  if (yyssp == yyss)
3413 +    YYABORT;
3414    yyvsp--;
3415    yystate = *--yyssp;
3416 -#ifdef YYLSP_NEEDED
3417 +#if YYLSP_NEEDED
3418    yylsp--;
3419  #endif
3420  
3421 -#if YYDEBUG != 0
3422 +#if YYDEBUG
3423    if (yydebug)
3424      {
3425 -      short *ssp1 = yyss - 1;
3426 -      fprintf (stderr, "Error: state stack now");
3427 -      while (ssp1 != yyssp)
3428 -       fprintf (stderr, " %d", *++ssp1);
3429 -      fprintf (stderr, "\n");
3430 +      short *yyssp1 = yyss - 1;
3431 +      YYFPRINTF (stderr, "Error: state stack now");
3432 +      while (yyssp1 != yyssp)
3433 +       YYFPRINTF (stderr, " %d", *++yyssp1);
3434 +      YYFPRINTF (stderr, "\n");
3435      }
3436  #endif
3437  
3438 +/*--------------.
3439 +| yyerrhandle.  |
3440 +`--------------*/
3441  yyerrhandle:
3442 -
3443    yyn = yypact[yystate];
3444    if (yyn == YYFLAG)
3445      goto yyerrdefault;
3446 @@ -1407,18 +1669,45 @@
3447    if (yyn == YYFINAL)
3448      YYACCEPT;
3449  
3450 -#if YYDEBUG != 0
3451 -  if (yydebug)
3452 -    fprintf(stderr, "Shifting error token, ");
3453 -#endif
3454 +  YYDPRINTF ((stderr, "Shifting error token, "));
3455  
3456    *++yyvsp = yylval;
3457 -#ifdef YYLSP_NEEDED
3458 +#if YYLSP_NEEDED
3459    *++yylsp = yylloc;
3460  #endif
3461  
3462    yystate = yyn;
3463    goto yynewstate;
3464 +
3465 +
3466 +/*-------------------------------------.
3467 +| yyacceptlab -- YYACCEPT comes here.  |
3468 +`-------------------------------------*/
3469 +yyacceptlab:
3470 +  yyresult = 0;
3471 +  goto yyreturn;
3472 +
3473 +/*-----------------------------------.
3474 +| yyabortlab -- YYABORT comes here.  |
3475 +`-----------------------------------*/
3476 +yyabortlab:
3477 +  yyresult = 1;
3478 +  goto yyreturn;
3479 +
3480 +/*---------------------------------------------.
3481 +| yyoverflowab -- parser overflow comes here.  |
3482 +`---------------------------------------------*/
3483 +yyoverflowlab:
3484 +  yyerror ("parser stack overflow");
3485 +  yyresult = 2;
3486 +  /* Fall through.  */
3487 +
3488 +yyreturn:
3489 +#ifndef yyoverflow
3490 +  if (yyss != yyssa)
3491 +    YYSTACK_FREE (yyss);
3492 +#endif
3493 +  return yyresult;
3494  }
3495  #line 442 "getdate.y"
3496  
3497 --- shadow-4.0.3.orig/libmisc/chowntty.c
3498 +++ shadow-4.0.3/libmisc/chowntty.c
3499 @@ -44,6 +44,11 @@
3500  #include <pwd.h>
3501  #include "getdef.h"
3502  
3503 +#ifdef CONFIG_FLASK
3504 +#include <selinux/ss.h>
3505 +#include <selinux/fs_secure.h>
3506 +#endif
3507 +
3508  /*
3509   * is_my_tty -- determine if "tty" is the same as TTY stdin is using
3510   */
3511 @@ -68,12 +73,20 @@
3512   */
3513  
3514  void
3515 -chown_tty(const char *tty, const struct passwd *info)
3516 +chown_tty(const char *tty, const struct passwd *info
3517 +#ifdef CONFIG_FLASK
3518 +, int FLASK_flag, security_id_t user_sid, security_id_t *ttyn_sid
3519 +#endif
3520 +)
3521  {
3522         char buf[200], full_tty[200];
3523         char    *group;         /* TTY group name or number */
3524         struct  group   *grent;
3525         gid_t gid;
3526 +#ifdef CONFIG_FLASK
3527 +       security_id_t newdev_sid;   /* The new sid of a device */
3528 +       struct stat statbuf;
3529 +#endif
3530  
3531         /*
3532          * See if login.defs has some value configured for the port group
3533 @@ -116,9 +129,29 @@
3534                         tty, info->pw_name));
3535                 closelog();
3536  
3537 -               if (!(err == EROFS && info->pw_uid == 0))
3538 +               if (err != EROFS)
3539                         exit(1);
3540         }
3541 +#ifdef CONFIG_FLASK
3542 +       if(FLASK_flag)
3543 +       {
3544 +               if(stat_secure(tty, &statbuf, ttyn_sid) != 0)
3545 +               {
3546 +                       perror("stat_secure");
3547 +                       exit (0);
3548 +               }
3549 +               if(security_change_sid (user_sid, *ttyn_sid, SECCLASS_CHR_FILE, &newdev_sid) != 0)
3550 +               {
3551 +                       perror("security_change_sid");
3552 +                       exit (0);
3553 +               }
3554 +               if(chsid(tty, newdev_sid) != 0)
3555 +               {
3556 +                       perror("chsid");
3557 +                       exit(0);
3558 +               }
3559 +       }
3560 +#endif
3561  
3562  #ifdef __linux__
3563         /*
3564 --- shadow-4.0.3.orig/libmisc/failure.c
3565 +++ shadow-4.0.3/libmisc/failure.c
3566 @@ -39,7 +39,11 @@
3567  #include "getdef.h"
3568  #include "failure.h"
3569  
3570 +#ifdef HAVE_UTMPX_H
3571 +#include <utmpx.h>
3572 +#else
3573  #include <utmp.h>
3574 +#endif
3575  
3576  #define        YEAR    (365L*DAY)
3577  
3578 @@ -248,7 +252,13 @@
3579   */
3580  
3581  void
3582 -failtmp(const struct utmp *failent)
3583 +failtmp(
3584 +#ifdef HAVE_UTMPX_H
3585 +       const struct utmpx *failent
3586 +#else
3587 +       const struct utmp *failent
3588 +#endif
3589 +)
3590  {
3591         char *ftmp;
3592         int fd;
3593 --- shadow-4.0.3.orig/libmisc/failure.h
3594 +++ shadow-4.0.3/libmisc/failure.h
3595 @@ -4,7 +4,11 @@
3596  
3597  #include "defines.h"
3598  #include "faillog.h"
3599 +#ifdef HAVE_UTMPX_H
3600 +#include <utmpx.h>
3601 +#else
3602  #include <utmp.h>
3603 +#endif
3604  
3605  /*
3606   * failure - make failure entry
3607 @@ -38,7 +42,11 @@
3608   *     failtmp updates the (struct utmp) formatted failure log which
3609   *     maintains a record of all login failures.
3610   */
3611 +#ifdef HAVE_UTMPX_H
3612 +extern void failtmp(const struct utmpx *);
3613 +#else
3614  extern void failtmp(const struct utmp *);
3615 +#endif
3616  
3617  #endif
3618  
3619 --- shadow-4.0.3.orig/configure.in
3620 +++ shadow-4.0.3/configure.in
3621 @@ -138,7 +138,7 @@
3622  fi
3623  
3624  AC_MSG_CHECKING(location of shared mail directory)
3625 -for maildir in /var/spool/mail /var/mail /usr/spool/mail /usr/mail NONE; do
3626 +for maildir in /var/mail /var/spool/mail /usr/spool/mail /usr/mail NONE; do
3627         if test "$maildir" = "NONE"; then
3628                 AC_MSG_RESULT(None)
3629         elif test -d $maildir; then
3630 @@ -211,6 +211,7 @@
3631  AC_ARG_WITH(libpam,   [  --with-libpam           use libpam for PAM support])
3632  AC_ARG_WITH(libskey,  [  --with-libskey          use libskey for S/Key support])
3633  AC_ARG_WITH(libtcfs,  [  --with-libtcfs          use libtcfs for TCFS support])
3634 +AC_ARG_WITH(selinux,  [  --with-selinux          use SE Linux support])
3635  
3636  dnl Check for some functions in libc first, only if not found check for
3637  dnl other libraries.  This should prevent linking libnsl if not really
3638 @@ -260,14 +261,20 @@
3639         AC_CHECK_LIB(tcfs, tcfs_encrypt_key, AC_DEFINE(HAVE_TCFS) AC_DEFINE(TCFS_GDBM_SUPPORT) LIBTCFS="-ltcfs -lgdbm", , -lgdbm)
3640  fi
3641  
3642 +AC_SUBST(SEC_LDADD)
3643 +if test "$with_libpam" = "yes"; then
3644 +       SEC_LDADD=-lselinux
3645 +       CFLAGS="$CFLAGS -DCONFIG_FLASK -I/usr/include/selinux"
3646 +fi
3647  AC_SUBST(LIBPAM)
3648  if test "$with_libpam" = "yes"; then
3649         AC_CHECK_LIB(pam, pam_start,
3650                 [AC_DEFINE(USE_PAM)
3651                 LIBPAM="-lpam"
3652 -               AC_CHECK_LIB(pam_misc, main,
3653 +               AC_CHECK_LIB(pam_misc, misc_conv,
3654                         [LIBPAM="$LIBPAM -lpam_misc"],
3655 -                       AC_MSG_ERROR(libpam_misc is missing)
3656 +                       AC_MSG_ERROR(libpam_misc is missing),
3657 +                       -lpam
3658                 )]
3659                 [AC_MSG_CHECKING(use login access checking if PAM not used)
3660                 AC_DEFINE(LOGIN_ACCESS)
3661 @@ -305,7 +312,6 @@
3662         lib/Makefile
3663         src/Makefile
3664         contrib/Makefile
3665 -       debian/Makefile
3666         etc/Makefile
3667         etc/pam.d/Makefile
3668         shadow.spec])
3669 --- shadow-4.0.3.orig/Makefile.am
3670 +++ shadow-4.0.3/Makefile.am
3671 @@ -5,4 +5,4 @@
3672  AUTOMAKE_OPTIONS = 1.5 dist-bzip2 foreign
3673  
3674  SUBDIRS = intl po man libmisc lib src \
3675 -       contrib debian doc etc
3676 +       contrib doc etc
This page took 0.30596 seconds and 3 git commands to generate.