main.cpp
上传用户:chn_coc
上传日期:2007-12-20
资源大小:563k
文件大小:6k
源码类别:

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------
  2. // File : main.cpp
  3. // Date: 4-apr-2002
  4. // Author: giles
  5. // Desc: 
  6. // see .cpp for details
  7. //
  8. // (c) 2002 peercast.org
  9. // ------------------------------------------------
  10. // This program is free software; you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation; either version 2 of the License, or
  13. // (at your option) any later version.
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. // GNU General Public License for more details.
  18. // ------------------------------------------------
  19. #include <stdarg.h>
  20. #include <stdio.h>
  21. #include "channel.h"
  22. #include "servent.h"
  23. #include "servmgr.h"
  24. #include "unix/usys.h"
  25. #include <sys/types.h>
  26. #include <unistd.h>
  27. #include <signal.h>
  28. #include <stdlib.h>
  29. #include "peercast.h"
  30. #include "version2.h"
  31. // ----------------------------------
  32. String iniFileName;
  33. bool quit=false;
  34. FILE *logfile=NULL;
  35. String htmlPath;
  36. String pidFileName;
  37. String logFileName;
  38. bool forkDaemon = false;
  39. bool setPidFile = false;
  40. bool logToFile = false;
  41. WLock loglock;
  42. // ---------------------------------
  43. class MyPeercastInst : public PeercastInstance
  44. {
  45. public:
  46. virtual Sys * APICALL createSys()
  47. {
  48. return new USys();
  49. }
  50. };
  51. // ---------------------------------
  52. class MyPeercastApp : public PeercastApplication
  53. {
  54. public:
  55. virtual const char * APICALL getIniFilename()
  56. {
  57. return iniFileName;
  58. }
  59. virtual const char * APICALL getPath() 
  60. {
  61. return htmlPath;
  62. }
  63. virtual const char *APICALL getClientTypeOS() 
  64. {
  65. return PCX_OS_LINUX;
  66. }
  67. virtual void APICALL printLog(LogBuffer::TYPE t, const char *str)
  68. {
  69. loglock.on();
  70. if (t != LogBuffer::T_NONE) {
  71. printf("[%s] ",LogBuffer::getTypeStr(t));
  72. if (logfile != NULL) {
  73. fprintf(logfile, "[%s] ",LogBuffer::getTypeStr(t)); }
  74. }
  75. printf("%sn",str);
  76. if (logfile != NULL) {
  77. fprintf(logfile, "%sn",str);
  78. }
  79. loglock.off();
  80. }
  81. };
  82. // ----------------------------------
  83. void setSettingsUI(){}
  84. // ----------------------------------
  85. void showConnections(){}
  86. // ----------------------------------
  87. void PRINTLOG(LogBuffer::TYPE type, const char *fmt,va_list ap)
  88. {
  89. }
  90. // ----------------------------------
  91. void sigProc(int sig)
  92. {
  93. switch (sig)
  94. {
  95. case SIGTERM:
  96. if (!quit)
  97. LOG_DEBUG("Received TERM signal");
  98. quit=true;
  99. break;
  100. case SIGHUP:
  101. LOG_DEBUG("Received HUP signal, reloading a new logfile");
  102. // The aim of this call is to completly reload a new log file.
  103. // It can be used in conjonction with logrotate, 
  104. // to remove the logfile after it has been copied.
  105. // some data can still be lost, but this way it is reduced to minimun at lost costs..
  106. if (logToFile) {
  107. loglock.on();
  108. if (logfile != NULL) {
  109. fclose(logfile);
  110. }
  111. unlink(logFileName);
  112. logfile = fopen(logFileName,"a");
  113. loglock.off();
  114. }
  115. break;
  116. }
  117. /* This may be nescessary for some systems... */
  118. signal(SIGTERM, sigProc); 
  119. signal(SIGHUP, sigProc); 
  120. }
  121. // ----------------------------------
  122. int main(int argc, char* argv[])
  123. {
  124. iniFileName.set("peercast.ini");
  125. htmlPath.set("./");
  126. pidFileName.set("peercast.pid");
  127. logFileName.set("peercast.log");
  128. for (int i = 1; i < argc; i++)
  129. {
  130. if (!strcmp(argv[i],"--inifile") || !strcmp(argv[i],"-i")) {
  131. if (++i < argc) {
  132. iniFileName.setFromString(argv[i]);
  133. }
  134. } else if (!strcmp(argv[i],"--logfile") || !strcmp(argv[i],"-l") ) {
  135. if (++i < argc) {
  136. logToFile = true;
  137. logFileName.setFromString(argv[i]);
  138. }
  139. } else if (!strcmp(argv[i],"--path") || !strcmp(argv[i],"-P")) {
  140. if (++i < argc) {
  141. htmlPath.setFromString(argv[i]);
  142. // Add a "/" in order to make this parameter more natural:
  143. htmlPath.append("/");
  144. }
  145. } else if (!strcmp(argv[i],"--help") || !strcmp(argv[i],"-h")) {
  146. printf("peercast - P2P Streaming Server, version %sn",PCX_VERSTRING);
  147. printf("nCopyright (c) 2002-2005 PeerCast.org <code@peercast.org>n");
  148. printf("This is free software; see the source for copying conditions.n");
  149. printf("Usage: peercast [options]n");
  150. printf("-i, --inifile <inifile>      specify ini filen");
  151. printf("-l, --logfile <logfile>      specify log filen");
  152. printf("-P, --path <path>            set path to html filesn");
  153. printf("-d, --daemon                 fork in backgroundn");
  154. printf("-p, --pidfile <pidfile>      specify pid filen");
  155. printf("-h, --help                   show this helpn");
  156. return 0;
  157. } else if (!strcmp(argv[i],"--daemon") || !strcmp(argv[i],"-d")) {
  158. forkDaemon = true;
  159. } else if (!strcmp(argv[i],"--pidfile") || !strcmp(argv[i],"-p")) {
  160. if (++i < argc) 
  161. {
  162. setPidFile = true;
  163. pidFileName.setFromString(argv[i]);
  164. }
  165. }
  166. }
  167. if (logToFile) logfile = fopen(logFileName,"a");
  168. if (forkDaemon) {
  169. LOG_DEBUG("Forking to the background");
  170. daemon(1,0);
  171. }
  172. // PID file must be written after the daemon() call so that we get the daemonized PID.
  173. if (setPidFile) {
  174. LOG_DEBUG("Peercast PID is: %i", (int) getpid() );
  175. FILE *pidfileopened = fopen(pidFileName, "w");
  176. if (pidfileopened != NULL) 
  177. {
  178. fprintf(pidfileopened, "%in", (int) getpid() );
  179. fclose(pidfileopened);
  180. }
  181. }
  182. peercastInst = new MyPeercastInst();
  183. peercastApp = new MyPeercastApp();
  184. peercastInst->init();
  185. signal(SIGTERM, sigProc); 
  186. signal(SIGHUP, sigProc); 
  187. while (!quit) {
  188. sys->sleep(1000);
  189. if (logfile != NULL)
  190. loglock.on();
  191. fflush(logfile);
  192. loglock.off();
  193. }
  194. peercastInst->saveSettings();
  195. peercastInst->quit();
  196. if (logfile != NULL) {
  197. loglock.on();
  198. fflush(logfile);
  199. fclose(logfile);
  200. // Log might continue but will only be written to stdout.
  201. loglock.off();
  202. }
  203. if (setPidFile) unlink(pidFileName);
  204. return 0;
  205. }