[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 メーリングリストの案内