smb_auth.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  *  smb_auth - SMB proxy authentication module
  3.  *  Copyright (C) 1998  Richard Huveneers <richard@hekkihek.hacom.nl>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #define BUFSIZE 256
  23. #define NMB_UNICAST 1
  24. #define NMB_BROADCAST 2
  25. struct SMBDOMAIN
  26. {
  27. char *name; /* domain name */
  28. char *sname; /* match this with user input */
  29. char *nmbaddr; /* name service address */
  30. int nmbcast; /* broadcast or unicast */
  31. struct SMBDOMAIN *next; /* linked list */
  32. };
  33. struct SMBDOMAIN *firstdom = NULL;
  34. struct SMBDOMAIN *lastdom = NULL;
  35. void main(int argc, char *argv[])
  36. {
  37. int i;
  38. char buf[BUFSIZE];
  39. struct SMBDOMAIN *dom;
  40. char *s;
  41. char *user;
  42. char *pass;
  43. char *domname;
  44. FILE *p;
  45. /* make standard output line buffered */
  46. if (setvbuf(stdout, NULL, _IOLBF, 0) != 0)
  47. return;
  48. /* parse command line arguments */
  49. for (i = 1; i < argc; i++)
  50. {
  51. /* the next options require an argument */
  52. if (i + 1 == argc)
  53. break;
  54. if (strcmp(argv[i], "-W") == 0)
  55. {
  56. if ((dom = (struct SMBDOMAIN *) malloc(sizeof(struct SMBDOMAIN))) == NULL)
  57. return;
  58. dom->name = dom->sname = argv[++i];
  59. dom->nmbaddr = "";
  60. dom->nmbcast = NMB_BROADCAST;
  61. dom->next = NULL;
  62. /* append to linked list */
  63. if (lastdom != NULL)
  64. lastdom->next = dom;
  65. else
  66. firstdom = dom;
  67. lastdom = dom;
  68. continue;
  69. }
  70. if (strcmp(argv[i], "-w") == 0)
  71. {
  72. if (lastdom != NULL)
  73. lastdom->sname = argv[++i];
  74. continue;
  75. }
  76. if (strcmp(argv[i], "-B") == 0)
  77. {
  78. if (lastdom != NULL)
  79. {
  80. lastdom->nmbaddr = argv[++i];
  81. lastdom->nmbcast = NMB_BROADCAST;
  82. }
  83. continue;
  84. }
  85. if (strcmp(argv[i], "-U") == 0)
  86. {
  87. if (lastdom != NULL)
  88. {
  89. lastdom->nmbaddr = argv[++i];
  90. lastdom->nmbcast = NMB_UNICAST;
  91. }
  92. continue;
  93. }
  94. }
  95. while (1)
  96. {
  97. if (fgets(buf, BUFSIZE, stdin) == NULL)
  98. break;
  99. if ((s = strchr(buf, 'n')) == NULL)
  100. continue;
  101. *s = '';
  102. if ((s = strchr(buf, ' ')) == NULL)
  103. {
  104. (void) printf("ERRn");
  105. continue;
  106. }
  107. *s = '';
  108. user = buf;
  109. pass = s + 1;
  110. domname = NULL;
  111. if ((s = strchr(user, '\')) != NULL)
  112. {
  113. *s = '';
  114. domname = user;
  115. user = s + 1;
  116. }
  117. /* match domname with linked list */
  118. if (domname != NULL && strlen(domname) > 0)
  119. {
  120. for (dom = firstdom; dom != NULL; dom = dom->next)
  121. if (strcasecmp(dom->sname, domname) == 0)
  122. break;
  123. } else
  124. dom = firstdom;
  125. if (dom == NULL)
  126. {
  127. (void) printf("ERRn");
  128. continue;
  129. }
  130. if ((p = popen(HELPERSCRIPT " > /dev/null 2>&1", "w")) == NULL)
  131. {
  132. (void) printf("ERRn");
  133. continue;
  134. }
  135. (void) fprintf(p, "%sn", SAMBAPREFIX);
  136. (void) fprintf(p, "%sn", dom->name);
  137. (void) fprintf(p, "%sn", dom->nmbaddr);
  138. (void) fprintf(p, "%dn", dom->nmbcast);
  139. (void) fprintf(p, "%sn", user);
  140. (void) fprintf(p, "%sn", pass);
  141. (void) fflush(p);
  142. if (pclose(p) == 0)
  143. (void) printf("OKn");
  144. else
  145. (void) printf("ERRn");
  146. } /* while (1) */
  147. }