diff --git a/CHANGES b/CHANGES index 136d2a0..f558718 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,22 @@ CHANGES ======= +version 7.1.1 (Aug 4, 2001): + - Now using getlogin() for real username info - suggested by + Dave Stuit + - gethostbyname() failure for a console now doesn't cause a + shutdown - reported by Todd Stansell + - Shutdown via client -q/-Q fixed (broken in 7.1.0 because of + master process fork() code) + - Password file parsing fixed to allow for empty passwords - + allowing users to access conserver without a password prompt + - Both the password and configuration files no longer have + line length limitations, they now support comments (`#' lines), + and lines with leading whitespace are continuations of + previous lines + - Client hostname/ip sometimes not printed - reported by Todd + Stansell + version 7.1.0 (Jul 26, 2001): - Hostname in access list that began with a digit was treated as an IP address - only strings using [0-9./] are considered CIDR @@ -206,5 +222,5 @@ before version 6.05: and enhancements of various types were applied. # -# $Id: CHANGES,v 1.41 2001-07-26 16:42:26-07 bryan Exp $ +# $Id: CHANGES,v 1.45 2001-08-04 21:09:12-07 bryan Exp $ # diff --git a/INSTALL b/INSTALL index 62868b0..e7e04e5 100644 --- a/INSTALL +++ b/INSTALL @@ -10,6 +10,13 @@ Upgrading? new features added to the client if you're considering *not* upgrading. + Version 7.1.1 + + - Both conserver.passwd and conserver.cf file parsing behaves + the same now. Both use leading whitespace as a continuation + line indicator - if you have leading whitespace on a line + (aside from comments) you probably should remove it. + Version 7.1.0 - The client/server protocol has changed. You *MUST* use a @@ -112,5 +119,5 @@ Detailed Instructions - That's it! Just start up the console server and enjoy! # -# $Id: INSTALL,v 1.17 2001-07-25 17:33:29-07 bryan Exp $ +# $Id: INSTALL,v 1.18 2001-08-04 21:11:09-07 bryan Exp $ # diff --git a/TODO b/TODO index 8c4097c..026b00b 100644 --- a/TODO +++ b/TODO @@ -9,10 +9,6 @@ Bryan Stansell --------------------------------------------------------------------------- -- conserver.passwd parsing needs improvement - - shouldn't use strtok() (bryan::any == bryan:any) - - empty passwords not allowed - - Telnet protocol should be improved - Not even RFC 854 compliant - Data sent to terminal server not encapsulated @@ -89,5 +85,5 @@ Bryan Stansell - bios support # -# $Id: TODO,v 1.11 2001-07-25 17:36:21-07 bryan Exp $ +# $Id: TODO,v 1.12 2001-07-30 23:28:56-07 bryan Exp $ # diff --git a/config.h.in b/config.h.in index b1c9852..a8285ce 100644 --- a/config.h.in +++ b/config.h.in @@ -58,6 +58,9 @@ /* Define if you have the `getdtablesize' function. */ #undef HAVE_GETDTABLESIZE +/* Define if you have the `getlogin' function. */ +#undef HAVE_GETLOGIN + /* Define if you have the `getopt' function. */ #undef HAVE_GETOPT diff --git a/configure b/configure index 43b7635..2817eeb 100755 --- a/configure +++ b/configure @@ -3390,7 +3390,7 @@ EOF fi -for ac_func in getopt strerror getrlimit getsid setsid getuserattr setgroups tcgetpgrp tcsetpgrp tcgetattr tcsetattr tcsendbreak setpgrp getutent setttyent getspnam setlinebuf setvbuf ptsname grantpt unlockpt flock sigaction setsockopt getdtablesize putenv memset memcpy memcmp sysconf getpassphrase +for ac_func in getopt strerror getrlimit getsid setsid getuserattr setgroups tcgetpgrp tcsetpgrp tcgetattr tcsetattr tcsendbreak setpgrp getutent setttyent getspnam setlinebuf setvbuf ptsname grantpt unlockpt flock sigaction setsockopt getdtablesize putenv memset memcpy memcmp sysconf getpassphrase getlogin do ac_ac_var=`echo "ac_cv_func_$ac_func" | $ac_tr_sh` echo "$as_me:3396: checking for $ac_func" >&5 diff --git a/configure.in b/configure.in index 18352eb..0e90529 100644 --- a/configure.in +++ b/configure.in @@ -218,7 +218,7 @@ AC_CHECK_LIB(crypt,crypt) dnl ### Check for needed functions. ################################ -AC_CHECK_FUNCS(getopt strerror getrlimit getsid setsid getuserattr setgroups tcgetpgrp tcsetpgrp tcgetattr tcsetattr tcsendbreak setpgrp getutent setttyent getspnam setlinebuf setvbuf ptsname grantpt unlockpt flock sigaction setsockopt getdtablesize putenv memset memcpy memcmp sysconf getpassphrase) +AC_CHECK_FUNCS(getopt strerror getrlimit getsid setsid getuserattr setgroups tcgetpgrp tcsetpgrp tcgetattr tcsetattr tcsendbreak setpgrp getutent setttyent getspnam setlinebuf setvbuf ptsname grantpt unlockpt flock sigaction setsockopt getdtablesize putenv memset memcpy memcmp sysconf getpassphrase getlogin) AC_FUNC_SETPGRP diff --git a/conserver.cf/conserver.cf.man b/conserver.cf/conserver.cf.man index 0a81f75..e0765fa 100644 --- a/conserver.cf/conserver.cf.man +++ b/conserver.cf/conserver.cf.man @@ -1,4 +1,4 @@ -.\" $Id: conserver.cf.man,v 1.15 2001-07-26 10:23:16-07 bryan Exp $ +.\" $Id: conserver.cf.man,v 1.17 2001-08-04 20:54:25-07 bryan Exp $ .\" @(#)constab.5 01/06/91 OSU CIS; Thomas A. Fine .TH CONSERVER.CF 5 "Local" .SH NAME @@ -24,10 +24,14 @@ is the configuration file for .BR conserver (8). It is read once upon startup; modifications to the file take effect only upon restarting \fBconserver\fP. -All lines starting with the pound sign `#' are considered comment lines. -Blank lines are ignored. .PP -The first section of the file has lines that are separated into +Blank lines and comment lines (those beginning with a ``#'' and +optional leading whitespace) are ignored. Non-ignored lines +beginning with whitespace are considered continuations of the +previous line. This allows you to span one logical line over +many physical lines and insert comments wherever appropriate. +.PP +The first section of the file has logical lines that are separated into five colon-separated fields. Leading and trailing white space in each field is ignored. .TP diff --git a/conserver.cf/conserver.passwd.man b/conserver.cf/conserver.passwd.man index f799278..011e701 100644 --- a/conserver.cf/conserver.passwd.man +++ b/conserver.cf/conserver.passwd.man @@ -1,4 +1,4 @@ -.\" $Id: conserver.passwd.man,v 1.2 2001-07-22 11:48:29-07 bryan Exp $ +.\" $Id: conserver.passwd.man,v 1.4 2001-08-04 20:54:25-07 bryan Exp $ .TH CONSERVER.PASSWD 5 "Local" .SH NAME conserver.passwd \- user access information for conserver(8) @@ -14,8 +14,15 @@ Upon each incoming client connection, so edits to the file take effect immediately. It reads only until the first \fIusername\fP match. .PP -Each line consists of three colon-separated fields, -as follows: +Blank lines and comment lines (those beginning with a ``#'' and +optional leading whitespace) are ignored. Non-ignored lines +beginning with whitespace are considered continuations of the +previous line. This allows you to span one logical line over +many physical lines and insert comments wherever appropriate. +.PP +Each logical line consists of three colon-separated fields. +Leading and trailing white space in each +field is ignored. .TP .I username the login name of the authorized user, diff --git a/conserver.html b/conserver.html index aaf5474..0f540fe 100644 --- a/conserver.html +++ b/conserver.html @@ -167,10 +167,10 @@

