From: Robert N. <rob...@us...> - 2006-10-06 18:28:16
|
Update of /cvsroot/bacula/bacula/src/tools In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15351/tools Modified Files: bsmtp.c Log Message: Fix bug # 688. Port bsmtp to Windows. Add Bacula/bin to directory searched for scripts/programs specified without paths in configuration files. Add bsleep.exe used in scripts to sleep between commands. Fix bugs in mtx-changer.cmd and customize bacula-sd.conf template to be Windows specific. Fix time warp in ChangeLog and technotes. Index: bsmtp.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/tools/bsmtp.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- bsmtp.c 20 Mar 2006 07:13:12 -0000 1.18 +++ bsmtp.c 6 Oct 2006 18:28:13 -0000 1.19 @@ -27,22 +27,12 @@ */ -#ifdef APCUPSD - -#include "apc.h" -#undef main -#define my_name_is(x) -#define bstrdup(x) strdup(x) -UPSINFO myUPS; -UPSINFO *core_ups = &myUPS; -#define MY_NAME "smtp" - -#else - #include "bacula.h" #include "jcr.h" #define MY_NAME "bsmtp" +#if defined(HAVE_WIN32) +#include <lmcons.h> #endif /* Dummy functions */ @@ -80,6 +70,9 @@ if (len > 0) { buf[len-1] = 0; } + if (debug_level >= 10) { + fprintf(stderr, "%s <-- %s\n", mailhost, buf); + } Dmsg2(10, "%s --> %s\n", mailhost, buf); if (!isdigit((int)buf[0]) || buf[0] > '3') { Pmsg2(0, _("Fatal malformed reply from %s: %s\n"), mailhost, buf); @@ -89,6 +82,9 @@ break; } } + if (ferror(rfp)) { + fprintf(stderr, _("Fatal fgets error: ERR=%s\n"), strerror(errno)); + } return; } @@ -143,9 +139,14 @@ char buf[MAXSTRING]; struct sockaddr_in sin; struct hostent *hp; - int s, r, i, ch; + int i, ch; unsigned long maxlines, lines; +#if defined(HAVE_WIN32) + SOCKET s; +#else + int s, r; struct passwd *pwd; +#endif char *cp, *p; time_t now = time(NULL); struct tm tm; @@ -196,9 +197,9 @@ break; case 'l': - Dmsg1(20, "maxlines=%s\n", optarg); - maxlines = (unsigned long) atol(optarg); - break; + Dmsg1(20, "maxlines=%s\n", optarg); + maxlines = (unsigned long) atol(optarg); + break; case '?': default: @@ -226,6 +227,12 @@ } } +#if defined(HAVE_WIN32) + WSADATA wsaData; + + WSAStartup(MAKEWORD(2,2), &wsaData); +#endif + /* * Find out my own host name for HELO; * if possible, get the fully qualified domain name @@ -246,11 +253,22 @@ * Determine from address. */ if (from_addr == NULL) { +#if defined(HAVE_WIN32) + DWORD dwSize = UNLEN + 1; + LPSTR lpszBuffer = (LPSTR)alloca(dwSize); + + if (GetUserName(lpszBuffer, &dwSize)) { + sprintf(buf, "%s@%s", lpszBuffer, my_hostname); + } else { + sprintf(buf, "unknown-user@%s", my_hostname); + } +#else if ((pwd = getpwuid(getuid())) == 0) { sprintf(buf, "userid-%d@%s", (int)getuid(), my_hostname); } else { sprintf(buf, "%s@%s", pwd->pw_name, my_hostname); } +#endif from_addr = bstrdup(buf); } Dmsg1(20, "From addr=%s\n", from_addr); @@ -278,15 +296,41 @@ memcpy((char *)&sin.sin_addr, hp->h_addr, hp->h_length); sin.sin_family = hp->h_addrtype; sin.sin_port = htons(mailport); +#if defined(HAVE_WIN32) + if ((s = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0)) < 0) { + Pmsg1(0, _("Fatal socket error: ERR=%s\n"), strerror(errno)); + exit(1); + } +#else if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { Pmsg1(0, _("Fatal socket error: ERR=%s\n"), strerror(errno)); exit(1); } +#endif if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { Pmsg2(0, _("Fatal connect error to %s: ERR=%s\n"), mailhost, strerror(errno)); exit(1); } Dmsg0(20, "Connected\n"); + +#if defined(HAVE_WIN32) + int fdSocket = _open_osfhandle(s, _O_RDWR); + if (fdSocket == -1) { + Pmsg1(0, _("Fatal _open_osfhandle error: ERR=%s\n"), strerror(errno)); + exit(1); + } + + int fdSocket2 = dup(fdSocket); + + if ((sfp = fdopen(fdSocket, "wb")) == NULL) { + Pmsg1(0, _("Fatal fdopen error: ERR=%s\n"), strerror(errno)); + exit(1); + } + if ((rfp = fdopen(fdSocket2, "rb")) == NULL) { + Pmsg1(0, _("Fatal fdopen error: ERR=%s\n"), strerror(errno)); + exit(1); + } +#else if ((r = dup(s)) < 0) { Pmsg1(0, _("Fatal dup error: ERR=%s\n"), strerror(errno)); exit(1); @@ -299,6 +343,7 @@ Pmsg1(0, _("Fatal fdopen error: ERR=%s\n"), strerror(errno)); exit(1); } +#endif /* * Send SMTP headers @@ -335,6 +380,19 @@ fprintf(sfp, "Errors-To: %s\r\n", err_addr); Dmsg1(10, "Errors-To: %s\r\n", err_addr); } + +#if defined(HAVE_WIN32) + DWORD dwSize = UNLEN + 1; + LPSTR lpszBuffer = (LPSTR)alloca(dwSize); + + if (GetUserName(lpszBuffer, &dwSize)) { + fprintf(sfp, "Sender: %s@%s\r\n", lpszBuffer, my_hostname); + Dmsg2(10, "Sender: %s@%s\r\n", lpszBuffer, my_hostname); + } else { + fprintf(sfp, "Sender: unknown-user@%s\r\n", my_hostname); + Dmsg1(10, "Sender: unknown-user@%s\r\n", my_hostname); + } +#else if ((pwd = getpwuid(getuid())) == 0) { fprintf(sfp, "Sender: userid-%d@%s\r\n", (int)getuid(), my_hostname); Dmsg2(10, "Sender: userid-%d@%s\r\n", (int)getuid(), my_hostname); @@ -342,6 +400,7 @@ fprintf(sfp, "Sender: %s@%s\r\n", pwd->pw_name, my_hostname); Dmsg2(10, "Sender: %s@%s\r\n", pwd->pw_name, my_hostname); } +#endif fprintf(sfp, "To: %s", argv[0]); Dmsg1(10, "To: %s", argv[0]); @@ -358,8 +417,24 @@ } /* Add RFC822 date */ - localtime_r(&now, &tm); + (void)localtime_r(&now, &tm); +#if defined(HAVE_WIN32) +#if defined(HAVE_MINGW) +__MINGW_IMPORT long _dstbias; +#endif + long tzoffset = 0; + + _tzset(); + + tzoffset = _timezone; + tzoffset += _dstbias; + tzoffset /= 60; + + size_t length = strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S", &tm); + sprintf(&buf[length], " %+2.2ld%2.2u", -tzoffset / 60, abs(tzoffset) % 60); +#else strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S %z", &tm); +#endif fprintf(sfp, "Date: %s\r\n", buf); Dmsg1(10, "Date: %s\r\n", buf); @@ -372,7 +447,7 @@ while (fgets(buf, sizeof(buf), stdin)) { if (maxlines > 0 && ++lines > maxlines) { Dmsg1(20, "skip line because of maxlines limit: %lu\n", maxlines); - continue; + break; } buf[strlen(buf)-1] = 0; if (strcmp(buf, ".") == 0) { /* quote lone dots */ |