[mew-dist 19945] Re: incm 0.07
Koga Youichirou
y-koga at example.com
2001年 12月 27日 (木) 16:19:54 JST
Yasunari Momoi <momo at example.com>:
> CVS の HEAD に incm.c が入りました :-).
気になったところを適当にいじってみました。
これでもまだ "/var/mail" などの利用環境に依存する部分がコードに埋め込
まれているところが気に入っていません。configure を使うのであれば、それ
で設定できないでしょうか? あるいはいっそ外に出して設定ファイルを読むよ
うにするとか (面倒だけど)。
以下、何か勘違いしているかもしれませんが、ご参考まで。
環境変数 HOME が得られなかった場合はどうするのが正しいでしょう?
# 他にもするべきエラーチェックが抜けているかもしれない。
Index: incm.c
===================================================================
RCS file: /cvsmew/mew/bin/incm.c,v
retrieving revision 1.3
diff -u -r1.3 incm.c
--- incm.c 2001/12/27 02:04:40 1.3
+++ incm.c 2001/12/27 07:18:38
@@ -36,9 +36,11 @@
#if HAVE_UNISTD_H
# include <unistd.h>
-# include <sys/types.h>
#endif
+#include <sys/types.h>
+#include <pwd.h>
+
private char version_message[] = "version 0.07 20011226 Yasunari Momoi";
enum MBOXTYPE {
@@ -59,6 +61,15 @@
# define PATH_MAX 1024
#endif
+#define LOCKSUFIX ".lock"
+#define MAILDIR "Maildir"
+
+static char *spooldir[] = {
+ "/var/mail",
+ "/var/spool/mail",
+ NULL
+};
+
private char FileBuf[FBUFSIZ];
private char InboxDir[PATH_MAX];
private char Mbox[PATH_MAX];
@@ -188,21 +199,36 @@
{
char *home = getenv("HOME");
- if (strlen(home) + 9 > PATH_MAX)
+ if (home == NULL)
+ error("cannot getenv HOME");
+ if (strlen(home) + strlen(MAILDIR) + 2 > PATH_MAX)
error("pathname too long (%s)", home);
sprintf(InboxDir, ".");
- sprintf(Mbox, "%s/Maildir", home);
-#ifdef HAVE_GETLOGIN
+ sprintf(Mbox, "%s/%s", home, MAILDIR);
if (check_mailbox_type(Mbox) == T_UNKNOWN) {
- char *user = getlogin();
- sprintf(Mbox, "/var/mail/%s", user);
- if (check_mailbox_type(Mbox) == T_UNKNOWN) {
- sprintf(Mbox, "/var/spool/mail/%s", user);
- if (check_mailbox_type(Mbox) == T_UNKNOWN)
- sprintf(Mbox, "%s/Maildir", home);
+ int i;
+ char *user = NULL;
+ struct passwd *pw;
+
+#ifdef HAVE_GETLOGIN
+ user = getlogin();
+#endif
+ if (user == NULL) {
+ pw = getpwuid(getuid());
+ if (pw == NULL)
+ error("cannot get user name");
+ user = pw->pw_name;
}
+ for (i = 0; spooldir[i] != NULL; i++) {
+ if (strlen(user) + strlen(spooldir[i]) + 2 > PATH_MAX)
+ error("user name too long (%s)", user);
+ sprintf(Mbox, "%s/%s", spooldir[i], user);
+ if (check_mailbox_type(Mbox) != T_UNKNOWN)
+ break;
+ }
+ if (check_mailbox_type(Mbox) == T_UNKNOWN)
+ sprintf(Mbox, "%s/%s", home, MAILDIR);
}
-#endif
MboxType = T_UNKNOWN;
Backup = FALSE;
UseCL = FALSE;
@@ -472,9 +498,9 @@
int state = ST_UNKNOWN;
int bytes = -1; /* UseCL (Content-Length:) */
- if (strlen(Mbox) + 6 > PATH_MAX)
- error("pathname too long (%s.lock)", Mbox);
- sprintf(MboxLock, "%s.lock", Mbox);
+ if (strlen(Mbox) + strlen(LOCKSUFIX) + 1 > PATH_MAX)
+ error("pathname too long (%s%s)", Mbox, LOCKSUFIX);
+ sprintf(MboxLock, "%s%s", Mbox, LOCKSUFIX);
if (lock_mbox(MboxLock))
MboxLock[0] = '\0'; /* doesn't need a lockfile, maybe. */
----
こがよういちろう
Mew-dist メーリングリストの案内