diff options
Diffstat (limited to 'contrib/sendmail/src/util.c')
| -rw-r--r-- | contrib/sendmail/src/util.c | 309 |
1 files changed, 21 insertions, 288 deletions
diff --git a/contrib/sendmail/src/util.c b/contrib/sendmail/src/util.c index 785d36269eb98..ba35dcd9531cb 100644 --- a/contrib/sendmail/src/util.c +++ b/contrib/sendmail/src/util.c @@ -11,7 +11,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)util.c 8.167 (Berkeley) 12/1/1998"; +static char sccsid[] = "@(#)util.c 8.159 (Berkeley) 7/1/98"; #endif /* not lint */ # include "sendmail.h" @@ -174,182 +174,6 @@ rfc822_string(s) return TRUE; } /* -** SHORTEN_RFC822_STRING -- Truncate and rebalance an RFC822 string -** -** Arbitratily shorten (in place) an RFC822 string and rebalance -** comments and quotes. -** -** Parameters: -** string -- the string to shorten -** length -- the maximum size, 0 if no maximum -** -** Returns: -** TRUE if string is changed, FALSE otherwise -** -** Side Effects: -** Changes string in place, possibly resulting -** in a shorter string. -*/ - -bool -shorten_rfc822_string(string, length) - char *string; - size_t length; -{ - bool backslash = FALSE; - bool modified = FALSE; - bool quoted = FALSE; - size_t slen; - int parencount = 0; - char *ptr = string; - - /* - ** If have to rebalance an already short enough string, - ** need to do it within allocated space. - */ - slen = strlen(string); - if (length == 0 || slen < length) - length = slen; - - while (*ptr != '\0') - { - if (backslash) - { - backslash = FALSE; - goto increment; - } - - if (*ptr == '\\') - backslash = TRUE; - else if (*ptr == '(') - { - if (!quoted) - parencount++; - } - else if (*ptr == ')') - { - if (--parencount < 0) - parencount = 0; - } - - /* Inside a comment, quotes don't matter */ - if (parencount <= 0 && *ptr == '"') - quoted = !quoted; - -increment: - /* Check for sufficient space for next character */ - if (length - (ptr - string) <= ((backslash ? 1 : 0) + - parencount + - (quoted ? 1 : 0))) - { - /* Not enough, backtrack */ - if (*ptr == '\\') - backslash = FALSE; - else if (*ptr == '(' && !quoted) - parencount--; - else if (*ptr == '"' && parencount == 0) - quoted = FALSE; - break; - } - ptr++; - } - - /* Rebalance */ - while (parencount-- > 0) - { - if (*ptr != ')') - { - modified = TRUE; - *ptr = ')'; - } - ptr++; - } - if (quoted) - { - if (*ptr != '"') - { - modified = TRUE; - *ptr = '"'; - } - ptr++; - } - if (*ptr != '\0') - { - modified = TRUE; - *ptr = '\0'; - } - return modified; -} -/* -** FIND_CHARACTER -- find an unquoted character in an RFC822 string -** -** Find an unquoted, non-commented character in an RFC822 -** string and return a pointer to its location in the -** string. -** -** Parameters: -** string -- the string to search -** character -- the character to find -** -** Returns: -** pointer to the character, or -** a pointer to the end of the line if character is not found -*/ - -char * -find_character(string, character) - char *string; - char character; -{ - bool backslash = FALSE; - bool quoted = FALSE; - int parencount = 0; - - while (string != NULL && *string != '\0') - { - if (backslash) - { - backslash = FALSE; - if (!quoted && character == '\\' && *string == '\\') - break; - string++; - continue; - } - switch (*string) - { - case '\\': - backslash = TRUE; - break; - - case '(': - if (!quoted) - parencount++; - break; - - case ')': - if (--parencount < 0) - parencount = 0; - break; - } - - /* Inside a comment, nothing matters */ - if (parencount > 0) - { - string++; - continue; - } - - if (*string == '"') - quoted = !quoted; - else if (*string == character && !quoted) - break; - string++; - } - - /* Return pointer to the character */ - return string; -} -/* ** XALLOC -- Allocate memory and bitch wildly on failure. ** ** THIS IS A CLUDGE. This should be made to give a proper @@ -2022,13 +1846,7 @@ path_is_dir(pathname, createflag) ** none */ -struct procs -{ - pid_t proc_pid; - char *proc_task; -}; - -static struct procs *ProcListVec = NULL; +static pid_t *ProcListVec = NULL; static int ProcListSize = 0; #define NO_PID ((pid_t) 0) @@ -2037,15 +1855,15 @@ static int ProcListSize = 0; #endif void -proc_list_add(pid, task) +proc_list_add(pid) pid_t pid; - char *task; { int i; + extern void proc_list_probe __P((void)); for (i = 0; i < ProcListSize; i++) { - if (ProcListVec[i].proc_pid == NO_PID) + if (ProcListVec[i] == NO_PID) break; } if (i >= ProcListSize) @@ -2056,66 +1874,29 @@ proc_list_add(pid, task) /* now scan again */ for (i = 0; i < ProcListSize; i++) { - if (ProcListVec[i].proc_pid == NO_PID) + if (ProcListVec[i] == NO_PID) break; } } if (i >= ProcListSize) { /* grow process list */ - struct procs *npv; + pid_t *npv; - npv = (struct procs *) xalloc(sizeof (struct procs) * (ProcListSize + PROC_LIST_SEG)); + npv = (pid_t *) xalloc(sizeof (pid_t) * (ProcListSize + PROC_LIST_SEG)); if (ProcListSize > 0) { - bcopy(ProcListVec, npv, ProcListSize * - sizeof (struct procs)); + bcopy(ProcListVec, npv, ProcListSize * sizeof (pid_t)); free(ProcListVec); } for (i = ProcListSize; i < ProcListSize + PROC_LIST_SEG; i++) - { - npv[i].proc_pid = NO_PID; - npv[i].proc_task = NULL; - } + npv[i] = NO_PID; i = ProcListSize; ProcListSize += PROC_LIST_SEG; ProcListVec = npv; } - ProcListVec[i].proc_pid = pid; - ProcListVec[i].proc_task = newstr(task); - - /* if process adding itself, it's not a child */ - if (pid != getpid()) - CurChildren++; -} -/* -** PROC_LIST_SET -- set pid task in process list -** -** Parameters: -** pid -- pid to set -** task -- task of pid -** -** Returns: -** none. -*/ - -void -proc_list_set(pid, task) - pid_t pid; - char *task; -{ - int i; - - for (i = 0; i < ProcListSize; i++) - { - if (ProcListVec[i].proc_pid == pid) - { - if (ProcListVec[i].proc_task != NULL) - free(ProcListVec[i].proc_task); - ProcListVec[i].proc_task = newstr(task); - break; - } - } + ProcListVec[i] = pid; + CurChildren++; } /* ** PROC_LIST_DROP -- drop pid from process list @@ -2135,14 +1916,9 @@ proc_list_drop(pid) for (i = 0; i < ProcListSize; i++) { - if (ProcListVec[i].proc_pid == pid) + if (ProcListVec[i] == pid) { - ProcListVec[i].proc_pid = NO_PID; - if (ProcListVec[i].proc_task != NULL) - { - free(ProcListVec[i].proc_task); - ProcListVec[i].proc_task = NULL; - } + ProcListVec[i] = NO_PID; break; } } @@ -2164,16 +1940,8 @@ proc_list_clear() { int i; - /* start from 1 since 0 is the daemon itself */ - for (i = 1; i < ProcListSize; i++) - { - ProcListVec[i].proc_pid = NO_PID; - if (ProcListVec[i].proc_task != NULL) - { - free(ProcListVec[i].proc_task); - ProcListVec[i].proc_task = NULL; - } - } + for (i = 0; i < ProcListSize; i++) + ProcListVec[i] = NO_PID; CurChildren = 0; } /* @@ -2191,23 +1959,17 @@ proc_list_probe() { int i; - /* start from 1 since 0 is the daemon itself */ - for (i = 1; i < ProcListSize; i++) + for (i = 0; i < ProcListSize; i++) { - if (ProcListVec[i].proc_pid == NO_PID) + if (ProcListVec[i] == NO_PID) continue; - if (kill(ProcListVec[i].proc_pid, 0) < 0) + if (kill(ProcListVec[i], 0) < 0) { if (LogLevel > 3) sm_syslog(LOG_DEBUG, CurEnv->e_id, "proc_list_probe: lost pid %d", - (int) ProcListVec[i].proc_pid); - ProcListVec[i].proc_pid = NO_PID; - if (ProcListVec[i].proc_task != NULL) - { - free(ProcListVec[i].proc_task); - ProcListVec[i].proc_task = NULL; - } + ProcListVec[i]); + ProcListVec[i] = NO_PID; CurChildren--; } } @@ -2215,35 +1977,6 @@ proc_list_probe() CurChildren = 0; } /* -** PROC_LIST_DISPLAY -- display the process list -** -** Parameters: -** out -- output file pointer -** -** Returns: -** none. -*/ - -void -proc_list_display(out) - FILE *out; -{ - int i; - - for (i = 0; i < ProcListSize; i++) - { - if (ProcListVec[i].proc_pid == NO_PID) - continue; - - fprintf(out, "%d %s%s\n", (int) ProcListVec[i].proc_pid, - ProcListVec[i].proc_task != NULL ? - ProcListVec[i].proc_task : "(unknown)", - (OpMode == MD_SMTP || - OpMode == MD_DAEMON || - OpMode == MD_ARPAFTP) ? "\r" : ""); - } -} -/* ** SM_STRCASECMP -- 8-bit clean version of strcasecmp ** ** Thank you, vendors, for making this all necessary. |
