abooksearch.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:2k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. #include "config.h"
  2. #include "ldapaddressbook.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #if HAVE_SYS_WAIT_H
  9. #include <sys/wait.h>
  10. #endif
  11. #ifndef WEXITSTATUS
  12. #define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
  13. #endif
  14. #ifndef WIFEXITED
  15. #define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
  16. #endif
  17. int ldapabook_search(const struct ldapabook *a,
  18. const char *script,
  19. const char *filter,
  20. int stderr_fd)
  21. {
  22. int pipefd[2];
  23. pid_t p;
  24. const char *argv[13];
  25. int argn;
  26. if (pipe(pipefd) < 0) return (-1);
  27. if ((p=fork()) == -1)
  28. {
  29. close(pipefd[0]);
  30. close(pipefd[1]);
  31. return (-1);
  32. }
  33. if (p) /* Parent waits for the first child to exit. */
  34. {
  35. int waitstat;
  36. close(pipefd[1]);
  37. while (wait(&waitstat) != p)
  38. ;
  39. return (pipefd[0]);
  40. }
  41. /* Child forks a second child */
  42. close(pipefd[0]);
  43. if (stderr_fd)
  44. {
  45. close(2);
  46. dup(stderr_fd);
  47. close(stderr_fd);
  48. }
  49. if ((p=fork()) == -1)
  50. {
  51. close(pipefd[1]);
  52. perror("fork");
  53. exit(0);
  54. }
  55. if (p) /* Parent immediately exits */
  56. exit(0);
  57. close(1);
  58. dup(pipefd[1]);
  59. close(pipefd[1]);
  60. argn=0;
  61. argv[argn++]=script;
  62. if (*a->binddn)
  63. {
  64. argv[argn++]="-D";
  65. argv[argn++]=a->binddn;
  66. }
  67. if (*a->bindpw)
  68. {
  69. argv[argn++]="-W";
  70. argv[argn++]=a->bindpw;
  71. }
  72. if (*a->host)
  73. {
  74. argv[argn++]="-h";
  75. argv[argn++]=a->host;
  76. }
  77. if (*a->port)
  78. {
  79. argv[argn++]="-p";
  80. argv[argn++]=a->port;
  81. }
  82. if (*a->suffix)
  83. {
  84. argv[argn++]="-b";
  85. argv[argn++]=a->suffix;
  86. }
  87. argv[argn++]=filter;
  88. argv[argn]=0;
  89. execvp(script, (char **)argv);
  90. perror(script);
  91. exit(0);
  92. }