Xref: utzoo comp.mail.misc:2313 comp.unix.xenix:7314 Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!uflorida!novavax!twwells!bill From: bill@twwells.com (T. William Wells) Newsgroups: comp.mail.misc,comp.unix.xenix Subject: Re: Checking for new mail Message-ID: <1989Aug26.200813.15629@twwells.com> Date: 26 Aug 89 20:08:13 GMT References: <105@csnz.co.nz> Organization: None, Ft. Lauderdale, FL Lines: 92 In article <105@csnz.co.nz> paul@csnz.co.nz (Paul Gillingwater) writes: : What's the best way to check for the arrival of new mail? : I'm writing in C using SCO Xenix 2.3.1, but no doubt other approaches : would be helpful too. I want a menu to display an indicator saying that : new mail has arrived when it comes into the user's mailbox. It should : go away when they have read it. I'd like it to look every so often, : maybe once per minute -- but it should check each time a new menu : is selected. I saw a lot of answers, none of which seemed to answer the question. If I understand you, you want your C program to check to see if mail has arrived in the user's mailbox. On many (all?) Unix systems, there is a shell variable MAIL that contains the name of the user's mailbox. If yours doesn't provide one, you can generally set up such a variable in the /etc/profile or whatever your shell uses for initialization at login. Anyway, given the variable, you then use the stat() system call to see what the file modification time is. If it is later than the file modification time since you last checked, new mail has arrived. (Barring other things that might modify this file, like reading the mail.) Here is a sample function to do this; this was just typed in by hand: caveat usor! #include #include /* There are two functions done here, the init function and the check function. Normal use is as follows: has_mail = mail_check(1); is called at the start of the program and after the user has read his mail or told the program that he doesn't care to know about mail that is already in the box. It returns true if the mailbox exists. has_mail = mail_check(0); is called periodically, to see if mail has arrived since the last initialization. It returns true when mail has arrived, and continues to return true till the function is called with init=1 (Barring wierdness like touching the mail file). Note that this function insists on using the mail file specified at the first call; changing the MAIL variable afterwords will have no effect. */ int mail_check(init) int init; { struct stat statbuf; static char *mail_file; static time_t last_time; /* Get the name of the mail file. If there is none, assume that the user doesn't want a mail check. */ if (!mail_file) { mail_file = getenv("MAIL"); } if (!mail_file) { return (0); } /* Get the file modification time. If there isn't a file (or the file is otherwise unaccessible), pretend that it was modified at the earliest possible moment. */ if (stat(mail_file, &statbuf) < 0) { statbuf.st_mtime = 0; } /* If initializing, just squirrel away the time; return true if the file exists. */ if (init) { last_time = statbuf.st_mtime; return (last_time != 0); } /* Return true if the current modification time is greater than the saved modification time. */ return (statbuf.st_mtime > last_time); } --- Bill { uunet | novavax | ankh | sunvice } !twwells!bill bill@twwells.com