diff -rbBcP imap-2000c.ori/Makefile imap-2000c/Makefile *** imap-2000c.ori/Makefile Thu Sep 12 14:28:05 2002 --- imap-2000c/Makefile Mon Sep 23 21:25:33 2002 *************** *** 274,285 **** # gradually-increasing intervals, starting at 2800-2900, and becoming # permanent at 48,300. ! EXTRACFLAGS=$(CFLAGS) # Extra linker flags (additional/alternative libraries, etc.) ! EXTRALDFLAGS= # Special make flags (e.g. to override make environment variables) --- 274,285 ---- # gradually-increasing intervals, starting at 2800-2900, and becoming # permanent at 48,300. ! EXTRACFLAGS=$(CFLAGS) -DSMTPAFTERPOP # Extra linker flags (additional/alternative libraries, etc.) ! EXTRALDFLAGS=-ldb1 # Special make flags (e.g. to override make environment variables) *************** *** 466,471 **** --- 466,476 ---- sh -c '$(RM) an ua OSTYPE c-client mtest imapd ipopd || true' $(CD) tools;$(MAKE) clean + install: + @echo Install to usr/sbin + cp -f imapd/imapd /usr/sbin + cp -f ipopd/ipop2d /usr/sbin + cp -f ipopd/ipop3d /usr/sbin # A monument to a hack of long ago and far away... love: diff -rbBcP imap-2000c.ori/src/osdep/unix/env_unix.c imap-2000c/src/osdep/unix/env_unix.c *** imap-2000c.ori/src/osdep/unix/env_unix.c Thu Sep 12 14:28:03 2002 --- imap-2000c/src/osdep/unix/env_unix.c Tue Sep 24 21:29:22 2002 *************** *** 23,28 **** --- 23,33 ---- #include #include + #ifdef SMTPAFTERPOP + #include + #endif + + /* c-client environment parameters */ /* don't change these */ *************** *** 519,524 **** --- 524,592 ---- } + #ifdef SMTPAFTERPOP + void smtp_after_pop(char *ipaddr, char *user) + { + char stamp[128] = "/etc/mail/popips/"; + char ip[128] = ""; + char *dbname = "/etc/mail/access.db"; + char *s; + DB *db; + DBT key, data; + DBT *pk = &key, *pd = &data; + int fd, rc; + + s = strchr( ipaddr, '[' ); + if( s ) { + strcpy( ip, ++s ); + s = strchr( ip, ']' ); + if( s ) *s = '\0'; + } + else + strcpy( ip, ipaddr ); + db = dbopen(dbname, O_RDWR, 0, DB_HASH, NULL); + if (db == NULL) { + syslog(LOG_INFO, "error opening %s\n", dbname); + return; + } + fd = (db->fd)(db); + if (flock(fd, LOCK_EX) == -1) { + syslog(LOG_INFO, "can't get lock on %s\n", dbname); + (db->close)(db); + return; + } + key.data = ip; + key.size = strlen(key.data); + data.data = "RELAY"; + data.size = strlen(data.data); + rc = (db->put)(db, pk, pd, 0); + switch (rc) { + case 0: + strcat(stamp, ip); + rc = open(stamp, O_CREAT, 0600); + if (rc == -1) { + syslog(LOG_INFO, "error creating %s\n", stamp); + } else { + close(rc); + } + syslog(LOG_INFO, "inserted %s into %s for user %s\n", + ip, dbname, user); + break; + case 1: + syslog(LOG_INFO, "%s alrady in %s for user %s\n", + ip, dbname, user); + break; + default: + syslog(LOG_INFO, "error inserting %s into %s for user %s\n", + ip, dbname, user); + break; + } + flock(fd, LOCK_UN); + (db->close)(db); + } + #endif + + /* Finish log in and environment initialization * Accepts: passwd struct for loginpw() * authentication user name *************** *** 563,568 **** --- 631,641 ---- #else char *h = cpystr (home); #endif + + #ifdef SMTPAFTERPOP + smtp_after_pop( tcp_clienthost(), user ); + #endif + /* log the user in */ if (loginpw (pw,argc,argv)) ret = env_init (u,h); if (h) fs_give ((void **) &h);