dbz_query_sample.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:5k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /************************************************************************
  2. DBZ Server Query Sample by Samson Chen, May 8, 1995
  3. Code modified from INNBBSD-0.40 by Shih-Kun Huang
  4.  ------------------------------------------------------------------------
  5. SYNOPSIS
  6.   init_dbz_channel()
  7.   close_dbz_channel()
  8.   add_mid(mid, path)
  9. char *mid;
  10. char *path;
  11.   query_mid(mid, path)
  12. char *mid;
  13. char *path;
  14. DESCRIPTION
  15.   make sure that #define DBZ_CHANNEL is the correct UNIX domain
  16.   socket path.
  17.   call init_dbz_channel() before using add_mid() and query_mid(),
  18.   return TRUE(-1) if successful, FALSE(0) if failed.
  19.   call close_dbz_channel() when program exit.
  20.   add_mid() put *mid and *path to dbz server. Return TRUE if
  21.   successful, FALSE if failed(maybe duplicate).
  22.   query_mid() search *mid from dbz server, if found, path will be
  23.   put to *path. If you call query_mid(*mid, NULL) then the function
  24.   just do searching. Return TRUE if found, FALSE if not found.
  25.   Comment the definition DBZ_CHANNEL (do not declare it) will stop
  26.   the dbz function automatically.
  27.   There is a sample main() on the bottom of this prgram, replace
  28.   it with your own.
  29.  ************************************************************************/
  30. #include <stdio.h>
  31. #include <sys/types.h>
  32. #include <sys/socket.h>
  33. #include <sys/un.h>
  34. #define DBZ_CHANNEL "innd/.innbbsd"
  35. #define TRUE -1
  36. #define FALSE 0
  37. char    INNBBSbuffer[4096];
  38. static FILE *innbbsin, *innbbsout;
  39. static int innbbsfd;
  40. static char dbz_connect = FALSE;
  41. #ifdef SOLARIS
  42. #ifndef bzero
  43. #define bzero(mem, size) memset(mem,'',size)
  44. #endif
  45. #endif
  46. /*
  47. add Message-ID to DBZ server
  48. */
  49. add_mid(mid, path)
  50. char   *mid; /* Message-ID to be added */
  51. char   *path; /* path of that Message */
  52. /*
  53. return:
  54. TRUE: OK
  55. FALSE: Failed (maybe duplicate)
  56. */
  57. {
  58. char    line[4096];
  59. if (dbz_connect) {
  60. sprintf(line, "ADDHIST %s %srn", mid, path);
  61. fprintf(innbbsout, line);
  62. fflush(innbbsout);
  63. fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin);
  64. if (INNBBSbuffer[0] == '2')
  65. return (TRUE);
  66. else
  67. return (FALSE);
  68. } else
  69. return (FALSE);
  70. }
  71. /*end of add_mid*/
  72. /*
  73. query Message-ID from DBZ server
  74. */
  75. query_mid(mid, path)
  76. char   *mid; /* Message-ID to be searched */
  77. char   *path; /* If MID found, path will be put here, NULL
  78.  * for just test mid */
  79. /*
  80. return:
  81. TRUE: mid found
  82. FALSE: not found
  83. */
  84. {
  85. char    line[4096];
  86. char   *l;
  87. int     c;
  88. if (dbz_connect) {
  89. sprintf(line, "GREPHIST %srn", mid);
  90. fprintf(innbbsout, line);
  91. fflush(innbbsout);
  92. fgets(INNBBSbuffer, sizeof INNBBSbuffer, innbbsin);
  93. if (INNBBSbuffer[0] == '2') {
  94. if (path == (char *) NULL)
  95. return (TRUE);
  96. sprintf(line, "%s            ", INNBBSbuffer);
  97. l = line;
  98. /* find path */
  99. c = 0;
  100. while (l[c] != 0 && l[c] != 0x9 && l[c] != 0x20)
  101. c++;
  102. l += c + 1;
  103. c = 0;
  104. while (l[c] != 0 && l[c] != 0x9 && l[c] != 0x20)
  105. c++;
  106. l += c + 1;
  107. c = 0;
  108. while (l[c] != 0 && l[c] != 0x9 && l[c] != 0x20)
  109. c++;
  110. l[c] = 0;
  111. strcpy(path, l);
  112. return (TRUE);
  113. } else
  114. return (FALSE);
  115. } else
  116. return (FALSE);
  117. }
  118. /*end of query_mid*/
  119. /*
  120. open UNIX DOMAIN socket
  121. */
  122. int 
  123. unixclient(path)
  124. char   *path; /* unix domin socket path */
  125. /*
  126. return:
  127. >0: OK
  128. <0: failed
  129. */
  130. {
  131. struct sockaddr_un s_un;/* unix endpoint address */
  132. int     s;
  133. bzero((char *) &s_un, sizeof(s_un));
  134. s_un.sun_family = AF_UNIX;
  135. if (path == NULL)
  136. return (-1);
  137. strcpy(s_un.sun_path, path);
  138. /* Allocate a socket */
  139. s = socket(PF_UNIX, SOCK_STREAM, 0);
  140. if (s < 0)
  141. return -1;
  142. /* Connect the socket to the server */
  143. if (connect(s, (struct sockaddr *) & s_un, sizeof(s_un)) < 0)
  144. return -1;
  145. return s;
  146. }
  147. /*end of unixclient*/
  148. /*
  149. init dbz unix domain socket
  150. */
  151. init_dbz_channel()
  152. /*
  153. return:
  154. TRUE: OK
  155. FALSE:  Failed
  156. */
  157. {
  158. dbz_connect = FALSE;
  159. #ifdef DBZ_CHANNEL
  160. innbbsfd = unixclient(DBZ_CHANNEL);
  161. if (innbbsfd < 0)
  162. return (FALSE);
  163. if ((innbbsin = fdopen(innbbsfd, "r")) == NULL ||
  164. (innbbsout = fdopen(innbbsfd, "w")) == NULL)
  165. return (FALSE);
  166. dbz_connect = TRUE;
  167. /* dbz server responsed initial status */
  168. fgets(INNBBSbuffer, sizeof(INNBBSbuffer), innbbsin);
  169. if (strncmp(INNBBSbuffer, "200", 3)) {
  170. dbz_connect = FALSE;
  171. close_dbz_channel();
  172. }
  173. #endif
  174. return (dbz_connect);
  175. }
  176. /*end of initsocket*/
  177. /*
  178. close dbz channel
  179. */
  180. close_dbz_channel()
  181. {
  182. if (dbz_connect) {
  183. if (innbbsin != NULL)
  184. fclose(innbbsin);
  185. if (innbbsout != NULL)
  186. fclose(innbbsout);
  187. if (innbbsfd >= 0)
  188. close(innbbsfd);
  189. }
  190. }
  191. /*end of closesocket*/
  192. /***********************************************************************
  193. Just a SAMPLE, replace main() with your own
  194.  ***********************************************************************/
  195. main(argc, argv)
  196. int     argc;
  197. char  **argv;
  198. {
  199. char    test[4096];
  200. int     ret;
  201. init_dbz_channel();
  202. ret = add_mid("<tttt.eeee.ssss.tttt>", "THIS_IS_1ST_PATH");
  203. if (ret)
  204. printf("add 1st mid OKn");
  205. else
  206. printf("add 1st mid failedn");
  207. ret = add_mid("<bbbb.cccc.dddd.eeee>", "THIS_IS_2ND_PATH");
  208. if (ret)
  209. printf("add 2st mid OKn");
  210. else
  211. printf("add 2st mid failedn");
  212. ret = query_mid("<tttt.eeee.ssss.tttt>", test);
  213. if (ret)
  214. printf("query 1st ok : '%s'n", test);
  215. else
  216. printf("query 1st failedn");
  217. ret = query_mid("<bbbb.cccc.dddd.eeee>", test);
  218. if (ret)
  219. printf("query 2nd ok : '%s'n", test);
  220. else
  221. printf("query 2nd failedn");
  222. ret = query_mid("<no.such.item>", test);
  223. if (ret)
  224. printf("query no_such_item found ??? : '%s'n", test);
  225. else
  226. printf("query no_such_item not foundn");
  227. close_dbz_channel();
  228. }