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);
  33. if (h == (struct hostent *)0)
  34. {
  35. perror ("gethostbyname");
  36. return (struct hostent *)0;
  37. }
  38. name->sin_addr = *(struct in_addr *)h->h_addr;
  39. return h;
  40. }
  41. int my_connect (char *host, int port)
  42. {
  43. struct sockaddr_in client;
  44. struct hostent *h;
  45. int connection = socket (PF_INET, SOCK_STREAM, 0);
  46. if ((connection < 0) || ((h = init_sockaddr (&client, host, port)) == (struct hostent *)0))
  47. {
  48. perror ("socket||gethostbyname");
  49. return -1;
  50. }
  51. if (connect (connection, (struct sockaddr *) &client, sizeof (client)) < 0)
  52. {
  53. perror ("connect");
  54. return -1;
  55. }
  56. return connection;
  57. }
  58. int init_server (char *ip, unsigned short port)
  59. {
  60. int flags;
  61. struct sockaddr_in server_address;
  62. int reuse_addr = 1;
  63. int keep_alive = 1;
  64. int sock = socket(AF_INET, SOCK_STREAM, 0);
  65. if (sock < 0)
  66. {
  67. perror("socket");
  68. return -1;
  69. }
  70. setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
  71. setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &keep_alive, sizeof(keep_alive));
  72. flags = fcntl(sock, F_GETFL, 0);
  73. flags |= O_NONBLOCK;
  74. fcntl(sock, F_SETFL, flags);
  75. memset((char *) &server_address, 0, sizeof(server_address));
  76. server_address.sin_port = htons(port);
  77. server_address.sin_family = AF_INET;
  78. //server_address.sin_addr.s_addr = htonl(INADDR_ANY);
  79. if (ip) inet_aton(ip, &server_address.sin_addr);
  80. else server_address.sin_addr.s_addr = htonl(INADDR_ANY);
  81. if (bind(sock, (struct sockaddr *) &server_address, sizeof(server_address)) < 0)
  82. {
  83. perror("bind");
  84. close(sock);
  85. return -1;
  86. }
  87. listen(sock,MAX_CLIENT);
  88. return sock;
  89. }
  90. int read_config (char *fname, struct NamVal *para, int n)
  91. {
  92. char *c, *pd;
  93. struct Array *parray;
  94. int array[MAX_ARRAY];
  95. int i, j, len, nlen;
  96. FILE *f = fopen (fname, "r");
  97. char buf[MAX_CFG_LINE]; //MAX_LINE = 1024
  98. if (!f)
  99. {
  100. return -1;
  101. }
  102. while (fgets (buf, MAX_CFG_LINE, f))
  103. {
  104. if (index(EscapedChar, buf[0]))
  105. continue;
  106. buf[MAX_CFG_LINE-1] = 0;
  107. len = strlen (buf);
  108. while (len > 0 && (buf[len] == 0 || buf[len] == 'n' || buf[len] == 'r' || buf[len] == ' '))
  109. len --;
  110. if (len == 0) continue;
  111. else buf[++len] = 0;
  112. c = index (buf, '=');
  113. *c = 0;
  114. nlen = c - buf;
  115. for (i=0; i<n; i++)
  116. {
  117. if (!strncasecmp (buf, para[i].name, nlen))
  118. break;
  119. }
  120. if (i < n)
  121. switch (para[i].type)
  122. {
  123. case 'd': /* Int type */
  124. *(int *)(para[i].ptr) = atoi (c+1);
  125. break;
  126. case 'a':
  127. parray = (struct Array *)(para[i].ptr);
  128. pd = ++c;
  129. for (j=0; j<MAX_ARRAY; j++)
  130. {
  131. while ((*c != 0) && (*c < '0' || *c > '9')) c++;
  132. if (*c == 0) break;
  133. array[j] = strtol (c, &pd, 0);
  134. c = pd;
  135. }
  136. if (j > 0)
  137. {
  138. para[i].should_free = 1;
  139. parray->ptr = calloc (j, sizeof (int));
  140. memcpy (parray->ptr, array, sizeof (int)*j);
  141. }
  142. parray->size = j;
  143. break;
  144. case 'f': /* float type */
  145. *(float *)(para[i].ptr) = atof (c+1);
  146. break;
  147. case 's': /* Char string */
  148. if (len > nlen)
  149. {
  150. *(char **)(para[i].ptr) = (char *)calloc (len-nlen, 1);
  151. para[i].should_free = 1;
  152. memcpy (*(char **)(para[i].ptr), c+1, len-nlen);
  153. } else
  154. *(char **)(para[i].ptr) = 0;
  155. break;
  156. case 'b': /* Buffer type */
  157. if (len > nlen)
  158. memcpy ((char *)(para[i].ptr), c+1, len-nlen);
  159. else
  160. *(char *)para[i].ptr = 0;
  161. break;
  162. default:
  163. break;
  164. }
  165. else
  166. continue;
  167. }
  168. fclose (f);
  169. return 0;
  170. }
  171. /*
  172. int main (int argc, char **argv)
  173. {
  174. read_config ("./ats.cfg", ConfigParameters, sizeof (ConfigParameters)/sizeof(struct NamVal));
  175. PDEBUG ("%s %s %s %dn", g, p, l, s);
  176. return 0;
  177. }
  178. */
  179. int free_config (struct NamVal *nv, int n)
  180. {
  181. int i;
  182. for (i=0; i<n; i++)
  183. {
  184. switch (nv[i].type)
  185. {
  186. case 'a':
  187. if ((struct Array *)(nv[i].ptr) != NULL && nv[i].should_free == 1)
  188. free (((struct Array *)(nv[i].ptr))->ptr);
  189. break;
  190. case 's':
  191. if (*(char **)(nv[i].ptr) != NULL && nv[i].should_free == 1)
  192. free (*(char **)(nv[i].ptr));
  193. break;
  194. default:
  195. break;
  196. }
  197. }
  198. return 0;
  199. }
  200. int init_udp (char *ip, unsigned short port)
  201. {
  202. int s = socket (PF_INET, SOCK_DGRAM, 0);
  203. struct sockaddr_in send;
  204. send.sin_port = htons(port);
  205. send.sin_family = AF_INET;
  206. if (ip) inet_aton(ip, &send.sin_addr);
  207. else send.sin_addr.s_addr = htonl(INADDR_ANY);
  208. if(s < 0 || bind(s, (struct sockaddr*)&send, sizeof(send)) != 0)
  209. {
  210. perror("socket|bind");
  211. close(s);
  212. return -1;
  213. }
  214. return s;
  215. }
  216. int send_udp (int s, char *host, unsigned int port, char *buf, int len)
  217. {
  218. struct sockaddr_in server;
  219. struct hostent *h;
  220. if ((h = init_sockaddr (&server, host, port)) == (struct hostent *)0)
  221. {
  222. perror ("socket||gethostbyname");
  223. return -1;
  224. }
  225. return sendto(s, buf, len, 0, (struct sockaddr*)&server,sizeof(server));
  226. }
  227. int sendMessage (int sock, char *ptr, struct sockaddr_in *dest)
  228. {
  229. int len = *(int *)ptr;
  230. int socklen = sizeof (struct sockaddr_in);
  231. if (sendto (sock, ptr, len, 0, (struct sockaddr *)dest, socklen) != len)
  232. return -1;
  233. return len;
  234. }
  235. int
  236. connect_nonb(int sockfd, struct sockaddr_in *saptr, socklen_t salen)
  237. {
  238. int flags, n, error;
  239. flags = fcntl(sockfd, F_GETFL, 0);
  240. flags |= O_NONBLOCK;
  241. fcntl(sockfd, F_SETFL, flags);
  242. error = 0;
  243. if ( (n = connect (sockfd, (struct sockaddr *) saptr, salen)) < 0)
  244. {
  245. if (errno != EINPROGRESS)
  246. {
  247. perror ("CP: Connect error:");
  248. return(-1);
  249. }
  250. }
  251. /* Do whatever we want while the connect is taking place. */
  252. return flags;
  253. }
  254. #ifdef HAVE_MYSQL
  255. MYSQL *init_mysql (char *host, char *username, char *pass, char *db, char *sock)
  256. {
  257. MYSQL *mysql = mysql_init (NULL);
  258. if (mysql == NULL)
  259. {
  260. PDEBUG ("mysql_init failedn");
  261. return NULL;
  262. }
  263. if (mysql_real_connect (mysql, host, username, pass, db, 0, sock, 0) == NULL)
  264. {
  265. PDEBUG ("mysql_real_connect failed:%s.n", mysql_error(mysql));
  266. return NULL;
  267. }
  268. return mysql;
  269. }
  270. int query_mysql (MYSQL *mysql, char *format, ...)
  271. {
  272. char buffer[MAX_QUERY];
  273. int len;
  274. va_list ap;
  275. va_start (ap, format);
  276. len = vsnprintf (buffer, MAX_QUERY, format, ap);
  277. va_end (ap);
  278. if (len >= MAX_QUERY || len <= -1) return -1;
  279. if (mysql_query (mysql, buffer) != 0)
  280. {
  281. PDEBUG ("Error in query mysql database: %s.n", mysql_error (mysql));
  282. return -1;
  283. }
  284. return 0;
  285. }
  286. MYSQL_RES *query_mysql_select (MYSQL *mysql, char *format, ...)
  287. {
  288. char buffer[MAX_QUERY];
  289. int len;
  290. va_list ap;
  291. va_start (ap, format);
  292. len = vsnprintf (buffer, MAX_QUERY, format, ap);
  293. va_end (ap);
  294. if (len >= MAX_QUERY || len <= -1) return NULL;
  295. if (mysql_query (mysql, buffer) != 0)
  296. {
  297. PDEBUG ("Error in query mysql database: %s.n", mysql_error (mysql));
  298. return NULL;
  299. }
  300. return mysql_store_result (mysql);
  301. }
  302. int authUser (int uid, char *md5, MYSQL *mysql, char *name)
  303. {
  304. MYSQL_ROW row;
  305. MYSQL_RES *result_set;
  306. return 1;
  307. result_set = query_mysql_select (mysql, "select username from c_reg_users where userid = "%d" and password = "%s"", uid, md5);
  308. if (result_set && (row = mysql_fetch_row (result_set)) != NULL)
  309. {
  310. if (name) strcpy (name, row[0]);
  311. return 1;
  312. }
  313. if (result_set) mysql_free_result (result_set);
  314. return 0;
  315. }
  316. #endif
  317. /* {{{ php_url_encode
  318.  *  */
  319. void php_url_encode(char *s, unsigned char *str)
  320. {
  321. register int x, y;
  322. int len = strlen (s);
  323. for (x = 0, y = 0; len--; x++, y++) {
  324. str[y] = (unsigned char) s[x];
  325. /*      if (str[y] == ' ') {
  326.  *      *                  str[y] = '+';
  327.  *      *                          } else*/
  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 = 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. }