| @@ -3,6 +3,9 @@ appname = cms | |||
| build: | |||
| gcc -o $(appname) src/*.c -std=c99 | |||
| debug: | |||
| gcc -o $(appname) src/*.c -std=c99 -DDEBUG=1 | |||
| install: | |||
| mv $(appname) /usr/bin/$(appname) | |||
| @@ -0,0 +1,7 @@ | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| @@ -0,0 +1,8 @@ | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| This is placeholder text. | |||
| @@ -3,7 +3,11 @@ | |||
| #include <stdlib.h> | |||
| #include <errno.h> | |||
| static char* get_message(cms_err err) | |||
| #ifdef DEBUG | |||
| #include <error.h> | |||
| #endif | |||
| static char* get_error_message(cms_err err) | |||
| { | |||
| switch (err) | |||
| { | |||
| @@ -15,14 +19,16 @@ static char* get_message(cms_err err) | |||
| return "Memory allocation failed."; | |||
| case CMS_ERR_PARSE: | |||
| return "Parse error."; | |||
| case CMS_ERR_FILENOENT: | |||
| return "File doesn't exist."; | |||
| case CMS_ERR_DIRNOENT: | |||
| return "Directory doesn't exist."; | |||
| case CMS_ERR_NOENT: | |||
| return "No such file or directory."; | |||
| case CMS_ERR_NOTFILE: | |||
| return "Not a file."; | |||
| case CMS_ERR_NOTDIR: | |||
| return "Not a directory."; | |||
| case CMS_ERR_FILEEXISTS: | |||
| return "File exists."; | |||
| case CMS_ERR_DIREXISTS: | |||
| return "Directory exists."; | |||
| case CMS_ERR_PERM: | |||
| return "Permission denied."; | |||
| case CMS_ERR_INITED: | |||
| @@ -32,21 +38,29 @@ static char* get_message(cms_err err) | |||
| } | |||
| } | |||
| void cms_err_panic(cms_err err, char* msg) | |||
| void _cms_err_panic(cms_err err, char* msg, const char* file, int line) | |||
| { | |||
| if (err == CMS_ERR_NONE) | |||
| return; | |||
| #ifdef DEBUG | |||
| fprintf(stderr, "File %s, line %i:\n\t", file, line); | |||
| #endif | |||
| if (msg == NULL) | |||
| fprintf(stderr, "Error: %s\n", get_message(err)); | |||
| fprintf(stderr, "Error: %s\n", get_error_message(err)); | |||
| else | |||
| fprintf(stderr, "Error: %s (%s)\n", get_message(err), msg); | |||
| fprintf(stderr, "Error: %s: %s\n", msg, get_error_message(err)); | |||
| exit(1); | |||
| } | |||
| cms_err cms_err_from_std_err(int err) | |||
| { | |||
| #ifdef DEBUG | |||
| error(0, err, "converting to cms_err"); | |||
| #endif | |||
| switch (err) | |||
| { | |||
| case EACCES: | |||
| @@ -58,7 +72,7 @@ cms_err cms_err_from_std_err(int err) | |||
| case EISDIR: | |||
| return CMS_ERR_NOTFILE; | |||
| case ENOENT: | |||
| return CMS_ERR_FILENOENT; | |||
| return CMS_ERR_NOENT; | |||
| case ENOMEM: | |||
| return CMS_ERR_ALLOC; | |||
| case ENOTDIR: | |||
| @@ -7,8 +7,7 @@ typedef enum cms_err | |||
| CMS_ERR_UNKNOWN, | |||
| CMS_ERR_ALLOC, | |||
| CMS_ERR_PARSE, | |||
| CMS_ERR_FILENOENT, | |||
| CMS_ERR_DIRNOENT, | |||
| CMS_ERR_NOENT, | |||
| CMS_ERR_NOTFILE, | |||
| CMS_ERR_NOTDIR, | |||
| CMS_ERR_FILEEXISTS, | |||
| @@ -18,8 +17,10 @@ typedef enum cms_err | |||
| CMS_ERR_NOTINITED | |||
| } cms_err; | |||
| void cms_err_panic(cms_err err, char* msg); | |||
| void _cms_err_panic(cms_err err, char* msg, const char* file, int line); | |||
| #define cms_err_panic(err, msg) _cms_err_panic(err, msg, __FILE__, __LINE__) | |||
| cms_err cms_err_from_std_err(int err); | |||
| #endif | |||
| @@ -28,7 +28,7 @@ int cms_util_file_exists(char* fname) | |||
| cms_err cms_util_file_create(char* fname) | |||
| { | |||
| int f = open(fname, O_CREAT); | |||
| int f = open(fname, O_CREAT, 0777); | |||
| close(f); | |||
| if (f == -1) | |||
| @@ -40,7 +40,12 @@ cms_err cms_util_file_create(char* fname) | |||
| cms_err cms_util_file_copy(char* fname1, char* fname2) | |||
| { | |||
| int f1 = open(fname1, O_RDONLY); | |||
| int f2 = open(fname2, O_WRONLY); | |||
| if (f1 == -1) | |||
| return cms_err_from_std_err(errno); | |||
| int f2 = open(fname2, O_WRONLY | O_CREAT, 0777); | |||
| if (f1 == -1) | |||
| return cms_err_from_std_err(errno); | |||
| struct stat* s = malloc(sizeof(struct stat)); | |||
| if (s == NULL) | |||
| @@ -66,7 +71,7 @@ cms_err cms_util_file_copy(char* fname1, char* fname2) | |||
| cms_err cms_util_dir_copy_recursive(char* dir1, char* dir2) | |||
| { | |||
| if (mkdir(dir2, 0777) == -1) | |||
| if (mkdir(dir2, 0777) == -1 && errno != EEXIST) | |||
| return cms_err_from_std_err(errno); | |||
| DIR* dp = opendir(dir1); | |||
| @@ -81,9 +86,14 @@ cms_err cms_util_dir_copy_recursive(char* dir1, char* dir2) | |||
| while (ep = readdir(dp)) | |||
| { | |||
| if (ep->d_name[0] == '.') | |||
| continue; | |||
| char* path1 = cms_util_path_join(dir1, ep->d_name); | |||
| char* path2 = cms_util_path_join(dir2, ep->d_name); | |||
| stat(path1, st); | |||
| if (stat(path1, st) == -1) | |||
| return cms_err_from_std_err(errno); | |||
| if (S_ISDIR(st->st_mode)) | |||
| { | |||
| @@ -99,9 +109,10 @@ cms_err cms_util_dir_copy_recursive(char* dir1, char* dir2) | |||
| } | |||
| } | |||
| closedir(dp); | |||
| free(st); | |||
| return 0; | |||
| return CMS_ERR_NONE; | |||
| } | |||
| char* cms_util_path_join(char* str1, char* str2) | |||
| @@ -9,7 +9,7 @@ int main(int argc, char** argv) | |||
| { | |||
| if (argc < 2) | |||
| { | |||
| fprintf(stderr, "Usage: %s <init|build>\n", argv[0]); | |||
| fprintf(stderr, "Usage: %s <init|deinit|build>\n", argv[0]); | |||
| return 1; | |||
| } | |||
| @@ -32,8 +32,14 @@ int main(int argc, char** argv) | |||
| if (cms_util_file_exists(initedPath)) | |||
| cms_err_panic(CMS_ERR_INITED, NULL); | |||
| //Copy files from resources | |||
| cms_err_panic( | |||
| cms_util_dir_copy_recursive(CMS_FILE_RESOURCES, dirname), | |||
| dirname | |||
| ); | |||
| //Create .cmsinited file | |||
| cms_util_file_create(initedPath); | |||
| cms_err_panic(cms_util_file_create(initedPath), initedPath); | |||
| } | |||
| //Build | |||