155682Smarkm/*
2233294Sstas * Copyright (c) 1997, 1998, 1999 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
555682Smarkm *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
955682Smarkm *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors
18233294Sstas *    may be used to endorse or promote products derived from this software
19233294Sstas *    without specific prior written permission.
2055682Smarkm *
21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31233294Sstas * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include "login_locl.h"
3555682Smarkm
36233294SstasRCSID("$Id$");
3755682Smarkm
3855682Smarkm#ifdef HAVE_SHADOW_H
3955682Smarkm
4055682Smarkm#ifndef _PATH_CHPASS
4155682Smarkm#define _PATH_CHPASS "/usr/bin/passwd"
4255682Smarkm#endif
4355682Smarkm
4455682Smarkmstatic int
4555682Smarkmchange_passwd(const struct passwd *who)
4655682Smarkm{
4755682Smarkm    int status;
4855682Smarkm    pid_t pid;
4955682Smarkm
5055682Smarkm    switch (pid = fork()) {
5155682Smarkm    case -1:
5255682Smarkm        printf("fork /bin/passwd");
5355682Smarkm        exit(1);
5455682Smarkm    case 0:
5555682Smarkm        execlp(_PATH_CHPASS, "passwd", who->pw_name, (char *) 0);
5655682Smarkm        exit(1);
5755682Smarkm    default:
5855682Smarkm        waitpid(pid, &status, 0);
5955682Smarkm        return (status);
6055682Smarkm    }
6155682Smarkm}
6255682Smarkm
63233294Sstasvoid
6455682Smarkmcheck_shadow(const struct passwd *pw, const struct spwd *sp)
6555682Smarkm{
6655682Smarkm  long today;
6755682Smarkm
6855682Smarkm  today = time(0)/(24L * 60 * 60);
69233294Sstas
7055682Smarkm  if (sp == NULL)
7155682Smarkm      return;
7255682Smarkm
7355682Smarkm  if (sp->sp_expire > 0) {
7455682Smarkm        if (today >= sp->sp_expire) {
7555682Smarkm            printf("Your account has expired.\n");
7655682Smarkm            sleep(1);
7755682Smarkm            exit(0);
7855682Smarkm        } else if (sp->sp_expire - today < 14) {
7955682Smarkm            printf("Your account will expire in %d days.\n",
8055682Smarkm                   (int)(sp->sp_expire - today));
8155682Smarkm        }
8255682Smarkm  }
8355682Smarkm
8455682Smarkm  if (sp->sp_max > 0) {
8555682Smarkm        if (today >= (sp->sp_lstchg + sp->sp_max)) {
8655682Smarkm            printf("Your password has expired. Choose a new one.\n");
8755682Smarkm            change_passwd(pw);
8855682Smarkm        } else if (sp->sp_warn > 0
8955682Smarkm            && (today > (sp->sp_lstchg + sp->sp_max - sp->sp_warn))) {
9055682Smarkm            printf("Your password will expire in %d days.\n",
9155682Smarkm                   (int)(sp->sp_lstchg + sp->sp_max - today));
9255682Smarkm        }
9355682Smarkm  }
9455682Smarkm}
9555682Smarkm#endif /* HAVE_SHADOW_H */
96