util.c
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:10k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19.  
  20. #include "util.h"
  21. #define MAX_CLIENT 3072
  22. #define MAX_CFG_LINE 1024
  23. #define EscapedChar "#["
  24. static unsigned char hexchars[] = "0123456789ABCDEF";
  25. struct hostent * init_sockaddr (struct sockaddr_in *name, char *host, unsigned int port)
  26. {
  27. struct hostent *h;
  28. unsigned short sp = port;
  29. memset (name, 0, sizeof (*name));
  30. name->sin_family = PF_INET;
  31. name->sin_port = htons (sp);
  32. h = gethostbyname (host); /* The gethostbyname() function returns a structure of type hostent 
  33.      for the given host name. */
  34. if (h == (struct hostent *)0)
  35. {
  36. perror ("gethostbyname");
  37. return (struct hostent *)0;
  38. }
  39. name->sin_addr = *(struct in_addr *)h->h_addr;
  40. return h;
  41. }
  42. // create a connection, return a description
  43. int my_connect (char *host, int port)
  44. {
  45. struct sockaddr_in client;
  46. struct hostent *h;
  47. int connection = socket (PF_INET, SOCK_STREAM, 0);
  48. // connection based
  49. if ((connection < 0) || ((h = init_sockaddr (&client, host, port)) == (struct hostent *)0))
  50. {
  51. perror ("socket||gethostbyname");
  52. return -1;
  53. }
  54. if (connect (connection, (struct sockaddr *) &client, sizeof (client)) < 0)
  55. {
  56. perror ("connect");
  57. return -1;
  58. }
  59. return connection;
  60. }
  61. int init_server (char *ip, unsigned short port)
  62. {
  63. int flags;
  64. struct sockaddr_in server_address;
  65. int reuse_addr = 1;
  66. int keep_alive = 1;
  67. int sock = socket(AF_INET, SOCK_STREAM, 0);
  68. if (sock < 0)
  69. {
  70. perror("socket");
  71. return -1;
  72. }
  73. // 设置套接字属性
  74. setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
  75. setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &keep_alive, sizeof(keep_alive));
  76. flags = fcntl(sock, F_GETFL, 0);
  77. flags |= O_NONBLOCK;
  78. fcntl(sock, F_SETFL, flags);
  79. memset((char *) &server_address, 0, sizeof(server_address));
  80. server_address.sin_port = htons(port);
  81. server_address.sin_family = AF_INET;
  82. //server_address.sin_addr.s_addr = htonl(INADDR_ANY);
  83. if (ip) inet_aton(ip, &server_address.sin_addr); /* inet_aton() converts
  84. the Internet host address ip from the standard numbers-and-dots notation into
  85. binary data and stores it in the server_address.sin_addr */
  86. else server_address.sin_addr.s_addr = htonl(INADDR_ANY);
  87. if (bind(sock, (struct sockaddr *) &server_address, sizeof(server_address)) < 0)
  88. {
  89. perror("bind");
  90. close(sock);
  91. return -1;
  92. }
  93. listen(sock,MAX_CLIENT);
  94. return sock;
  95. }
  96. int read_config (char *fname, struct NamVal *para, int n)
  97. {
  98. char *c, *pd;
  99. struct Array *parray;
  100. int array[MAX_ARRAY];
  101. int i, j, len, nlen;
  102. FILE *f = fopen (fname, "r");
  103. char buf[MAX_CFG_LINE]; // MAX_LINE = 1024
  104. if (!f)
  105. {
  106. return -1;
  107. }
  108. while (fgets (buf, MAX_CFG_LINE, f))
  109. {
  110. if (index(EscapedChar, buf[0]))
  111. continue;
  112. buf[MAX_CFG_LINE-1] = 0;
  113. len = strlen (buf);
  114. while (len > 0 && (buf[len] == 0 || buf[len] == 'n' || buf[len] == 'r' || buf[len] == ' '))
  115. len --;
  116. if (len == 0) continue;
  117. else buf[++len] = 0;
  118. c = index (buf, '=');
  119. *c = 0;
  120. nlen = c - buf;
  121. for (i=0; i<n; i++)
  122. {
  123. if (!strncasecmp (buf, para[i].name, nlen)) /* The strncasecmp() function 
  124. compares the two strings: the first nlen characters of buf and para[i].name, 
  125. ignoring the case of the characters. 
  126. It returns an integer less than, equal to, or greater than zero 
  127. if the first nlen characters of buf is found,
  128. respectively, to be less than, to match, or be greater than para[i].name. */
  129. break;
  130. }
  131. if (i < n)
  132. switch (para[i].type)
  133. {
  134. case 'd': // Int type 
  135. *(int *)(para[i].ptr) = atoi (c+1);
  136. break;
  137. case 'a':
  138. parray = (struct Array *)(para[i].ptr);
  139. pd = ++c;
  140. for (j=0; j<MAX_ARRAY; j++)
  141. {
  142. while ((*c != 0) && (*c < '0' || *c > '9')) c++;
  143. if (*c == 0) break;
  144. array[j] = strtol (c, &pd, 0);/* The strtol() function 
  145. converts the initial part of the string in c to
  146.    a long integer value according to the given 0, 
  147. which must be between 2 and 36 inclusive, or be the special value 0. */
  148. c = pd;
  149. }
  150. if (j > 0)
  151. {
  152. para[i].should_free = 1;
  153. parray->ptr = calloc (j, sizeof (int));
  154. memcpy (parray->ptr, array, sizeof (int)*j);
  155. }
  156. parray->size = j;
  157. break;
  158. case 'f': // float type 
  159. *(float *)(para[i].ptr) = atof (c+1);
  160. break;
  161. case 's': // Char string 
  162. if (len > nlen)
  163. {
  164. *(char **)(para[i].ptr) = (char *)calloc (len-nlen, 1);
  165. para[i].should_free = 1;
  166. memcpy (*(char **)(para[i].ptr), c+1, len-nlen);
  167. } else
  168. *(char **)(para[i].ptr) = 0;
  169. break;
  170. case 'b': // Buffer type 
  171. if (len > nlen)
  172. memcpy ((char *)(para[i].ptr), c+1, len-nlen);
  173. else
  174. *(char *)para[i].ptr = 0;
  175. break;
  176. default:
  177. break;
  178. }
  179. else
  180. continue;
  181. }
  182. fclose (f);
  183. return 0;
  184. }
  185. int free_config (struct NamVal *nv, int n)
  186. {
  187. int i;
  188. for (i=0; i<n; i++)
  189. {
  190. switch (nv[i].type)
  191. {
  192. case 'a':
  193. if ((struct Array *)(nv[i].ptr) != NULL && nv[i].should_free == 1)
  194. free (((struct Array *)(nv[i].ptr))->ptr);
  195. break;
  196. case 's':
  197. if (*(char **)(nv[i].ptr) != NULL && nv[i].should_free == 1)
  198. free (*(char **)(nv[i].ptr));
  199. break;
  200. default:
  201. break;
  202. }
  203. }
  204. return 0;
  205. }
  206. int init_udp (char *ip, unsigned short port)
  207. {
  208. int s = socket (PF_INET, SOCK_DGRAM, 0);
  209. struct sockaddr_in send;
  210. send.sin_port = htons(port);
  211. send.sin_family = AF_INET;
  212. if (ip) inet_aton(ip, &send.sin_addr);
  213. else send.sin_addr.s_addr = htonl(INADDR_ANY);
  214. if(s < 0 || bind(s, (struct sockaddr*)&send, sizeof(send)) != 0)
  215. {
  216. perror("socket|bind");
  217. close(s);
  218. return -1;
  219. }
  220. return s;
  221. }
  222. int send_udp (int s, char *host, unsigned int port, char *buf, int len)
  223. {
  224. struct sockaddr_in server;
  225. struct hostent *h;
  226. if ((h = init_sockaddr (&server, host, port)) == (struct hostent *)0)
  227. {
  228. perror ("socket||gethostbyname");
  229. return -1;
  230. }
  231. return sendto(s, buf, len, 0, (struct sockaddr*)&server,sizeof(server));
  232. }
  233. int sendMessage (int sock, char *ptr, struct sockaddr_in *dest)
  234. {
  235. int len = *(int *)ptr;
  236. int socklen = sizeof (struct sockaddr_in);
  237. if (sendto (sock, ptr, len, 0, (struct sockaddr *)dest, socklen) != len)
  238. return -1;
  239. return len;
  240. }
  241. int connect_nonb(int sockfd, struct sockaddr_in *saptr, socklen_t salen)
  242. {
  243. int flags, n, error;
  244. flags = fcntl(sockfd, F_GETFL, 0);
  245. flags |= O_NONBLOCK;
  246. fcntl(sockfd, F_SETFL, flags);
  247. error = 0;
  248. if ( (n = connect (sockfd, (struct sockaddr *) saptr, salen)) < 0)
  249. {
  250. if (errno != EINPROGRESS)
  251. {
  252. perror ("CP: Connect error:");
  253. return(-1);
  254. }
  255. }
  256. /* Do whatever we want while the connect is taking place. */
  257. return flags;
  258. }
  259. #ifdef HAVE_MYSQL
  260. MYSQL *init_mysql (char *host, char *username, char *pass, char *db, char *sock)
  261. {
  262. MYSQL *mysql = mysql_init (NULL);
  263. if (mysql == NULL)
  264. {
  265. PDEBUG ("mysql_init failedn");
  266. return NULL;
  267. }
  268. if (mysql_real_connect (mysql, host, username, pass, db, 0, sock, 0) == NULL)
  269. {
  270. PDEBUG ("mysql_real_connect failed:%s.n", mysql_error(mysql));
  271. return NULL;
  272. }
  273. return mysql;
  274. }
  275. int query_mysql (MYSQL *mysql, char *format, ...)
  276. {
  277. char buffer[MAX_QUERY];
  278. int len;
  279. va_list ap;
  280. va_start (ap, format);
  281. len = vsnprintf (buffer, MAX_QUERY, format, ap);
  282. va_end (ap);
  283. if (len >= MAX_QUERY || len <= -1) return -1;
  284. if (mysql_query (mysql, buffer) != 0)
  285. {
  286. PDEBUG ("Error in query mysql database: %s.n", mysql_error (mysql));
  287. return -1;
  288. }
  289. return 0;
  290. }
  291. MYSQL_RES *query_mysql_select (MYSQL *mysql, char *format, ...)
  292. {
  293. char buffer[MAX_QUERY];
  294. int len;
  295. va_list ap;
  296. va_start (ap, format);
  297. len = vsnprintf (buffer, MAX_QUERY, format, ap);
  298. va_end (ap);
  299. if (len >= MAX_QUERY || len <= -1) return NULL;
  300. if (mysql_query (mysql, buffer) != 0)
  301. {
  302. PDEBUG ("Error in query mysql database: %s.n", mysql_error (mysql));
  303. return NULL;
  304. }
  305. return mysql_store_result (mysql);
  306. }
  307. int authUser (int uid, char *md5, MYSQL *mysql, char *name)
  308. {
  309. MYSQL_ROW row;
  310. MYSQL_RES *result_set;
  311. return 1;
  312. result_set = query_mysql_select (mysql, "select username from c_reg_users where userid = "%d" and password = "%s"", uid, md5);
  313. if (result_set && (row = mysql_fetch_row (result_set)) != NULL)
  314. {
  315. if (name) strcpy (name, row[0]);
  316. return 1;
  317. }
  318. if (result_set) mysql_free_result (result_set);
  319. return 0;
  320. }
  321. #endif
  322. void php_url_encode(char *s, unsigned char *str)
  323. {
  324. register int x, y;
  325. int len = strlen (s);
  326. for (x = 0, y = 0; len--; x++, y++) {
  327. str[y] = (unsigned char) s[x];
  328. if ((str[y] < '0' && str[y] != '-' && str[y] != '.' && str[y] != '/') ||
  329. (str[y] < 'A' && str[y] > '9') ||
  330. (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
  331. (str[y] > 'z')) {
  332. str[y++] = '%';
  333. str[y++] = hexchars[(unsigned char) s[x] >> 4];
  334. str[y] = hexchars[(unsigned char) s[x] & 15];
  335. }
  336. }
  337. str[y] = '';
  338. }
  339. char *read_file (char *fname, int *dlen)
  340. {
  341. register int32_t fd, cc;
  342. char *cp;
  343. struct stat buf;
  344. *dlen = 0;
  345. if ((fd = open (fname, O_RDONLY)) < 0)
  346. return NULL;
  347. if (fstat (fd, &buf) < 0)
  348. goto ERROR0;
  349. cp = (char*)malloc ((uint32_t) buf.st_size + 1);
  350. *dlen = buf.st_size;
  351. if ((cc = read (fd, cp, (int) buf.st_size)) < 0 || cc != buf.st_size)
  352. goto ERROR;
  353. cp[(int) buf.st_size] = '';
  354. close (fd);
  355. return (cp);
  356. ERROR:
  357. free (cp);
  358. ERROR0:
  359. close (fd);
  360. perror ("read_file:");
  361. return NULL;
  362. }