summaryrefslogtreecommitdiffstats
path: root/tools/draklive
Commit message (Expand)AuthorAgeFilesLines
* look for bootsplash config in live chroot, and try to find a '800x600' resolu...Olivier Blin2006-02-231-1/+4
* add information message about splash imageOlivier Blin2006-02-231-0/+1
* remove spurious spaceOlivier Blin2006-02-221-1/+1
* make sure mtab and fstab don't contain build-machine specific configurationOlivier Blin2006-02-221-0/+3
* perl_checker cleanupsThierry Vignaud2006-02-221-9/+11
* make generating the previous HW config file somewhat more readableThierry Vignaud2006-02-221-1/+1
* make sure kbluetoothdrc is readable (useful when building with a paranoid sec...Olivier Blin2006-02-221-1/+3
* use syslinux splash from themeOlivier Blin2006-02-221-2/+8
* use run_program::raw({ root => ... }, ...) instead of various chroot commandsOlivier Blin2006-02-221-7/+7
* (post_install_system) explainThierry Vignaud2006-02-201-1/+2
* (post_install_system) fix auto configuration on live boot (aka fixThierry Vignaud2006-02-201-1/+1
* allow to use a local rpmsrateOlivier Blin2006-02-171-1/+3
* fix yet another typoOlivier Blin2006-02-171-1/+1
* fix region suffixOlivier Blin2006-02-171-1/+1
* don't use 'noregion' subdir if $live->{regions} doesn't existOlivier Blin2006-02-171-4/+7
* remove useless parenthesesOlivier Blin2006-02-171-1/+1
* add missing quoteOlivier Blin2006-02-171-1/+1
* add the all-regions option to proceed with all regionsOlivier Blin2006-02-171-6/+13
* remove unused variableOlivier Blin2006-02-171-3/+3
* move mountpoint in regional workdirOlivier Blin2006-02-171-1/+1
* fix errors from previous commitOlivier Blin2006-02-171-11/+11
* move code in complete_configOlivier Blin2006-02-171-20/+22
* use regional chroots and workdirsOlivier Blin2006-02-171-51/+63
* pass a set of langs to drakx-in-chroot according to region settingsOlivier Blin2006-02-171-0/+4
* allow to erase rpms after install (aka the lazy rpmsrate patch)Olivier Blin2006-02-171-0/+2
* don't make kbluetoothdrc display an annoying and useless popup windowOlivier Blin2006-02-171-0/+4
* use /etc path to kdm config fileOlivier Blin2006-02-171-1/+1
* run drakx-in-chroot with enough timeout slackOlivier Blin2006-02-171-1/+2
* allow to pass run_program options to run_Olivier Blin2006-02-171-1/+2
* try to display an error message when the config file can't be openedOlivier Blin2006-02-171-1/+1
* copy rpms in chroot and use rpm from the chroot (to avoid rpm version mismatch)Olivier Blin2006-02-091-3/+8
* don't have a useless empty hash in wizards objects, use the wizards hashOlivier Blin2006-01-031-4/+4
* use -boot prefix in syslinux file only if a specific boot type is specifiedOlivier Blin2006-01-021-1/+1
* use --inplace option in rsync, to avoid missing space when overwriting an exi...Olivier Blin2005-12-291-1/+1
* don't record loopbacks on boot masterOlivier Blin2005-12-291-1/+1
* name the boot cdrom master as boot.iso (and factorize)Olivier Blin2005-12-291-2/+7
* allow to use --boot-only for master/format/record stepsOlivier Blin2005-12-291-4/+3
* add optionnal boot storage type in $media->{boot} and build a custom syslinux...Olivier Blin2005-12-291-8/+15
* rename refresh_boot_only as boot_onlyOlivier Blin2005-12-291-2/+2
* remove --record-boot option, this can be achieved using --boot-only --record nowOlivier Blin2005-12-291-7/+0
* fix spacingOlivier Blin2005-12-291-2/+2
* add --boot-only option to prepare for special boot imagesOlivier Blin2005-12-291-2/+6
* use dashes instead of underscores in command line optionsOlivier Blin2005-12-291-8/+8
* require root capabilitiesOlivier Blin2005-12-291-1/+3
* sort storage typesOlivier Blin2005-12-291-1/+1
* install packages using urpmi --autoOlivier Blin2005-12-281-1/+1
* add some minimal help in syslinuxOlivier Blin2005-12-281-2/+12
* check that abs_path doesn't fail to find (rpm/patch) filesOlivier Blin2005-12-271-6/+6
* add missing newline charactersOlivier Blin2005-12-271-2/+2
* add patches config option to apply patches on the installed systemOlivier Blin2005-12-271-0/+6
s.h" #include "tools.h" #include "url.h" #define TIMEOUT_SECS 60 #define BUFFER_SIZE 4096 static int ftp_check_response(int sock, char ** str) { static char buf[BUFFER_SIZE + 1]; int bufLength = 0; fd_set emptySet, readSet; char * chptr, * start; struct timeval timeout; int bytesRead, rc = 0; int doesContinue = 1; char errorCode[4]; errorCode[0] = '\0'; do { FD_ZERO(&emptySet); FD_ZERO(&readSet); FD_SET(sock, &readSet); timeout.tv_sec = TIMEOUT_SECS; timeout.tv_usec = 0; rc = select(sock + 1, &readSet, &emptySet, &emptySet, &timeout); if (rc < 1) { if (rc==0) return FTPERR_BAD_SERVER_RESPONSE; else rc = FTPERR_UNKNOWN; } else rc = 0; bytesRead = read(sock, buf + bufLength, sizeof(buf) - bufLength - 1); bufLength += bytesRead; buf[bufLength] = '\0'; /* divide the response into lines, checking each one to see if we are finished or need to continue */ start = chptr = buf; do { while (*chptr != '\n' && *chptr) chptr++; if (*chptr == '\n') { *chptr = '\0'; if (*(chptr - 1) == '\r') *(chptr - 1) = '\0'; if (str) *str = start; if (errorCode[0]) { if (!strncmp(start, errorCode, 3) && start[3] == ' ') doesContinue = 0; } else { strncpy(errorCode, start, 3); errorCode[3] = '\0'; if (start[3] != '-') { doesContinue = 0; } } start = chptr + 1; chptr++; } else { chptr++; } } while (*chptr); if (doesContinue && chptr > start) { memcpy(buf, start, chptr - start - 1); bufLength = chptr - start - 1; } else { bufLength = 0; } } while (doesContinue && !rc); if (*errorCode == '4' || *errorCode == '5') { if (!strncmp(errorCode, "550", 3)) { return FTPERR_FILE_NOT_FOUND; } return FTPERR_BAD_SERVER_RESPONSE; } if (rc) return rc; return 0; } static int ftp_command(int sock, char * command, char * param) { char buf[500]; int rc; strcpy(buf, command); if (param) { strcat(buf, " "); strcat(buf, param); } strcat(buf, "\r\n"); if (write(sock, buf, strlen(buf)) != strlen(buf)) { return FTPERR_SERVER_IO_ERROR; } if ((rc = ftp_check_response(sock, NULL))) return rc; return 0; } static int get_host_address(const char * host, struct in_addr * address) { if (isdigit(host[0])) { if (!inet_aton(host, address)) { return FTPERR_BAD_HOST_ADDR; } } else { if (mygethostbyname((char *) host, address)) { errno = h_errno; return FTPERR_BAD_HOSTNAME; } } return 0; } int ftp_open_connection(char * host, char * name, char * password, char * proxy) { int sock; struct in_addr serverAddress; struct sockaddr_in destPort; char * buf; int rc; int port = 21; if (!strcmp(name, "")) { name = "anonymous"; password = "-drakx@"; } if (strcmp(proxy, "")) { buf = alloca(strlen(name) + strlen(host) + 5); sprintf(buf, "%s@%s", name, host); name = buf; host = proxy; } if ((rc = get_host_address(host, &serverAddress))) return rc; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (sock < 0) { return FTPERR_FAILED_CONNECT; } destPort.sin_family = AF_INET; destPort.sin_port = htons(port); destPort.sin_addr = serverAddress; if (connect(sock, (struct sockaddr *) &destPort, sizeof(destPort))) { close(sock); return FTPERR_FAILED_CONNECT; } /* ftpCheckResponse() assumes the socket is nonblocking */ if (fcntl(sock, F_SETFL, O_NONBLOCK)) { close(sock); return FTPERR_FAILED_CONNECT; } if ((rc = ftp_check_response(sock, NULL))) { return rc; } if ((rc = ftp_command(sock, "USER", name))) { close(sock); return rc; } if ((rc = ftp_command(sock, "PASS", password))) { close(sock); return rc; } if ((rc = ftp_command(sock, "TYPE", "I"))) { close(sock); return rc; } return sock; } int ftp_data_command(int sock, char * command, char * param) { int dataSocket; struct sockaddr_in dataAddress; int i, j; char * passReply; char * chptr; char retrCommand[500]; int rc; if (write(sock, "PASV\r\n", 6) != 6) { return FTPERR_SERVER_IO_ERROR; } if ((rc = ftp_check_response(sock, &passReply))) return FTPERR_PASSIVE_ERROR; chptr = passReply; while (*chptr && *chptr != '(') chptr++; if (*chptr != '(') return FTPERR_PASSIVE_ERROR; chptr++; passReply = chptr; while (*chptr && *chptr != ')') chptr++; if (*chptr != ')') return FTPERR_PASSIVE_ERROR; *chptr-- = '\0'; while (*chptr && *chptr != ',') chptr--; if (*chptr != ',') return FTPERR_PASSIVE_ERROR; chptr--; while (*chptr && *chptr != ',') chptr--; if (*chptr != ',') return FTPERR_PASSIVE_ERROR; *chptr++ = '\0'; /* now passReply points to the IP portion, and chptr points to the port number portion */ dataAddress.sin_family = AF_INET; if (sscanf(chptr, "%d,%d", &i, &j) != 2) { return FTPERR_PASSIVE_ERROR; } dataAddress.sin_port = htons((i << 8) + j); chptr = passReply; while (*chptr++) { if (*chptr == ',') *chptr = '.'; } if (!inet_aton(passReply, &dataAddress.sin_addr)) return FTPERR_PASSIVE_ERROR; dataSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (dataSocket < 0) { return FTPERR_FAILED_CONNECT; } if (!param) sprintf(retrCommand, "%s\r\n", command); else sprintf(retrCommand, "%s %s\r\n", command, param); i = strlen(retrCommand); if (write(sock, retrCommand, i) != i) { return FTPERR_SERVER_IO_ERROR; } if (connect(dataSocket, (struct sockaddr *) &dataAddress, sizeof(dataAddress))) { close(dataSocket); return FTPERR_FAILED_DATA_CONNECT; } if ((rc = ftp_check_response(sock, NULL))) { close(dataSocket); return rc; } return dataSocket; } static int ftp_get_filesize(int sock, char * remotename) { int size = 0; char buf[2000]; char file[500]; char * ptr; int fd, rc, tot; int i; strcpy(buf, remotename); ptr = strrchr(buf, '/'); if (!*ptr) return -1; *ptr = '\0'; strcpy(file, ptr+1); if ((rc = ftp_command(sock, "CWD", buf))) { return -1; } fd = ftp_data_command(sock, "LIST", NULL); if (fd <= 0) { close(sock); return -1; } ptr = buf; while ((tot = read(fd, ptr, sizeof(buf) - (ptr - buf))) != 0) ptr += tot; *ptr = '\0'; close(fd); if (!(ptr = strstr(buf, file))) { log_message("FTP/get_filesize: Bad mood, directory does not contain searched file (%s)", file); if (ftp_end_data_command(sock)) close(sock); return -1; } for (i=0; i<4; i++) { while (*ptr && *ptr != ' ') ptr--; while (*ptr && *ptr == ' ') ptr--; } while (*ptr && *ptr != ' ') ptr--; if (ptr) size = charstar_to_int(ptr+1); else size = 0; if (ftp_end_data_command(sock)) { close(sock); return -1; } return size; } int ftp_start_download(int sock, char * remotename, int * size) { if ((*size = ftp_get_filesize(sock, remotename)) == -1) { log_message("FTP: could not get filesize (trying to continue)"); *size = 0; } return ftp_data_command(sock, "RETR", remotename); } int ftp_end_data_command(int sock) { if (ftp_check_response(sock, NULL)) return FTPERR_BAD_SERVER_RESPONSE; return 0; } int http_download_file(char * hostname, char * remotename, int * size) { char * buf; struct timeval timeout; char headers[4096]; char * nextChar = headers; int checkedCode; struct in_addr serverAddress; int sock; int rc; struct sockaddr_in destPort; fd_set readSet; char * header_content_length = "Content-Length: "; if ((rc = get_host_address(hostname, &serverAddress))) return rc; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (sock < 0) { return FTPERR_FAILED_CONNECT; } destPort.sin_family = AF_INET; destPort.sin_port = htons(80); destPort.sin_addr = serverAddress; if (connect(sock, (struct sockaddr *) &destPort, sizeof(destPort))) { close(sock); return FTPERR_FAILED_CONNECT; } buf = alloca(strlen(remotename) + 20); sprintf(buf, "GET %s HTTP/0.9\r\n\r\n", remotename); write(sock, buf, strlen(buf)); /* This is fun; read the response a character at a time until we: 1) Get our first \r\n; which lets us check the return code 2) Get a \r\n\r\n, which means we're done */ *nextChar = '\0'; checkedCode = 0; while (!strstr(headers, "\r\n\r\n")) { FD_ZERO(&readSet); FD_SET(sock, &readSet); timeout.tv_sec = TIMEOUT_SECS; timeout.tv_usec = 0; rc = select(sock + 1, &readSet, NULL, NULL, &timeout); if (rc == 0) { close(sock); return FTPERR_SERVER_TIMEOUT; } else if (rc < 0) { close(sock); return FTPERR_SERVER_IO_ERROR; } if (read(sock, nextChar, 1) != 1) { close(sock); return FTPERR_SERVER_IO_ERROR; } nextChar++; *nextChar = '\0'; if (nextChar - headers == sizeof(headers)) { close(sock); return FTPERR_SERVER_IO_ERROR; } if (!checkedCode && strstr(headers, "\r\n")) { char * start, * end; checkedCode = 1; start = headers; while (!isspace(*start) && *start) start++; if (!*start) { close(sock); return FTPERR_SERVER_IO_ERROR; } start++; end = start; while (!isspace(*end) && *end) end++; if (!*end) { close(sock); return FTPERR_SERVER_IO_ERROR; } *end = '\0'; if (!strcmp(start, "404")) { close(sock); return FTPERR_FILE_NOT_FOUND; } else if (strcmp(start, "200")) { close(sock); return FTPERR_BAD_SERVER_RESPONSE; } *end = ' '; } } if ((buf = strstr(headers, header_content_length))) *size = charstar_to_int(buf + strlen(header_content_length)); else *size = 0; return sock; }