2016-09-14 3 views
-8

너무 오랫동안 나를 위해 코드를 작성하지인가요 타입이다. 나는 C에서 간단한 데모를 작성하려고하지만, 아래의 충족이 ,참고 : 예상 'INT * (*)()하지만 인수는'INT '

1 main.c|87 col 21 warning| passing argument 2 of ‘Logger’ makes pointer from integer without a cast [-Wint-conversion]    
2 logger.h|24 col 6 error| note: expected ‘int * (*)()’ but argument is of type ‘int’ 

나는 로거의 두번째 인수는 int 형에

void Logger(int priority, int errno, const char* fmt, ...); 

함수를 정의합니다. 그러나 , 내가 내 주요 공정에서 사용하고자 할 때,

Logger(LOG_ERR, errno, "ERROR: select failed"); 

그것은 두번째 인수의 예상 유형이 저를 알리는 'INT * (*)(). 함수 내 전화에 는 2 실제 PARAM은 errno를,

// logger.c 
#include <stdlib.h> 
#include <string.h> 
#include <stdarg.h> 
#include <syslog.h> 
#include <error.h> 

    #include "logger.h" 

    char LogLastMsg[128]; // all info of the last log, all the info to log last time 

    int Log2Stderr = LOG_INFO; //control Loging to stderr 


    void init_logger(char* logfile_path, FILE* logfile) 
    { 
     logfile = fopen(logfile_path, "w+"); 
     if (NULL == logfile) 
     { 
      fprintf(stderr, "Failed to init logger"); 
      exit(-1); 
     } 
    } 

    void end_logger(FILE *logfile) 
    { 
     fclose(logfile); 
    } 

    /** 
    * @Synopsis a log func demo 
    *  demo for how user defined module log info 
    * 
    * @Param priority: level of log, LOG_ERR, LOG_DEBUG etc. 
    * @Param errno: errno 
    * @Param fmt: format of message to log 
    * @Param ...: args follow by fmt 
    */ 
    void Logger(int priority, int errno, char* fmt, ...) 
    { 
     char priVc[][8] = {"Emerg", "Alert", "Crit", "Error", "Warning", "Notice", "Info", "Debug"}; 

     char* priPt = priority < 0 || priority >= sizeof(priVc)/sizeof(priVc[0]) ? 
      "Unknow priority!" : priVc[priority]; 

     char *errMsg = errno <= 0 ? NULL : strerror(errno); 

     { 
      va_list argPt; 
      unsigned Ln; 

      va_start(argPt, fmt); //now argPt is point to mylog's param:... 
      Ln = snprintf(LogLastMsg, sizeof(LogLastMsg), "[mylog...][%s]: ", priPt); 
      Ln += vsnprintf(LogLastMsg + Ln, sizeof(LogLastMsg) - Ln, fmt, argPt); 
      if (NULL != errMsg) 
      { 
       Ln += snprintf(LogLastMsg + Ln, sizeof(LogLastMsg) - Ln, "%d:%s", errno, errMsg); 
      } 
      va_end(argPt); 
     } 
     //choose the log which should be show on stderr 
     if (priority < LOG_ERR || priority <= Log2Stderr) 
     { 
      fprintf(stderr, "%s", LogLastMsg); 
     } 

     //always to syslog 
     syslog(priority, "%s", LogLastMsg); 

     if (priority <= LOG_ERR) 
     { 
      exit(-1); 
     } 
     return ; 
    } 




/** 
* @file main.c 
* @synopsis 
* @author Windeal, [email protected] 
* @version 0.1 
* @date 2016-09-12 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <ctype.h> 
#include <getopt.h> 
#include <syslog.h> 
#include <errno.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

#include "http_proxy.h" 
#include "logger.h" 
#include "socketapi.h" 

#define LOG_FILE "http_proxy.log" 

typedef struct Server{ 
    struct sockaddr_in addr; 
    short port; 
} Server; 

typedef struct Client{ 
    struct sockaddr_in addr; 
    int len; 
} Client; 


static int max_int(int a, int b) 
{ 
    int ret; 
    ret = a; 
    if (ret < 0) 
    { 
     ret = b; 
    } 
    return ret; 
} 

static int get_global_option(int argc, char **argv); 
static int init_httpd_socket(int *sockfd); 


int main(int argc, char **argv) 
{ 
    FILE *logfile; 
    int sockfd, clientfd; 
    Server server; 
    Client client; 
    fd_set rfds; 
    int max_fd; 
    struct timeval tv; 
    int retval = -1; 

    init_logger(LOG_FILE, logfile); 
    Logger(LOG_INFO, 0, "httpd start...\n"); 

    init_httpd_socket(&sockfd); 

    while (1) 
    { 
     client.len = sizeof (struct sockaddr); 
     clientfd = Accept(sockfd, (struct sockaddr *)&client.addr, &client.len); 
     Logger(LOG_INFO, 0, "A new connection accept!"); 

     while (1) 
     { 
      FD_ZERO(&rfds); 
      FD_SET(clientfd, &rfds); 
      max_fd = max_int(0, clientfd); 

      tv.tv_sec = 1; 
      tv.tv_usec = 0; 
      retval = select(max_fd+1, &rfds, NULL, NULL, &tv); 
      if (retval == -1) 
      { 
       Logger(LOG_ERR, 3, "ERROR: select failed"); 
       break; 
      } 
      else if (retval == 0) 
      { 
      // printf("continue waiting!\n"); 
       continue; 
      } 
     } 
    } 

} 

/** 
* @synopsis init_httpd_socket, create a new socket for server 
* @param sockfd 
* @returns a new socket for server 
*/ 
static int init_httpd_socket(int *sockfd) 
{ 
    struct sockaddr_in serv_addr; 
    short port; 

    Logger(LOG_INFO, 0, "init_http_socket..."); 

    port = htons(SERV_PORT); 

    *sockfd = Socket(AF_INET, SOCK_STREAM, 0); 
    memset(&serv_addr, 0, sizeof (serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_port = port; 
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    Bind(*sockfd, (struct sockaddr*)&serv_addr, sizeof (serv_addr)); 
    Listen(*sockfd, 6); 
    return *sockfd; 
} 
+6

없는 텍스트 형식, -1. –

+0

지금까지 조사/디버깅 노력을 보여주십시오. 먼저 [Ask] 페이지를 읽으십시오. –

+2

사이트 규칙을 준수하지 않습니다. VtC. 텍스트 캡쳐 화면이 없습니다! – Olaf

답변

1

지금, 내가 답을 알고 1 logger.c 아래로 errno.h

코드에서입니다. 오류는 Logger 선언에 있어야합니다.

void Logger(int priority, int errno, char* fmt, ...); 

문자열 'errno'는 형식적인 매개 변수가 될 수 없습니다. 나는 'Errno'로 그것을 repace, 그럼 잘 작동합니다.

나는 문자열 '의 errno는'errno.h에 정의 된 매크로가 될 수 있음을 가정한다. 'man errno'유형은 자세한 정보를 얻을 수 있습니다.