69,371
社区成员
发帖
与我相关
我的任务
分享
#include "../unp.h"
#include <sys/mman.h>
#define GET "GET "
#define HOST "Host: "
#define REFERER "Referer: "
#define HTTP "http://"
#define DATA_BLOCK_SIZE 10000
char * file_map_ptr;
struct data_block {
char * ptr;
ssize_t size;
}data_block[DATA_BLOCK_SIZE], * data_block_ptr;
struct url_referer {
char * url;
char * referer;
}url_referer[DATA_BLOCK_SIZE];
void init_data_block(const void * file_ptr, ssize_t file_size, struct data_block * block, ssize_t block_size);
char * memstr(const char * haystack, const char * needle, size_t len);
void get_url_refer(struct data_block * block, ssize_t len);
int
main(int argc, char ** argv) {
int fd, i;
struct stat file_stat;
if (argc != 2) {
err_quit("Usage: %s <filename>", argv[0]);
}
fd = open(argv[1], O_RDONLY);
if (fd < 0) {
err_sys("Open file %s error", argv[1]);
}
if (fstat(fd, &file_stat) < 0) {
err_sys("fstat error");
}
printf("file size: %d K\n", (int)(file_stat.st_size / 1024));
file_map_ptr = mmap(NULL, file_stat.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (file_map_ptr == MAP_FAILED) {
err_sys("map failed");
}
printf("file mapped success\n");
data_block_ptr = NULL;
memset(data_block, 0, sizeof(data_block));
init_data_block(file_map_ptr, file_stat.st_size, data_block, DATA_BLOCK_SIZE);
for (i = 0; i < DATA_BLOCK_SIZE; ++i) {
if (data_block[i].ptr == NULL)
break;
else {
printf("%s\n", data_block[i].ptr);
printf("strlen() = %d\n", strlen(data_block[i].ptr));
printf("calculated size: %d\n", data_block[i].size);
}
}
printf("block size: %d\n", i);
get_url_refer(data_block, DATA_BLOCK_SIZE);
return 0;
}
char *
memstr(const char * haystack, const char * needle, size_t len) {
char * p;
size_t needle_len;
needle_len = strlen(needle);
if (haystack == NULL || needle == NULL)
return NULL;
for (p = (char *)haystack; p <= haystack + len - needle_len; p++) {
if (memcmp(p, needle, needle_len) == 0) {
return p;
}
}
return NULL;
}
void
init_data_block(const void * file_ptr, ssize_t file_size, struct data_block * block, ssize_t n) {
char * p, * q, * t, * file_end;
ssize_t i, s;
file_end = (char *)file_ptr + file_size;
for (i = 0, t = (char *)file_ptr; t < (char *)file_end && i < n; ++i) {
p = memstr(t, GET, file_end - t);
if (p) {
q = memstr(p + strlen(GET), GET, file_end - p - strlen(GET));
if (q) {
s = q - p;
}
else {
s = file_end - p;
}
data_block[i].ptr = p;
data_block[i].size = s;
t = p + strlen(GET);
}
else
break;
}
return ;
}
void
get_url_refer(struct data_block * block, ssize_t len) {
int i;
char * p, * q, * get, * referer, * host, * url;
ssize_t get_size, host_size, referer_size, url_size;
memset(url_referer, 0, sizeof(url_referer));
p = q = get = referer = host = url = NULL;
for (i = 0; i < len && block[i].ptr != NULL; ++i) {
p = block[i].ptr;
q = p + strlen(GET);
while(* q != ' ' && * q != '\r') q++;
get_size = q - p - strlen(GET);
get = (char *)malloc(get_size + 1);
memset(get, 0, get_size + 1);
memcpy(get, p + strlen(GET), get_size);
p = memstr(block[i].ptr, HOST, block[i].size);
if (p) {
q = p + strlen(HOST);
while(* q != '\r' && *q != ' ') q++;
host_size = q - p - strlen(HOST);
host = (char *)calloc(host_size + 1, sizeof(char));
memcpy(host, p + strlen(HOST), host_size);
}
p = memstr(block[i].ptr, REFERER, block[i].size);
if (p) {
q = p + strlen(REFERER);
while(*q != '\r' && *q != ' ') q++;
referer_size = q - p - strlen(REFERER);
referer = (char *)calloc(referer_size + 1, sizeof(char));
memcpy(referer, p + strlen(REFERER), referer_size);
}
url_size = host_size + get_size + strlen(HTTP);
url = (char *)calloc(url_size + 1, sizeof(char));
memcpy(url, HTTP, strlen(HTTP));
memcpy(url + strlen(HTTP), host, host_size);
memcpy(url + strlen(HTTP) + host_size, get, get_size);
free(host);
printf("free(host) ok\n");
free(get);
printf("free(get) ok\n");
url_referer[i].url = url;
url_referer[i].referer = referer;
printf("url = %s\n", url);
if (referer)
printf("referer = %s\n", referer);
else
printf("referer is NULL\n");
}
return ;
}
指针 = (类型*)malloc(sizeof(类型) * 数量);