X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=jcc.c;h=47337bd59d478364e7c34e94155bbc8411e8e449;hb=e354ea116b849244d1fcd4eb14debac949793641;hp=7e6f93fa7bf2bd25ce853c0eb378d7d1c8861dba;hpb=0495e2e0c029a829fa510b5dab638334b5ba3665;p=privoxy.git diff --git a/jcc.c b/jcc.c index 7e6f93fa..47337bd5 100644 --- a/jcc.c +++ b/jcc.c @@ -1,4 +1,4 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.74 2002/03/06 00:49:31 jongfoster Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.77 2002/03/07 03:52:06 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.c,v $ @@ -33,6 +33,16 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.74 2002/03/06 00:49:31 jongfoster Exp $"; * * Revisions : * $Log: jcc.c,v $ + * Revision 1.77 2002/03/07 03:52:06 oes + * - Fixed compiler warnings etc + * - Improved handling of failed DNS lookups + * + * Revision 1.76 2002/03/06 22:54:35 jongfoster + * Automated function-comment nitpicking. + * + * Revision 1.75 2002/03/06 10:02:19 oes + * Fixed stupid bug when --user was not given + * * Revision 1.74 2002/03/06 00:49:31 jongfoster * Fixing warning on Windows * Making #ifdefs that refer to the same variable consistently @@ -484,6 +494,7 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.74 2002/03/06 00:49:31 jongfoster Exp $"; #ifdef unix #include +#include #endif # include @@ -585,7 +596,7 @@ static const char VANILLA_WAFER[] = * to be reopened by the main thread on HUP. * * Parameters : - * 1 : the_signal - the signal cause this function to call + * 1 : the_signal = the signal cause this function to call * * Returns : - * @@ -671,6 +682,7 @@ static void chat(struct client_state *csp) int byte_count = 0; const struct forward_spec * fwd; struct http_request *http; + size_t len; /* for buffer sizes */ #ifdef FEATURE_KILL_POPUPS int block_popups; /* bool, 1==will block popups */ int block_popups_now = 0; /* bool, 1==currently blocking popups */ @@ -694,11 +706,11 @@ static void chat(struct client_state *csp) while (FOREVER) { - n = read_socket(csp->cfd, buf, sizeof(buf)); + len = read_socket(csp->cfd, buf, sizeof(buf)); - if (n <= 0) break; /* error! */ + if (len <= 0) break; /* error! */ - add_to_iob(csp, buf, n); + add_to_iob(csp, buf, len); req = get_header(csp); @@ -911,13 +923,13 @@ static void chat(struct client_state *csp) { if ( ( p = get_header(csp) ) && ( *p == '\0' ) ) { - n = read_socket(csp->cfd, buf, sizeof(buf)); - if (n <= 0) + len = read_socket(csp->cfd, buf, sizeof(buf)); + if (len <= 0) { log_error(LOG_LEVEL_ERROR, "read from client failed: %E"); return; } - add_to_iob(csp, buf, n); + add_to_iob(csp, buf, len); continue; } @@ -1043,9 +1055,9 @@ static void chat(struct client_state *csp) * (along with anything else that may be in the buffer) */ - n = strlen(hdr); + len = strlen(hdr); - if ((write_socket(csp->sfd, hdr, n) != n) + if ((write_socket(csp->sfd, hdr, len) != len) || (flush_socket(csp->sfd, csp ) < 0)) { log_error(LOG_LEVEL_CONNECT, "write header to: %s failed: %E", @@ -1120,14 +1132,14 @@ static void chat(struct client_state *csp) if (FD_ISSET(csp->cfd, &rfds)) { - n = read_socket(csp->cfd, buf, sizeof(buf)); + len = read_socket(csp->cfd, buf, sizeof(buf)); - if (n <= 0) + if (len <= 0) { break; /* "game over, man" */ } - if (write_socket(csp->sfd, buf, n) != n) + if (write_socket(csp->sfd, buf, len) != len) { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); return; @@ -1145,9 +1157,9 @@ static void chat(struct client_state *csp) if (FD_ISSET(csp->sfd, &rfds)) { fflush( 0 ); - n = read_socket(csp->sfd, buf, sizeof(buf) - 1); + len = read_socket(csp->sfd, buf, sizeof(buf) - 1); - if (n < 0) + if (len < 0) { log_error(LOG_LEVEL_ERROR, "read from: %s failed: %E", http->host); @@ -1172,7 +1184,7 @@ static void chat(struct client_state *csp) /* Add a trailing zero. This lets filter_popups * use string operations. */ - buf[n] = '\0'; + buf[len] = '\0'; #ifdef FEATURE_KILL_POPUPS /* Filter the popups on this read. */ @@ -1200,7 +1212,7 @@ static void chat(struct client_state *csp) * doesn't generate a valid header, then we won't * transmit anything to the client. */ - if (n == 0) + if (len == 0) { if (server_body || http->ssl) @@ -1229,9 +1241,9 @@ static void chat(struct client_state *csp) log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); } - n = strlen(hdr); + len = strlen(hdr); - if ((write_socket(csp->cfd, hdr, n) != n) + if ((write_socket(csp->cfd, hdr, len) != len) || (write_socket(csp->cfd, p != NULL ? p : csp->iob->cur, csp->content_length) != (int)csp->content_length)) { log_error(LOG_LEVEL_ERROR, "write modified content to client failed: %E"); @@ -1251,7 +1263,7 @@ static void chat(struct client_state *csp) * This is NOT the body, so * Let's pretend the server just sent us a blank line. */ - n = sprintf(buf, "\r\n"); + len = sprintf(buf, "\r\n"); /* * Now, let the normal header parsing algorithm below do its @@ -1271,7 +1283,7 @@ static void chat(struct client_state *csp) { if (content_filter) { - add_to_iob(csp, buf, n); + add_to_iob(csp, buf, len); /* * If the buffer limit will be reached on the next read, @@ -1289,11 +1301,11 @@ static void chat(struct client_state *csp) log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); } - n = strlen(hdr); - byte_count += n; + len = strlen(hdr); + byte_count += len; - if (((write_socket(csp->cfd, hdr, n) != n) - || (n = flush_socket(csp->cfd, csp) < 0))) + if (((write_socket(csp->cfd, hdr, len) != len) + || (len = flush_socket(csp->cfd, csp) < 0))) { log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E"); @@ -1302,7 +1314,7 @@ static void chat(struct client_state *csp) } freez(hdr); - byte_count += n; + byte_count += len; content_filter = NULL; server_body = 1; @@ -1311,13 +1323,13 @@ static void chat(struct client_state *csp) } else { - if (write_socket(csp->cfd, buf, n) != n) + if (write_socket(csp->cfd, buf, len) != len) { log_error(LOG_LEVEL_ERROR, "write to client failed: %E"); return; } } - byte_count += n; + byte_count += len; continue; } else @@ -1328,7 +1340,7 @@ static void chat(struct client_state *csp) */ /* buffer up the data we just read */ - add_to_iob(csp, buf, n); + add_to_iob(csp, buf, len); /* get header lines from the iob */ @@ -1383,7 +1395,7 @@ static void chat(struct client_state *csp) log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); } - n = strlen(hdr); + len = strlen(hdr); /* write the server's (modified) header to * the client (along with anything else that @@ -1429,8 +1441,8 @@ static void chat(struct client_state *csp) /* * Only write if we're not buffering for content modification */ - if (!content_filter && ((write_socket(csp->cfd, hdr, n) != n) - || (n = flush_socket(csp->cfd, csp) < 0))) + if (!content_filter && ((write_socket(csp->cfd, hdr, len) != len) + || (len = flush_socket(csp->cfd, csp) < 0))) { log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E"); @@ -1442,7 +1454,7 @@ static void chat(struct client_state *csp) return; } - if(!content_filter) byte_count += n; + if(!content_filter) byte_count += len; /* we're finished with the server's header */ @@ -1538,7 +1550,7 @@ static int32 server_thread(void *data) void usage(const char *myname) { printf("JunkBuster proxy version " VERSION " (" HOME_PAGE_URL ")\n" - "Usage: %s [--help] [--version] [--no-daemon] [--pidfile pidfile] [--user user] [configfile]\n" + "Usage: %s [--help] [--version] [--no-daemon] [--pidfile pidfile] [--user user[.group]] [configfile]\n" "Aborting.\n", myname); exit(2); @@ -1578,6 +1590,8 @@ int main(int argc, const char *argv[]) int argc_pos = 0; #ifdef unix struct passwd *pw = NULL; + struct group *grp = NULL; + char *p; #endif Argc = argc; @@ -1622,13 +1636,23 @@ int main(int argc, const char *argv[]) else if (strcmp(argv[argc_pos], "--user" ) == 0) { - if (++argc_pos == argc) usage(argv[0]); - pw = getpwnam(argv[argc_pos]); - - if (pw == NULL) + if (++argc_pos == argc) usage(argv[argc_pos]); + + if ((NULL != (p = strchr(argv[argc_pos], '.'))) && *(p + 1) != '0') + { + *p++ = '\0'; + if (NULL == (grp = getgrnam(p))) + { + log_error(LOG_LEVEL_FATAL, "Group %s not found.", p); + } + } + + if (NULL == (pw = getpwnam(argv[argc_pos]))) { log_error(LOG_LEVEL_FATAL, "User %s not found.", argv[argc_pos]); } + + if (p != NULL) *--p = '\0'; } #endif /* defined(unix) */ else @@ -1786,15 +1810,21 @@ int main(int argc, const char *argv[]) /* * As soon as we have written the PID file, we can switch - * to the user ID indicated by the --user option + * to the user and group ID indicated by the --user option */ write_pid_file(); - if ((NULL != pw) && setuid(pw->pw_uid)) + if (NULL != pw) { - log_error(LOG_LEVEL_FATAL, "Cannot setuid(): Insufficient permissions."); + if (((NULL != grp) && setgid(grp->gr_gid)) || (setgid(pw->pw_gid))) + { + log_error(LOG_LEVEL_FATAL, "Cannot setgid(): Insufficient permissions."); + } + if (setuid(pw->pw_uid)) + { + log_error(LOG_LEVEL_FATAL, "Cannot setuid(): Insufficient permissions."); + } } - } #endif /* defined unix */ @@ -1848,12 +1878,25 @@ static int bind_port_helper(struct configuration_spec * config) if (bfd < 0) { - log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E " - "- There may be another junkbuster or some other " - "proxy running on port %d", - (NULL != config->haddr) ? config->haddr : "INADDR_ANY", - config->hport, config->hport - ); + switch(bfd) + { + case -3 : + log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: " + "There may be another junkbuster or some other " + "proxy running on port %d", + (NULL != config->haddr) ? config->haddr : "INADDR_ANY", + config->hport, config->hport); + + case -2 : + log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: " + "The hostname is not resolvable", + (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport); + + default : + log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: because %E", + (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport); + } + /* shouldn't get here */ return -1; }