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

📄 startup.c

📁 IEEE1588 Protocol,用于同步局域网各站点时间
💻 C
字号:
/* startup.c */#include "../ptpd.h"PtpClock *ptpClock;void catch_close(int sig){  char *s;    ptpdShutdown();    switch(sig)  {  case SIGINT:    s = "interrupt";    break;      case SIGTERM:    s = "terminate";    break;      case SIGHUP:    s = "hangup";    break;      default:    s = "?";  }    NOTIFY("shutdown on %s signal\n", s);    exit(0);}void ptpdShutdown(){  netShutdown(&ptpClock->netPath);    free(ptpClock->foreign);  free(ptpClock);}PtpClock * ptpdStartup(int argc, char **argv, Integer16 *ret, RunTimeOpts *rtOpts){  int c, fd = -1, nondaemon = 0, noclose = 0;    /* parse command line arguments */  while( (c = getopt(argc, argv, "?cf:dDxta:w:b:u:l:o:e:hy:m:gps:i:v:n:k:r")) != -1 ) {    switch(c) {    case '?':      printf("\nUsage:  ptpd [OPTION]\n\n""-?                show this page\n""\n""-c                run in command line (non-daemon) mode\n""-f FILE           send output to FILE\n""-d                display stats\n""-D                display stats in .csv format\n""\n""-x                do not reset the clock if off by more than one second\n""-t                do not adjust the system clock\n""-a NUMBER,NUMBER  specify clock servo P and I attenuations\n""-w NUMBER         specify one way delay filter stiffness\n""\n""-b NAME           bind PTP to network interface NAME\n""-u ADDRESS        also send uni-cast to ADDRESS\n""-l NUMBER,NUMBER  specify inbound, outbound latency in nsec\n""\n""-o NUMBER         specify current UTC offset\n""-e NUMBER         specify epoch NUMBER\n""-h                specify half epoch\n""\n""-y NUMBER         specify sync interval in 2^NUMBER sec\n""-m NUMBER         specify max number of foreign master records\n""\n""-g                run as slave only\n""-p                make this a preferred clock\n""-s NUMBER         specify system clock stratum\n""-i NAME           specify system clock identifier\n""-v NUMBER         specify system clock allen variance\n""\n""-n NAME           specify PTP subdomain name (not related to IP or DNS)\n""\n""-k NUMBER,NUMBER  send a management message of key, record, then exit\n""\n"      );      *ret = 0;      return 0;          case 'c':      nondaemon = 1;      break;          case 'f':      if((fd = creat(optarg, 0400)) != -1)      {        dup2(fd, STDOUT_FILENO);        dup2(fd, STDERR_FILENO);        noclose = 1;      }      else        PERROR("could not open output file");      break;          case 'd':#ifndef PTPD_DBG      rtOpts->displayStats = TRUE;#endif      break;          case 'D':#ifndef PTPD_DBG      rtOpts->displayStats = TRUE;      rtOpts->csvStats = TRUE;#endif      break;          case 'x':      rtOpts->noResetClock = TRUE;      break;          case 't':      rtOpts->noAdjust = TRUE;      break;          case 'a':      rtOpts->ap = strtol(optarg, &optarg, 0);      if(optarg[0])        rtOpts->ai = strtol(optarg+1, 0, 0);      break;          case 'w':      rtOpts->s = strtol(optarg, &optarg, 0);      break;          case 'b':      memset(rtOpts->ifaceName, 0, IFACE_NAME_LENGTH);      strncpy(rtOpts->ifaceName, optarg, IFACE_NAME_LENGTH);      break;          case 'u':      strncpy(rtOpts->unicastAddress, optarg, NET_ADDRESS_LENGTH);      break;          case 'l':      rtOpts->inboundLatency.nanoseconds = strtol(optarg, &optarg, 0);      if(optarg[0])        rtOpts->outboundLatency.nanoseconds = strtol(optarg+1, 0, 0);      break;          case 'o':      rtOpts->currentUtcOffset = strtol(optarg, &optarg, 0);      break;          case 'e':      rtOpts->epochNumber = strtoul(optarg, &optarg, 0);      break;          case 'h':      rtOpts->halfEpoch = TRUE;      break;          case 'y':      rtOpts->syncInterval = strtol(optarg, 0, 0);      break;          case 'm':      rtOpts->max_foreign_records = strtol(optarg, 0, 0);      if(rtOpts->max_foreign_records < 1)        rtOpts->max_foreign_records = 1;      break;          case 'g':      rtOpts->slaveOnly = TRUE;      break;          case 'p':      rtOpts->clockPreferred = TRUE;      break;          case 's':      rtOpts->clockStratum = strtol(optarg, 0, 0);      if(rtOpts->clockStratum <= 0)        rtOpts->clockStratum = 255;      break;          case 'i':      memset(rtOpts->clockIdentifier, 0, PTP_CODE_STRING_LENGTH);      strncpy(rtOpts->clockIdentifier, optarg, PTP_CODE_STRING_LENGTH);      break;          case 'v':      rtOpts->clockVariance = strtol(optarg, 0, 0);      break;          case 'n':      memset(rtOpts->subdomainName, 0, PTP_SUBDOMAIN_NAME_LENGTH);      strncpy(rtOpts->subdomainName, optarg, PTP_SUBDOMAIN_NAME_LENGTH);      break;          case 'k':      rtOpts->probe = TRUE;            rtOpts->probe_management_key = strtol(optarg, &optarg, 0);      if(optarg[0])        rtOpts->probe_record_key = strtol(optarg+1, 0, 0);            nondaemon = 1;      break;          case 'r':      ERROR("The '-r' option has been removed because it is now the default behaviour.\n");      ERROR("Use the '-x' option to disable clock resetting.\n");      *ret = 1;      return 0;          default:      *ret = 1;      return 0;    }  }    ptpClock = (PtpClock*)calloc(1, sizeof(PtpClock));  if(!ptpClock)  {    PERROR("failed to allocate memory for protocol engine data");    *ret = 2;    return 0;  }  else  {    DBG("allocated %d bytes for protocol engine data\n", (int)sizeof(PtpClock));    ptpClock->foreign = (ForeignMasterRecord*)calloc(rtOpts->max_foreign_records, sizeof(ForeignMasterRecord));    if(!ptpClock->foreign)    {      PERROR("failed to allocate memory for foreign master data");      *ret = 2;      free(ptpClock);      return 0;    }    else    {      DBG("allocated %d bytes for foreign master data\n", (int)(rtOpts->max_foreign_records*sizeof(ForeignMasterRecord)));    }  }  #ifndef PTPD_NO_DAEMON  if(!nondaemon)  {    if(daemon(0, noclose) == -1)    {      PERROR("failed to start as daemon");      *ret = 3;      return 0;    }    DBG("running as daemon\n");  }#endif    signal(SIGINT, catch_close);  signal(SIGTERM, catch_close);  signal(SIGHUP, catch_close);    *ret = 0;  return ptpClock;}

⌨️ 快捷键说明

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