Add comments to mygrep, begin implementing the http client

This commit is contained in:
Ivaylo Ivanov
2018-11-03 16:51:24 +01:00
parent 7765c6964a
commit e18af3e94e
6 changed files with 155 additions and 7 deletions

27
http/Makefile Normal file
View File

@@ -0,0 +1,27 @@
CC = gcc
CFLAGS = -std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809L -g -c
TARGET_1 = client
TARGET_2 = server
all: $(TARGET_1).c $(TARGET_2).c
$(CC) $(CFLAGS) $(TARGET_1).c $(TARGET_2).c
$(CC) $(TARGET_1).o -o $(TARGET_1)
$(CC) $(TARGET_2).o -o $(TARGET_2)
client: $(TARGET_1).c
$(CC) $(CFLAGS) $(TARGET_1).c
$(CC) $(TARGET_1).o -o $(TARGET_1)
server: $(TARGET_2).c
$(CC) $(CFLAGS) $(TARGET_2).c
$(CC) $(TARGET_2).o -o $(TARGET_2)
install:
cp $(TARGET_1) /usr/local/bin/myhttp-$(TARGET_1)
cp $(TARGET_2) /usr/local/bin/myhttp-$(TARGET_2)
clean:
$(RM) $(TARGET_1).o
$(RM) $(TARGET_1)
$(RM) $(TARGET_2).o
$(RM) $(TARGET_2)

View File

@@ -0,0 +1,84 @@
#define _GNU_SOURCE ///< in order for optarg to be defined
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "shared/http.h"
int main(int argc, char *argv[]) {
check_opts_number(argc);
int port = 80;
char *ofile = NULL;
char *dir = NULL;
char *url = NULL;
int c;
/// Process the options
while((c = getopt(argc, argv, "p:o:d:h")) != -1) {
switch(c) {
case 'p':
port = atoi(optarg);
break;
case 'o':
ofile = optarg;
break;
case 'd':
dir = optarg;
break;
case 'h':
printf("Command usage:\n");
print_usage();
exit(EXIT_SUCCESS);
break;
case '?':
print_usage();
exit(EXIT_FAILURE);
default:
abort();
}
}
/// Check for the case that both output file and directory are set
if(ofile != NULL && dir != NULL) {
printf("Either output file or directory is specified. You cannot use both.\n");
print_usage();
exit(EXIT_FAILURE);
}
/// Check if the required argument is there
if(argv[optind] == NULL) {
fprintf(stderr, "Mandatory argument 'url' missing.\n");
print_usage();
exit(EXIT_FAILURE);
} else {
url = argv[optind];
}
const char *full_url = strstr(url, "http://") + 7; //< the full url starts after http://
const char *path = strstr(full_url, "/");
}
static void print_usage(void) {
printf("client [-p PORT] [ -o FILE | -d DIR ] URL\n");
}
/**
* @brief Function to check the number of arguments
* @details Checks the number of arguments supplied to the command line.
* If the arguments are less than the required or more than possible, it exits
* @param argc Number of arguments obtained from the command line
* @return none
*
**/
static void check_opts_number(int argc) {
if(argc <= 1) {
fprintf(stderr, "At least one argument expected.\n");
print_usage();
exit(EXIT_FAILURE);
} else if(argc > 6) {
fprintf(stderr, "Too many arguments supplied.\n");
print_usage();
exit(EXIT_FAILURE);
}
}

7
http/shared/http.h Normal file
View File

@@ -0,0 +1,7 @@
#ifndef HTTP_HEADER_FILE
#define HTTP_HEADER_FILE
static void print_usage();
static void check_opts_number(int argc);
#endif