// syslog_manager.c 04/10/2014 Marco Chiarelli aka DekraN /* WARNING!!! This program is intended to be used, so linked at the compilation, exclusively with main.c of my suite program! I do not assume any responsibilities about the use with any other code-scripts. */ #include "dutils.h" #ifdef ALLOW_SYSLOGMANAGER // FUNCTIONS DECLARATIONS __MSSHELL_WRAPPER_ static void _MS__private __system createLog(const sel_typ argc, char ** argv); __MSSHELL_WRAPPER_ static void _MS__private __system viewLog(const sel_typ argc, char ** argv); __MSSHELL_WRAPPER_ static void _MS__private __system printLog(const sel_typ argc, char ** argv); __MSSHELL_WRAPPER_ static void _MS__private __system editLog(const sel_typ argc, char ** argv); __MSSHELL_WRAPPER_ static void _MS__private __system updLog(const sel_typ argc, char ** argv); __MSSHELL_WRAPPER_ static void _MS__private __system relLog(const sel_typ argc, char ** argv); __MSSHELL_WRAPPER_ static void _MS__private __system selLogBufLen(const sel_typ argc, char ** argv); __MSSHELL_WRAPPER_ static void _MS__private __system flushLogBuf(const sel_typ argc, char ** argv); __MSSHELL_WRAPPER_ static void _MS__private __system renLog(const sel_typ argc, char ** argv); sprog syslog_manager[MAX_SYSLOGMANAGER_PROGS] = { [SYSLOG_OPEN] = { "Open System Log ("DEFAULT_SYSLOG_FILE_EXTENSION")", CMD_OPENSYSLOG, USAGE_OPENSYSLOG, createLog, AUTOMATIC, CHILD }, [SYSLOG_CREATE] = { "Create new System Log ("DEFAULT_SYSLOG_FILE_EXTENSION")", CMD_CREATESYSLOG, USAGE_CREATESYSLOG, createLog, AUTOMATIC, CHILD }, [SYSLOG_READ] = { "View System Log", CMD_READSYSLOG, USAGE_READSYSLOG, viewLog, AUTOMATIC, CHILD }, [SYSLOG_PRINT] = { "Print System Log", CMD_PRTSYSLOG, USAGE_PRTSYSLOG, printLog, AUTOMATIC, CHILD }, [SYSLOG_EDIT] = { "Edit System Log ("DEFAULT_SYSLOG_FILE_EXTENSION")", CMD_EDITSYSLOG, USAGE_EDITSYSLOG, editLog, AUTOMATIC, CHILD }, [SYSLOG_UPDATE] = { "Save System Log", CMD_UPDSYSLOG, USAGE_UPDSYSLOG, updLog, AUTOMATIC, CHILD }, [SYSLOG_SAVE] = { "Save System Log as ("DEFAULT_SYSLOG_FILE_EXTENSION")", CMD_SAVESYSLOG, USAGE_SAVESYSLOG, createLog, AUTOMATIC, CHILD }, [SYSLOG_RELOAD] = { "Reset System Log", CMD_RESETSYSLOG, USAGE_RESETSYSLOG, relLog, AUTOMATIC, CHILD }, [SYSLOG_SETBUFLEN] = { "Select System Log Buffer Length", CMD_SETSYSLOGBUFLEN, USAGE_SETSYSLOGBUFLEN, selLogBufLen, AUTOMATIC, CHILD }, [SYSLOG_EMPTYBUFFER] = { "Flush System Log Buffer", CMD_EMPTYSYSLOGBUF, USAGE_EMPTYSYSLOGBUF, flushLogBuf, AUTOMATIC, CHILD }, [SYSLOG_RENAME] = { "Rename System Log ("DEFAULT_SYSLOG_FILE_EXTENSION")", CMD_RENSYSLOG, USAGE_RENSYSLOG, renLog, AUTOMATIC, CHILD } }; // FUNCTIONS DEFINITIONS __MSSHELL_WRAPPER_ static void _MS__private __system createLog(const sel_typ argc, char ** argv) { char name[MAX_PATH_LENGTH] = NULL_CHAR; const bool assert = __pmode__ == SYSLOG_OPEN; #ifdef WINOS if(isnSett(BOOLS_ITEMSSELECTBYPATH)) { if(!windowsFileHandler(name, "File Log (*."DEFAULT_SYSLOG_FILE_EXTENSION")\0*."DEFAULT_SYSLOG_FILE_EXTENSION"\0Documento di testo (*.txt)\0*.txt\0Tutti i Files (*.*)\0*.*\0", DEFAULT_SYSLOG_FILE_EXTENSION, assert)) // else { printErr(14, "Failed System Log Selection"); return; } } else #endif { if(argc) { if(!file_exists(argv[0])) { printErr(2, "Inserted Path refers to non-existent System Log:\n%s", argv[0]); printUsage(&syslog_manager[__pmode__]); return; } strcpy(name, argv[0]); } else { // char string[MAX_PATH_LENGTH]; printf2(COLOR_CREDITS, "Enter desired System Log Path.\n"); printf2(COLOR_CREDITS, "or insert %c to exit SubProgram.\n\n", SCANFEXIT_CHAR); PRINTL(); while(scanf("%s", name) != 1 || name[0] == SCANFEXIT_CHAR || (assert && !file_exists(name))) { CLEARBUFFER(); if(name[0] == SCANFEXIT_CHAR) return; if(assert && !file_exists(name)) { printErr(2, "Inserted Path refers to non-existent System Log:\n%s", name); return; } } CLEARBUFFER(); } } FILE *fp = NULL; if((fp = checkForFHErrors(name, "w")) == NULL) return; static bool once_executed = false; if(!once_executed) { access(sysLog) = malloc(sizeof(logObj)); errMem(access(sysLog), VSPACE); once_executed = true; } sprint("System Log has been %s in the following Path:\n%s\n\n", assert ? "opened" : "saved", name); strcpy(access(sysLogPath), name); fclose(fp); return; } __MSSHELL_WRAPPER_ static void _MS__private __system viewLog(const sel_typ argc, char ** argv) { logPrint(access(sysLog)); return; } __MSSHELL_WRAPPER_ static void _MS__private __system printLog(const sel_typ argc, char ** argv) { printFile(access(sysLogPath)); return; } static void editLog(const sel_typ argc, char ** argv) { _editLog(access(sysLogPath)); return; } __MSSHELL_WRAPPER_ static void _MS__private __system updLog(const sel_typ argc, char ** argv) { FILE *fp; if((fp = checkForFHErrors(access(sysLogPath), "a")) == NULL) return; uint64_t i; const size_t slen = strlen(access(sysLog)->buffer); for(i=0; ibuffer[i], fp); sprint("System Log:\n%s\nhas been correctly saved on Disk.\n\n", access(sysLogPath)); fclose(fp); _flushLogBuf(access(sysLog)); return; } __MSSHELL_WRAPPER_ static void _MS__private __system relLog(const sel_typ argc, char ** argv) { writeFile(access(sysLogPath)); return; } __MSSHELL_WRAPPER_ static void _MS__private __system selLogBufLen(const sel_typ argc, char ** argv) { size_t buflen = 0; if(argc) { if(PARSING_SYSTEM_ALLOWED) { ityp tmp; if(!parse(argv[0], &tmp)) { printUsage(&syslog_manager[SYSLOG_SETBUFLEN]); return; } buflen = tmp; } else buflen = strtoul(argv[0], NULL, sizeof(access(sysLog)->buflen)); } setLogBufLen(access(sysLogPath), access(sysLog), buflen); return; } __MSSHELL_WRAPPER_ static void _MS__private __system flushLogBuf(const sel_typ argc, char ** argv) { sprint("\nSystem Log:\n%s\nBuffer has been properly flushed.\n\n", access(sysLogPath)); _flushLogBuf(access(sysLog)); return; } __MSSHELL_WRAPPER_ static void _MS__private __system renLog(const sel_typ argc, char ** argv) { char name[MAX_PATH_LENGTH]; char newname[MAX_PATH_LENGTH]; CLEARBUFFER(); strcpy(name, access(sysLogPath)); size_t len; CLEARBUFFER(); len = 0; if(argc) { if(strrchr(argv[0], SCANFEXIT_CHAR) != NULL || (len = strlen(argv[0])) > MAX_PATH_LENGTH || len < 2) { printErr(20+(18*(len>MAX_PATH_LENGTH)), "Invalid inserted Name: %s", argv[0]); printUsage(&syslog_manager[SYSLOG_RENAME]); return; } strcpy(newname, argv[0]); } else { printf2(COLOR_CREDITS, "\nEnter System Log newname.\n"); printf2(COLOR_CREDITS, "Enter %c to exit SubProgram.\n\n", SCANFEXIT_CHAR); while(scanf("%s", newname) != 1 || newname[0] == SCANFEXIT_CHAR || strrchr(newname, SCANFEXIT_CHAR) != NULL || (len = strlen(newname)) > MAX_PATH_LENGTH || len < 2) { CLEARBUFFER(); if(newname[0] == SCANFEXIT_CHAR) return; printErr(20+(18*(len>MAX_PATH_LENGTH)), "Invalid inserted name: %s", newname); } } strcat(newname, ".LOG"); CLEARBUFFER(); if(frename(name, newname)) { strcpy(access(sysLogPath), newname); sprint("System Log:\n%s\nhas been correctly renamed to:\n%s.\n\n", name, newname); } return; } #endif