From owner-freebsd-bugs Tue Feb 19 19: 0:21 2002 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 6D8AC37B41C for ; Tue, 19 Feb 2002 19:00:03 -0800 (PST) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g1K303677884; Tue, 19 Feb 2002 19:00:03 -0800 (PST) (envelope-from gnats) Received: from core.usrlib.org (cc2-24.217.114.114.charter-stl.com [24.217.114.114]) by hub.freebsd.org (Postfix) with ESMTP id A491137B41F for ; Tue, 19 Feb 2002 18:56:57 -0800 (PST) Received: by core.usrlib.org (Postfix, from userid 1001) id 59D8AA811; Tue, 19 Feb 2002 20:56:47 -0600 (CST) Message-Id: <20020220025647.59D8AA811@core.usrlib.org> Date: Tue, 19 Feb 2002 20:56:47 -0600 (CST) From: Andrew Hesford Reply-To: Andrew Hesford To: FreeBSD-gnats-submit@freebsd.org Cc: jester@core.usrlib.org X-Send-Pr-Version: 3.113 Subject: bin/35129: Maildir support in login(1) Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org >Number: 35129 >Category: bin >Synopsis: Maildir support in login(1) >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: update >Submitter-Id: current-users >Arrival-Date: Tue Feb 19 19:00:03 PST 2002 >Closed-Date: >Last-Modified: >Originator: Andrew Hesford >Release: FreeBSD 4.5-STABLE i386 >Organization: >Environment: System: FreeBSD core.usrlib.org 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb 13 03:22:55 CST 2002 jester@core.usrlib.org:/usr/src/sys/compile/CORE i386 >Description: login(1) checks a user's mbox file upon login, and if it finds messages, reports to the user if there is mail (and whether or not it is new). For systems where Qmail Maildir is used for mail, this functionality is lost. I have produced a patch that will use the $MAILDIR/cur and $MAILDIR/new directories to determine if a user has mail (and whether or not it is new). It will then report this on login, just as with mbox mail files. >How-To-Repeat: On a system using Maildir, send messages to a user, then login as that user. Notice that login(1) does not report "You have new mail." Likewise, after reading and saving the messages, logging in will not produce a "You have mail." message. >Fix: This diff can be applied to /usr/src/usr.bin/login/. It makes login(1) look for $MAILDIR if $MAIL is unset, and if $MAILDIR is defined, uses $MAILDIR/cur and $MAILDIR/new to find read and unread mail, respectively. Broken Maildir folders (missing cur and new) will simply cause login(1) to ignore the mail prompt. Should it be desired, the code can also be redone to print the message counts (new and previously-read messages). The following diff can be applied by changing to the /usr/src/usr.bin/login/ directory and running `patch < login.diff`. :::: BEGIN login.diff :::: *** login.c.orig Tue Feb 19 20:25:37 2002 --- login.c Tue Feb 19 20:25:47 2002 *************** *** 53,59 **** --- 53,61 ---- #include #include + #include #include + #include #include #include #include *************** *** 167,172 **** --- 169,179 ---- char tname[sizeof(_PATH_TTY) + 10]; char *shell = NULL; login_cap_t *lc = NULL; + int use_mdir = 0; + FTS *ftsp; + char *mdbuf[3]; + FTSENT *ftse; + int mdopt = FTS_NOCHDIR | FTS_NOSTAT | FTS_LOGICAL; #ifdef USE_PAM pid_t pid; int e; *************** *** 690,701 **** cw = getenv("MAIL"); /* $MAIL may have been set by class */ if (cw != NULL) strlcpy(tbuf, cw, sizeof(tbuf)); ! else ! snprintf(tbuf, sizeof(tbuf), "%s/%s", _PATH_MAILDIR, ! pwd->pw_name); ! if (stat(tbuf, &st) == 0 && st.st_size != 0) (void)printf("You have %smail.\n", (st.st_mtime > st.st_atime) ? "new " : ""); } login_close(lc); --- 697,743 ---- cw = getenv("MAIL"); /* $MAIL may have been set by class */ if (cw != NULL) strlcpy(tbuf, cw, sizeof(tbuf)); ! else { ! cw = getenv("MAILDIR"); ! if (cw != NULL) { ! strlcpy(tbuf, cw, sizeof(tbuf)); ! use_mdir = 1; ! } ! else ! snprintf(tbuf, sizeof(tbuf), "%s/%s", ! _PATH_MAILDIR, pwd->pw_name); ! } ! if (!use_mdir && stat(tbuf, &st) == 0 && st.st_size != 0) (void)printf("You have %smail.\n", (st.st_mtime > st.st_atime) ? "new " : ""); + else if (use_mdir && stat(tbuf, &st) == 0 && + (st.st_mode & S_IFDIR) != 0) { + mdbuf[0] = (char*)malloc(sizeof(tbuf)); + bzero(mdbuf[0], sizeof(mdbuf[0])); + mdbuf[1] = (char*)malloc(sizeof(tbuf)); + bzero(mdbuf[1], sizeof(mdbuf[1])); + snprintf(mdbuf[0], sizeof(tbuf), "%s/new", tbuf); + snprintf(mdbuf[1], sizeof(tbuf), "%s/cur", tbuf); + if ((ftsp = fts_open(mdbuf, mdopt, NULL)) != NULL) { + int ncount = 0, ocount = 0; + ftse = fts_read(ftsp); + while ((ftse = fts_read(ftsp)) != NULL && + strncmp(ftse->fts_name, "new", + sizeof(char)*4) != 0) + ncount++; + ftse = fts_read(ftsp); + while ((ftse = fts_read(ftsp)) != NULL && + strncmp(ftse->fts_name, "cur", + sizeof(char)*4) != 0) + ocount++; + if (ncount > 0) + (void)printf("You have new mail.\n"); + else if (ocount > 0) + (void)printf("You have mail.\n"); + fts_close(ftsp); + } + } + } login_close(lc); *** login.1.orig Tue Feb 19 20:25:57 2002 --- login.1 Tue Feb 19 20:26:01 2002 *************** *** 173,179 **** login account records .It Pa /var/mail/user system mailboxes ! .It Pa \&.hushlogin makes login quieter .It Pa /etc/auth.conf configure authentication services --- 173,181 ---- login account records .It Pa /var/mail/user system mailboxes ! .It Pa ~/Maildir ! Maildir mailbox (used if $MAIL is unset) ! .It Pa ~/\&.hushlogin makes login quieter .It Pa /etc/auth.conf configure authentication services >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message