Downloading

The current version, released on RELEASE_DATE, is -7.1.0.tar.gz. You can get it via FTP -or HTTP. +HREF="http://www.conserver.com/7.1.1.tar.gz"> +7.1.1.tar.gz. You can get it via FTP +or HTTP. See the CHANGES file for information on the latest updates.

diff --git a/conserver/consent.c b/conserver/consent.c index ce529ca..9d8b016 100644 --- a/conserver/consent.c +++ b/conserver/consent.c @@ -1,5 +1,5 @@ /* - * $Id: consent.c,v 5.68 2001-07-26 11:48:43-07 bryan Exp $ + * $Id: consent.c,v 5.69 2001-07-29 22:28:40-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -688,9 +688,10 @@ ConsInit(pCE, pfdSet, useHostCache) #endif if ((hp = gethostbyname(pCE->networkConsoleHost)) == NULL) { - Error("gethostbyname(%s): %s", pCE->networkConsoleHost, - hstrerror(h_errno)); - exit(EX_UNAVAILABLE); + Error("gethostbyname(%s): %s: forcing down", + pCE->networkConsoleHost, hstrerror(h_errno)); + ConsDown(pCE, pfdSet); + return; } #if HAVE_MEMCPY (void)memcpy(&port.sin_addr.s_addr, hp->h_addr, hp->h_length); diff --git a/conserver/group.c b/conserver/group.c index 3ab34cb..6ca3bc8 100644 --- a/conserver/group.c +++ b/conserver/group.c @@ -1,5 +1,5 @@ /* - * $Id: group.c,v 5.126 2001-07-26 11:50:13-07 bryan Exp $ + * $Id: group.c,v 5.132 2001-08-04 17:03:30-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -94,19 +94,14 @@ static sig_atomic_t fSawReOpen = 0, fSawReUp = 0, fSawMark = * given a special epass try it first. */ int -CheckPass(pwd, pcEPass, pcWord) +CheckPass(pwd, pcWord) struct passwd *pwd; - char *pcEPass, *pcWord; + char *pcWord; { #if HAVE_GETSPNAM struct spwd *spwd; #endif - if ((char *)0 != pcEPass && '\000' != pcEPass[0]) { - if (0 == strcmp(pcEPass, crypt(pcWord, pcEPass))) { - return 1; - } - } #if HAVE_GETSPNAM if ('x' == pwd->pw_passwd[0] && '\000' == pwd->pw_passwd[1]) { if ((struct spwd *)0 != (spwd = getspnam(pwd->pw_name))) @@ -430,8 +425,7 @@ ReapVirt(pGE, prinit) /* If someone was writing, they fall back to read-only */ if (pCE->pCLwr != (CONSCLIENT *) 0) { pCE->pCLwr->fwr = 0; - tagLogfile(pCE, "%s detached", - pCE->pCLwr->acid); + tagLogfile(pCE, "%s detached", pCE->pCLwr->acid); pCE->pCLwr = (CONSCLIENT *) 0; } @@ -451,7 +445,7 @@ CheckPasswd(pCLServing, pw_string) { struct passwd *pwd; FILE *fp; - char buf[BUFSIZ]; + int iLine = 0; char *server, *servers, *this_pw, *user; char username[64]; /* same as acid */ #if HAVE_GETSPNAM @@ -462,31 +456,46 @@ CheckPasswd(pCLServing, pw_string) if ((user = strchr(username, '@'))) *user = '\000'; - if ((fp = fopen(pcPasswd, "r")) == NULL) { + if ((fp = fopen(pcPasswd, "r")) == (FILE *) 0) { Info("Cannot open passwd file %s: %s", pcPasswd, strerror(errno)); if ((struct passwd *)0 == (pwd = getpwuid(0))) { fileWrite(pCLServing->fd, "no root passwd?\r\n", -1); return 0; } - if (0 != CheckPass(pwd, pw_string, pCLServing->accmd)) { - if (fVerbose) { - Info("User %s logging into server %s via root or console passwd", pCLServing->acid, pCLServing->pCEwant->server); - } + if (0 != CheckPass(pwd, pw_string)) { + if (fVerbose) + Info("User %s logging into server %s via root passwd", + pCLServing->acid, pCLServing->pCEwant->server); return 1; } } else { - while (fgets(buf, sizeof(buf), fp) != NULL) { - user = strtok(buf, ":\n"); - if (user == NULL) + char *wholeLine; + STRING saveLine = { (char *)0, 0, 0 }; + + while ((wholeLine = readLine(fp, &saveLine, &iLine)) != (char *)0) { + pruneSpace(wholeLine); + /*printf("whole=<%s>\n", wholeLine); */ + if (wholeLine[0] == '\000') + continue; + + if ((char *)0 == (this_pw = strchr(wholeLine, ':')) || + (char *)0 == (servers = strchr(this_pw + 1, ':'))) { + Error("%s(%d) bad password line `%s'", pcPasswd, iLine, + wholeLine); continue; - if (! - (strcmp(user, "*any*") == 0 || - strcmp(user, username) == 0)) + } + *this_pw++ = '\000'; + *servers++ = '\000'; + user = pruneSpace(wholeLine); + this_pw = pruneSpace(this_pw); + servers = pruneSpace(servers); + + if (strcmp(user, "*any*") != 0 && strcmp(user, username) != 0) continue; - this_pw = strtok(NULL, ":\n"); + if (strcmp(this_pw, "*passwd*") == 0) { - this_pw = NULL; + this_pw = (char *)0; if ((struct passwd *)0 != (pwd = getpwnam(username))) { #if HAVE_GETSPNAM if ('x' == pwd->pw_passwd[0] && @@ -503,19 +512,23 @@ CheckPasswd(pCLServing, pw_string) #endif } } - if (this_pw == NULL) - break; - servers = strtok(NULL, ":\n"); - if (servers == NULL) + if (this_pw == (char *)0) break; /* - printf("Got servers <%s> passwd <%s> user <%s>, want <%s>\n", - servers, this_pw, user, - pCLServing->pCEwant->server); + printf + ("Got servers <%s> passwd <%s> user <%s>, want <%s>\n", + servers, this_pw, user, pCLServing->pCEwant->server); */ - if (strcmp(this_pw, crypt(pCLServing->accmd, this_pw)) == 0) { + /* If one is empty and the other isn't, instant failure */ + if ((*this_pw == '\000' && *pw_string != '\000') || + (*this_pw != '\000' && *pw_string == '\000')) { + break; + } + + if ((*this_pw == '\000' && *pw_string == '\000') || + (strcmp(this_pw, crypt(pw_string, this_pw)) == 0)) { server = strtok(servers, ", \t\n"); while (server) { /* For each server */ if (strcmp(server, "any") == 0) { @@ -555,8 +568,7 @@ CheckPasswd(pCLServing, pw_string) server = strtok(NULL, ", \t\n"); } } - fclose(fp); - return 0; + break; } fclose(fp); } @@ -1025,8 +1037,7 @@ Kiddie(pGE, sfd) for (j = 0; pCLServing->icursor < (sizeof(pCLServing->acid) - 1) && - pCLServing->peername[iConsole] != - '\000';) { + pCLServing->peername[j] != '\000';) { pCLServing->acid[pCLServing->icursor++] = pCLServing->peername[j++]; } @@ -1095,7 +1106,8 @@ Kiddie(pGE, sfd) goto drop; } - if ('t' == pCLServing->caccess) { + if (('t' == pCLServing->caccess) || + (0 != CheckPasswd(pCLServing, ""))) { goto shift_console; } fileWrite(pCLServing->fd, "passwd:\r\n", -1); @@ -1126,7 +1138,8 @@ Kiddie(pGE, sfd) } pCLServing->icursor = 0; - if (0 == CheckPasswd(pCLServing, pGE->passwd)) { + if (0 == + CheckPasswd(pCLServing, pCLServing->accmd)) { fileWrite(pCLServing->fd, "Sorry.\r\n", -1); Info("%s: %s: bad passwd", pCLServing->pCEwant->server, diff --git a/conserver/group.h b/conserver/group.h index 301b31e..6b32e75 100644 --- a/conserver/group.h +++ b/conserver/group.h @@ -1,5 +1,5 @@ /* - * $Id: group.h,v 5.17 2001-07-11 12:48:01-07 bryan Exp $ + * $Id: group.h,v 5.18 2001-07-30 01:57:42-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -42,7 +42,6 @@ typedef struct grpent { /* group info */ int imembers; /* number of consoles in this group */ CONSENT *pCElist; /* list of consoles in this group */ CONSCLIENT *pCLall; /* all clients to scan after select */ - char passwd[MAXPSWDLEN]; /* encrypted password for this group */ } GRPENT; diff --git a/conserver/main.c b/conserver/main.c index 558edcf..1d87eb8 100644 --- a/conserver/main.c +++ b/conserver/main.c @@ -1,5 +1,5 @@ /* - * $Id: main.c,v 5.75 2001-07-26 11:49:41-07 bryan Exp $ + * $Id: main.c,v 5.78 2001-07-27 12:34:48-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -284,6 +284,9 @@ main(argc, argv) extern char *optarg; REMOTE *pRCUniq; /* list of uniq console servers */ struct passwd *pwd; + char *origuser = (char *)0; + char *curuser = (char *)0; + int curuid; outputPid = 1; /* make sure stuff has the pid */ @@ -417,10 +420,24 @@ main(argc, argv) } Info("%s", THIS_VERSION); - if ((struct passwd *)0 == (pwd = getpwuid(getuid()))) - Info("Started by uid %d at %s", getuid(), strtime(NULL)); + +#if HAVE_GETLOGIN + origuser = getlogin(); +#endif + curuid = getuid(); + if ((struct passwd *)0 != (pwd = getpwuid(curuid))) + curuser = pwd->pw_name; + + if (curuser == (char *)0) + if (origuser == (char *)0) + Info("Started as uid %d by uid %d at %s", curuid, curuid, + strtime(NULL)); + else + Info("Started as uid %d by `%s' at %s", curuid, origuser, + strtime(NULL)); else - Info("Started by `%s' at %s", pwd->pw_name, strtime(NULL)); + Info("Started as `%s' by `%s' at %s", curuser, + (origuser == (char *)0) ? curuser : origuser, strtime(NULL)); #if HAVE_GETSPNAM if (0 != geteuid()) { diff --git a/conserver/master.c b/conserver/master.c index db196cd..e12ce99 100644 --- a/conserver/master.c +++ b/conserver/master.c @@ -1,5 +1,5 @@ /* - * $Id: master.c,v 5.60 2001-07-26 00:49:48-07 bryan Exp $ + * $Id: master.c,v 5.61 2001-07-30 01:58:00-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -217,7 +217,7 @@ Master(pRCUniq) unsigned char acIn[1024], acOut[BUFSIZ]; struct sockaddr_in master_port, response_port; int true = 1; - int pid; + int pid, parentpid; char *ambiguous = (char *)0; /* set up signal handler */ @@ -357,6 +357,7 @@ Master(pRCUniq) #endif continue; case 0: + parentpid = thepid; thepid = getpid(); break; } @@ -365,24 +366,22 @@ Master(pRCUniq) * (port lookup, who, users, or quit) */ fileWrite(csocket, "ok\r\n", -1); - for (i = 0; i < sizeof(acIn); /* i+=nr */ ) { - if (0 >= - (nr = fileRead(csocket, &acIn[i], sizeof(acIn) - 1 - i))) { - i = 0; + for (i = 0; i < sizeof(acIn) - 1; /* i+=nr */ ) { + if ((nr = + fileRead(csocket, &acIn[i], sizeof(acIn) - 1 - i)) <= 0) { break; } - i += nr; - if ('\n' == acIn[i - 1]) { - acIn[i] = '\000'; - --i; - break; + for (j = 0; j < nr; j++, i++) { + if (acIn[i] == '\n') { + acIn[i] = '\000'; + if (i > 0 && acIn[i - 1] == '\r') + acIn[--i] = '\000'; + break; + } } - } - if (i > 0 && '\n' == acIn[i - 1]) { - acIn[--i] = '\000'; - } - if (i > 0 && '\r' == acIn[i - 1]) { - acIn[--i] = '\000'; + if (j != nr) + break; + acIn[i] = '\000'; } if (0 == i) { Error("lost connection"); @@ -422,11 +421,11 @@ Master(pRCUniq) fileWrite(csocket, "must be trusted to terminate\r\n", -1); } else if ((struct passwd *)0 == (pwd = getpwuid(0))) { fileWrite(csocket, "no root passwd?\r\n", -1); - } else if (0 == CheckPass(pwd, (char *)0, pcArgs)) { + } else if (0 == CheckPass(pwd, pcArgs)) { fileWrite(csocket, "Sorry.\r\n", -1); } else { fileWrite(csocket, "ok -- terminated\r\n", -1); - fSawQuit = 1; + kill(parentpid, SIGTERM); } (void)fileClose(csocket); exit(EX_OK); diff --git a/conserver/readcfg.c b/conserver/readcfg.c index 4f36883..e440117 100644 --- a/conserver/readcfg.c +++ b/conserver/readcfg.c @@ -1,5 +1,5 @@ /* - * $Id: readcfg.c,v 5.61 2001-07-23 00:45:49-07 bryan Exp $ + * $Id: readcfg.c,v 5.62 2001-08-04 18:33:54-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -216,7 +216,8 @@ ReadCfg(pcFile, fp) GRPENT *pGE; int iG, minG; int iLine; - unsigned char acIn[BUFSIZ]; + unsigned char *acIn; + static STRING acInSave = { (char *)0, 0, 0 }; char *acStart; GRPENT *pGEAll; CONSENT *pCE; @@ -233,18 +234,14 @@ ReadCfg(pcFile, fp) ppRC = &pRCList; iLocal = 0; + buildMyString((char *)0, &acInSave); iG = minG = 0; iLine = 0; - while (fgets(acIn, sizeof(acIn) - 1, fp) != NULL) { + while ((acIn = readLine(fp, &acInSave, &iLine)) != (unsigned char *)0) { char *pcLine, *pcMode, *pcLog, *pcRem, *pcStart, *pcMark; - ++iLine; - acStart = pruneSpace(acIn); - if ('#' == acStart[0] || '\000' == acStart[0]) { - continue; - } if ('%' == acStart[0] && '%' == acStart[1] && '\000' == acStart[2]) { break; } @@ -459,18 +456,13 @@ ReadCfg(pcFile, fp) */ iG = iAccess = 0; pACList = (ACCESS *) 0; - while (fgets(acIn, sizeof(acIn) - 1, fp) != NULL) { + while ((acIn = readLine(fp, &acInSave, &iLine)) != (unsigned char *)0) { char *pcMach, *pcNext, *pcMem; char cType; int iLen; - ++iLine; - acStart = pruneSpace(acIn); - if ('#' == acStart[0] || '\000' == acStart[0]) { - continue; - } if ('%' == acStart[0] && '%' == acStart[1] && '\000' == acStart[2]) { break; } diff --git a/conserver/readcfg.h b/conserver/readcfg.h index b0d0d78..c65b985 100644 --- a/conserver/readcfg.h +++ b/conserver/readcfg.h @@ -1,5 +1,5 @@ /* - * $Id: readcfg.h,v 5.12 2001-07-06 17:11:47-07 bryan Exp $ + * $Id: readcfg.h,v 5.13 2001-07-30 01:57:27-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -49,3 +49,4 @@ extern int iLocal; /* how many local consoles we have */ extern void ReadCfg(); +extern char *pruneSpace(); diff --git a/conserver/util.c b/conserver/util.c index 18def72..f76b85e 100644 --- a/conserver/util.c +++ b/conserver/util.c @@ -1,5 +1,5 @@ /* - * $Id: util.c,v 1.19 2001-07-26 00:50:17-07 bryan Exp $ + * $Id: util.c,v 1.26 2001-08-04 18:33:27-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -37,37 +38,135 @@ OutOfMem() } char * -buildString(str) +buildMyString(str, msg) const char *str; + STRING *msg; { - static char *msg = (char *)0; - static size_t cursize = 0; - static size_t msgsize = 0; int len; if ((char *)0 == str) { - if ((char *)0 != msg) { - free(msg); - msg = (char *)0; - msgsize = cursize = 0; - } - return msg; + msg->used = 0; + if (msg->string != (char *)0) + msg->string[0] = '\000'; + Debug("buildMyString: reset", len); + return msg->string; } - len = strlen(str); - if (cursize + len >= msgsize) { - if (0 == msgsize) { - msgsize = (len / 1024 + 1) * 1024 * sizeof(char); - msg = (char *)calloc(1, msgsize); + len = strlen(str) + 1; + if (msg->used + len >= msg->allocated) { + if (0 == msg->allocated) { + msg->allocated = (len / 1024 + 1) * 1024 * sizeof(char); + msg->string = (char *)calloc(1, msg->allocated); } else { - msgsize += (len / 1024 + 1) * 1024 * sizeof(char); - msg = (char *)realloc(msg, msgsize); + msg->allocated += (len / 1024 + 1) * 1024 * sizeof(char); + msg->string = (char *)realloc(msg->string, msg->allocated); } - if ((char *)0 == msg) + Debug("buildMyString: tried allocating %lu bytes", msg->allocated); + if (msg->string == (char *)0) OutOfMem(); } - strcat(msg, str); - cursize += len; - return msg; + strcat(msg->string, str); + msg->used += len; + Debug("buildMyString: added %d chars (%d/%d now)", len, msg->used, + msg->allocated); + return msg->string; +} + +char * +buildString(str) + const char *str; +{ + static STRING msg = { (char *)0, 0, 0 }; + + return buildMyString(str, &msg); +} + +char * +readLine(fp, save, iLine) + FILE *fp; + STRING *save; + int *iLine; +{ + static char buf[1024]; + char *wholeline = (char *)0; + char *ret; + int i, buflen, peek, commentCheck = 1, comment = 0; + static STRING bufstr = { (char *)0, 0, 0 }; + static STRING wholestr = { (char *)0, 0, 0 }; + + + peek = 0; + wholeline = (char *)0; + buildMyString((char *)0, &bufstr); + buildMyString((char *)0, &wholestr); + while (save->used || ((ret = fgets(buf, sizeof(buf), fp)) != (char *)0) + || peek) { + /* If we have a previously saved line, use it instead */ + if (save->used) { + (void)strcpy(buf, save->string); + buildMyString((char *)0, save); + } + + if (peek) { + /* End of file? Never mind. */ + if (ret == (char *)0) + break; + + /* If we don't have a line continuation and we've seen + * some worthy data + */ + if (!isspace((int)buf[0]) && (wholeline != (char *)0)) { + buildMyString((char *)0, save); + buildMyString(buf, save); + break; + } + + peek = 0; + } + + if (commentCheck) { + for (i = 0; buf[i] != '\000'; i++) + if (!isspace((int)buf[i])) + break; + if (buf[i] == '#') { + comment = 1; + commentCheck = 0; + } else if (buf[i] != '\000') { + commentCheck = 0; + } + } + + /* Check for EOL */ + buflen = strlen(buf); + if ((buflen >= 1) && (buf[buflen - 1] == '\n')) { + (*iLine)++; /* Finally have a whole line */ + if (comment == 0 && commentCheck == 0) { + /* Finish off the chunk without the \n */ + buf[buflen - 1] = '\000'; + buildMyString(buf, &bufstr); + wholeline = buildMyString(bufstr.string, &wholestr); + } + peek = 1; + comment = 0; + commentCheck = 1; + buildMyString((char *)0, &bufstr); + } else { + /* Save off the partial chunk */ + buildMyString(buf, &bufstr); + } + } + + /* If we hit the EOF and weren't peeking ahead + * and it's not a comment + */ + if (!peek && (ret == (char *)0) && (comment == 0) && + (commentCheck == 0)) { + (*iLine)++; + wholeline = buildMyString(bufstr.string, &wholestr); + } + + Debug("readLine: returning <%s>", + (wholeline != (char *)0) ? wholeline : ""); + return wholeline; } void diff --git a/conserver/util.h b/conserver/util.h index 22d1acb..9c6fa67 100644 --- a/conserver/util.h +++ b/conserver/util.h @@ -1,5 +1,5 @@ /* - * $Id: util.h,v 1.8 2001-07-22 12:54:59-07 bryan Exp $ + * $Id: util.h,v 1.11 2001-08-04 18:33:17-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -18,6 +18,12 @@ enum consFileType { #endif }; +typedef struct dynamicString { + char *string; + int used; + int allocated; +} STRING; + typedef struct consFile { /* Standard socket type stuff */ enum consFileType ftype; @@ -52,3 +58,5 @@ extern int fileSend(); extern int fileFDNum(); extern void OutOfMem(); extern char *buildString(); +extern char *buildMyString(); +extern char *readLine(); diff --git a/conserver/version.h b/conserver/version.h index 74a6f48..69f9847 100644 --- a/conserver/version.h +++ b/conserver/version.h @@ -1,5 +1,5 @@ /* - * $Id: version.h,v 1.26 2001-07-26 11:53:55-07 bryan Exp $ + * $Id: version.h,v 1.27 2001-08-04 21:09:31-07 bryan Exp $ * * Copyright conserver.com, 2000-2001 * @@ -14,4 +14,4 @@ @(#) Copyright 2000 conserver.com.\n\ All rights reserved.\n" -#define THIS_VERSION "conserver.com version 7.1.0" +#define THIS_VERSION "conserver.com version 7.1.1" diff --git a/contrib/redhat-rpm/conserver.spec b/contrib/redhat-rpm/conserver.spec index 2ad3875..1cae75a 100644 --- a/contrib/redhat-rpm/conserver.spec +++ b/contrib/redhat-rpm/conserver.spec @@ -4,7 +4,7 @@ # %define pkg conserver -%define ver 7.1.0 +%define ver 7.1.1 # define the name of the machine on which the main conserver # daemon will be running if you don't want to use the default diff --git a/contrib/solaris-package/pkginfo b/contrib/solaris-package/pkginfo index 903288a..b7e56f3 100644 --- a/contrib/solaris-package/pkginfo +++ b/contrib/solaris-package/pkginfo @@ -1,7 +1,7 @@ PKG="conserver" NAME="Console server and client" CATEGORY="system" -VERSION="7.1.0" +VERSION="7.1.1" DESC="Console server and client" CLASSES=none ARCH=sparc