⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 op_acid_db.c

📁 知名的开源IDS的日志工具
💻 C
📖 第 1 页 / 共 3 页
字号:
        }        /* Get the reference id */        if(OpAcidDb_GetReferenceId(op_data, ref_system_id, ref->id, &ref_id)                 != 1)        {            /* if not found */            if(!(e_ref_tag = EscapeString(op_data, ref->id ? ref->id : "")))                FatalError("Failed to escape string");                        if(snprintf(sql_buffer, MAX_QUERY_SIZE,                        "INSERT INTO reference(ref_system_id, ref_tag) "                        "VALUES('%u', '%s')", ref_system_id, e_ref_tag)                     < MAX_QUERY_SIZE)            {                free(e_ref_tag);                Insert(op_data, sql_buffer, &ref_id);                 if(ref_id == -1)                {                    OpAcidDb_GetReferenceId(op_data, ref_system_id, ref->id,                             &ref_id);                }            }            else            {                FatalError("SQL query too big");            }        }        /* INSERT record into the sig_reference join table */            if(snprintf(sql_buffer, MAX_QUERY_SIZE,                    "INSERT INTO sig_reference(sig_id, ref_seq, ref_id) "                    "VALUES('%u', '%u', '%u')", sig_id, ref_seq, ref_id)                 < MAX_QUERY_SIZE)        {            Insert(op_data, sql_buffer, NULL); /* XXX: Error checking */        }        ++ref_seq;        ref = ref->next;    }    return 0;}OpAcidDb_Data *OpAcidDb_ParseArgs(char *args){    OpAcidDb_Data *op_data;    op_data = (OpAcidDb_Data *)SafeAlloc(sizeof(OpAcidDb_Data));    if(args != NULL)    {        char **toks;        int num_toks;        int i;        /* parse out your args */        toks = mSplit(args, ",", 31, &num_toks, '\\');        for(i = 0; i < num_toks; ++i)        {            char **stoks;            int num_stoks;            char *index = toks[i];            while(isspace((int)*index))                ++index;            stoks = mSplit(index, " ", 2, &num_stoks, 0);            if(strcasecmp("database", stoks[0]) == 0)            {                if(num_stoks > 1 && op_data->database == NULL)                    op_data->database = strdup(stoks[1]);                else                    LogMessage("Argument Error in %s(%i): %s\n", file_name,                             file_line, index);            }            else if(strcasecmp("server", stoks[0]) == 0)            {                if(num_stoks > 1 && op_data->server == NULL)                    op_data->server = strdup(stoks[1]);                else                    LogMessage("Argument Error in %s(%i): %s\n", file_name,                             file_line, index);            }            else if(strcasecmp("user", stoks[0]) == 0)            {                if(num_stoks > 1 && op_data->user == NULL)                    op_data->user = strdup(stoks[1]);                else                    LogMessage("Argument Error in %s(%i): %s\n", file_name,                             file_line, index);            }            else if(strcasecmp("password", stoks[0]) == 0)            {                if(num_stoks > 1 && op_data->password == NULL)                    op_data->password = strdup(stoks[1]);                else                    LogMessage("Argument Error in %s(%i): %s\n", file_name,                             file_line, index);            }            else if(strcasecmp("sensor_id", stoks[0]) == 0)            {                if(num_stoks > 1 && op_data->sensor_id == 0)                    op_data->sensor_id = atoi(stoks[1]);                else                    LogMessage("Argument Error in %s(%i): %s\n", file_name,                             file_line, index);            }            else if(strcasecmp("detail", stoks[0]) == 0)            {                if(num_stoks > 1)                {                    if(strcasecmp("full", stoks[1]) == 0)                        op_data->detail = 1;                }                else                     LogMessage("Argument Error in %s(%i): %s\n", file_name,                             file_line, index);            }#ifdef ENABLE_MYSQL            else if(strcasecmp("mysql", stoks[0]) == 0)            {                   if(op_data->flavor == 0)                    op_data->flavor = FLAVOR_MYSQL;                else                    LogMessage("Argument Error in %s(%i): %s\n", file_name,                             file_line, index);            }#endif /* ENABLE_MYSQL */#ifdef ENABLE_POSTGRES            else if(strcasecmp("postgres", stoks[0]) == 0)            {                if(op_data->flavor == 0)                    op_data->flavor = FLAVOR_POSTGRES;                else                    LogMessage("Argument Error in %s(%i): %s\n", file_name,                            file_line, index);            }#endif /* ENABLE_POSTGRES */            else            {                fprintf(stderr, "WARNING %s (%d) => Unrecognized argument for "                        "AcidDb plugin: %s\n", file_name, file_line, index);            }            FreeToks(stoks, num_stoks);        }        /* free your mSplit tokens */        FreeToks(toks, num_toks);    }    if(op_data->flavor == 0)        FatalError("You must specify a database flavor\n");    return op_data;}int DbConnect(OpAcidDb_Data *op_data){    switch(op_data->flavor)    {#ifdef ENABLE_MYSQL        case FLAVOR_MYSQL:            return MysqlConnect(op_data);#endif#ifdef ENABLE_POSTGRES        case FLAVOR_POSTGRES:            return PostgresConnect(op_data);#endif /* ENABLE_POSTGRES */        default:            FatalError("Database flavor not supported\n");            return 1;    }//    return 1;}int DbClose(OpAcidDb_Data *op_data){    int rval = 0;    switch(op_data->flavor)    {#ifdef ENABLE_MYSQL        case FLAVOR_MYSQL:            rval = MysqlClose(op_data->mysql);            op_data->mysql = NULL;            break;#endif#ifdef ENABLE_POSTGRES        case FLAVOR_POSTGRES:            rval = PostgresClose(op_data->pq);            op_data->pq = NULL;            break;#endif /* ENABLE_POSTGRES */        default:            FatalError("Database flavor not supported\n");            return 1;    }    return rval;}int SelectAsUInt(OpAcidDb_Data *op_data, char *sql, unsigned int *result){    switch(op_data->flavor)    {#ifdef ENABLE_MYSQL        case FLAVOR_MYSQL:            return MysqlSelectAsUInt(op_data->mysql, sql, result);#endif#ifdef ENABLE_POSTGRES        case FLAVOR_POSTGRES:            return PostgresSelectAsUInt(op_data->pq, sql, result);#endif /* ENABLE_POSTGRES */        default:            FatalError("Database flavor not supported\n");            return 1;    }}int Insert(OpAcidDb_Data *op_data, char *sql, unsigned int *row_id){    switch(op_data->flavor)    {#ifdef ENABLE_MYSQL        case FLAVOR_MYSQL:            return MysqlInsert(op_data->mysql, sql, row_id);#endif#ifdef ENABLE_POSTGRES        case FLAVOR_POSTGRES:            if(row_id)                *row_id = -1;            return PostgresInsert(op_data->pq, sql);#endif /* ENABLE_POSTGRES */        default:            FatalError("Database flavor not supported\n");            return 1;    }}char *EscapeString(OpAcidDb_Data *op_data, char *string){    if(!op_data || !string)        return NULL;    switch(op_data->flavor)    {#ifdef ENABLE_MYSQL        case FLAVOR_MYSQL:            return MysqlEscapeString(op_data->mysql, string);#endif#ifdef ENABLE_POSTGRES        case FLAVOR_POSTGRES:            return PostgresEscapeString(op_data->pq, string);#endif /* ENABLE_POSTGRES */        default:            FatalError("Database flavor not supported\n");            return NULL;    }}        #ifdef ENABLE_MYSQLint MysqlConnect(OpAcidDb_Data *op_data){    op_data->mysql = mysql_init(NULL);    if(!mysql_real_connect(op_data->mysql, op_data->server, op_data->user,                 op_data->password, op_data->database, 0, NULL, 0))    {        FatalError("Failed to connect to database %s:XXXXXXXX@%s/%s: %s\n",                op_data->user, op_data->server,                 op_data->database, mysql_error(op_data->mysql));    }    return 0;}int MysqlClose(MYSQL *mysql){    if(mysql_close)        mysql_close(mysql);    return 0;}int MysqlExecuteQuery(MYSQL *mysql, char *sql){    int mysqlErrno;    int result;    while((result = mysql_query(mysql, sql) != 0))    {        mysqlErrno = mysql_errno(mysql);        if(mysqlErrno < CR_MIN_ERROR)        {            if(pv.verbose)                LogMessage("MySQL ERROR(%i): %s.  Aborting Query\n",                        mysql_errno(mysql), mysql_error(mysql));            return result;        }        if((mysqlErrno == CR_SERVER_LOST)                 || (mysqlErrno == CR_SERVER_GONE_ERROR))        {            LogMessage("Lost connection to MySQL server.  Reconnecting\n");            while(mysql_ping(mysql) != 0)            {                if(BarnyardSleep(15))                    return result;            }            LogMessage("Reconnected to MySQL server.\n");        }        else        {            /* XXX we could spin here, but we do not */            LogMessage("MySQL Error(%i): %s\n", mysqlErrno, mysql_error(mysql));        }    }    return result;}int MysqlSelectAsUInt(MYSQL *mysql, char *sql, unsigned int *result){    int rval = 0;    MYSQL_RES *mysql_res;    MYSQL_ROW tuple;        if(MysqlExecuteQuery(mysql, sql) != 0)    {        /* XXX: should really just return up the chain */        FatalError("Error (%s) executing query: %s\n", mysql_error(mysql), sql);        return -1;    }    mysql_res = mysql_store_result(mysql);    if((tuple = mysql_fetch_row(mysql_res)))    {        if(tuple[0] == NULL)            *result = 0;        else            *result = atoi(tuple[0]);        rval = 1;    }    mysql_free_result(mysql_res);    return rval;}int MysqlInsert(MYSQL *mysql, char *sql, unsigned int *row_id){    if(MysqlExecuteQuery(mysql, sql) != 0)    {        /* XXX: should really just return up the chain */        FatalError("Error (%s) executing query: %s\n", mysql_error(mysql), sql);        return -1;    }    if(row_id != NULL)        *row_id = mysql_insert_id(mysql);    return 0;}char *MysqlEscapeString(MYSQL *mysql, char *string){    char *e_string = NULL;    size_t len;        if(!string || !mysql)        return NULL;    len = strlen(string);    if(!(e_string = (char  *)calloc((len * 2) + 1, sizeof(char))))    {        FatalError("Out of memory (wanted %u bytes)",                (len * 2) + 1);        return NULL;    }    mysql_real_escape_string(mysql, e_string, string, len);    return e_string;}#endif#ifdef ENABLE_POSTGRESint PostgresConnect(OpAcidDb_Data *op_data){    if(!(op_data->pq = PQsetdbLogin(op_data->server, NULL, NULL, NULL,                     op_data->database, op_data->user, op_data->password)))    {        FatalError("Failed to create postgres connection object\n");    }    if(PQstatus(op_data->pq) != CONNECTION_OK)    {        FatalError("Failed to connect to database %s:XXXXXXXX@%s/%s: %s\n",                op_data->user, op_data->server,                 op_data->database, PQerrorMessage(op_data->pq));    }    return 0;}int PostgresClose(PGconn *pq){    if(pq)        PQfinish(pq);    return 0;}int PostgresSelectAsUInt(PGconn *pq, char *sql, unsigned int *result){    int rval = 0;    PGresult *res = NULL;    if(!pq || !sql || !result)        return -1;    if(!(res = PQexec(pq, sql)))    {        FatalError("PQexec failed: %s\n", PQerrorMessage(pq));    }    if(PQresultStatus(res) != PGRES_TUPLES_OK)    {        FatalError("SQL command '%s' failed: %s", sql, PQerrorMessage(pq));    }    if(PQntuples(res) > 0)    {        char *value = PQgetvalue(res, 0, 0);        if(value == NULL)            *result = 0;        else            *result = atoi(value);        rval = 1;    }    PQclear(res);    return rval;}int PostgresInsert(PGconn *pq, char *sql){    PGresult *res = NULL;    if(!pq || !sql)        return -1;    if(!(res = PQexec(pq, sql)))    {        FatalError("PQexec failed: %s\n", PQerrorMessage(pq));    }    if(PQresultStatus(res) != PGRES_COMMAND_OK)    {        FatalError("SQL command '%s' failed: %s", sql, PQerrorMessage(pq));    }    PQclear(res);    return 0;}char *PostgresEscapeString(PGconn *pq, char *string){    char *e_string = NULL;    size_t len;        if(!string || !pq)        return NULL;    len = strlen(string);    if(!(e_string = (char  *)calloc((len * 2) + 1, sizeof(char))))    {        FatalError("Out of memory (wanted %u bytes)",                (len * 2) + 1);        return NULL;    }    PQescapeString(e_string, string, len);    return e_string;}#endif /* ENABLE_POSTGRES */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -