PageRenderTime 65ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/tags/OpenSLP_1-0-5/openslp/slptool/slptool.c

#
C | 587 lines | 443 code | 70 blank | 74 comment | 86 complexity | 8f3b08c7756417eb50c611d7f28f8f2d MD5 | raw file
Possible License(s): BSD-3-Clause, MPL-2.0-no-copyleft-exception, LGPL-2.1
  1. /***************************************************************************/
  2. /* */
  3. /* Project: OpenSLP command line UA wrapper */
  4. /* */
  5. /* File: slptool.c */
  6. /* */
  7. /* Abstract: Command line wrapper for OpenSLP */
  8. /* */
  9. /* Requires: OpenSLP installation */
  10. /* */
  11. /* Author(s): Matt Peterson <mpeterson@caldera.com> */
  12. /* */
  13. /* Copyright (c) 1995, 1999 Caldera Systems, Inc. */
  14. /* */
  15. /* This program is free software; you can redistribute it and/or modify it */
  16. /* under the terms of the GNU Lesser General Public License as published */
  17. /* by the Free Software Foundation; either version 2.1 of the License, or */
  18. /* (at your option) any later version. */
  19. /* */
  20. /* This program is distributed in the hope that it will be useful, */
  21. /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
  22. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
  23. /* GNU Lesser General Public License for more details. */
  24. /* */
  25. /* You should have received a copy of the GNU Lesser General Public */
  26. /* License along with this program; see the file COPYING. If not, */
  27. /* please obtain a copy from http://www.gnu.org/copyleft/lesser.html */
  28. /* */
  29. /*-------------------------------------------------------------------------*/
  30. /* */
  31. /* Please submit patches to maintainer of http://www.openslp.org */
  32. /* */
  33. /***************************************************************************/
  34. #include "slptool.h"
  35. #ifdef WIN32
  36. #define strncasecmp(String1, String2, Num) strnicmp(String1, String2, Num)
  37. #define strcasecmp(String1, String2) stricmp(String1, String2)
  38. #define inet_aton(opt,bind) ((bind)->s_addr = inet_addr(opt))
  39. #else
  40. #ifndef HAVE_STRNCASECMP
  41. int
  42. strncasecmp(const char *s1, const char *s2, size_t len);
  43. #endif
  44. #ifndef HAVE_STRCASECMP
  45. int
  46. strcasecmp(const char *s1, const char *s2);
  47. #endif
  48. #endif
  49. /*=========================================================================*/
  50. SLPBoolean mySrvTypeCallback( SLPHandle hslp,
  51. const char* srvtypes,
  52. SLPError errcode,
  53. void* cookie )
  54. /*=========================================================================*/
  55. {
  56. char* cpy;
  57. char* slider1;
  58. char* slider2;
  59. if(errcode == SLP_OK && *srvtypes)
  60. {
  61. cpy = strdup(srvtypes);
  62. if(cpy)
  63. {
  64. slider1 = slider2 = cpy;
  65. slider1 = strchr(slider2,',');
  66. while(slider1)
  67. {
  68. *slider1 = 0;
  69. printf("%s\n",slider2);
  70. slider1 ++;
  71. slider2 = slider1;
  72. slider1 = strchr(slider2,',');
  73. }
  74. /* print the final itam */
  75. printf("%s\n",slider2);
  76. free(cpy);
  77. }
  78. }
  79. return SLP_TRUE;
  80. }
  81. /*=========================================================================*/
  82. void FindSrvTypes(SLPToolCommandLine* cmdline)
  83. /*=========================================================================*/
  84. {
  85. SLPError result;
  86. SLPHandle hslp;
  87. if(SLPOpen(cmdline->lang,SLP_FALSE,&hslp) == SLP_OK)
  88. {
  89. if(cmdline->cmdparam1)
  90. {
  91. result = SLPFindSrvTypes(hslp,
  92. cmdline->cmdparam1,
  93. cmdline->scopes,
  94. mySrvTypeCallback,
  95. 0);
  96. }
  97. else
  98. {
  99. result = SLPFindSrvTypes(hslp,
  100. "*",
  101. cmdline->scopes,
  102. mySrvTypeCallback,
  103. 0);
  104. }
  105. if(result != SLP_OK)
  106. {
  107. printf("errorcode: %i\n",result);
  108. }
  109. SLPClose(hslp);
  110. }
  111. }
  112. /*=========================================================================*/
  113. SLPBoolean myAttrCallback(SLPHandle hslp,
  114. const char* attrlist,
  115. SLPError errcode,
  116. void* cookie )
  117. /*=========================================================================*/
  118. {
  119. if(errcode == SLP_OK)
  120. {
  121. printf("%s\n",attrlist);
  122. }
  123. return SLP_TRUE;
  124. }
  125. /*=========================================================================*/
  126. void FindAttrs(SLPToolCommandLine* cmdline)
  127. /*=========================================================================*/
  128. {
  129. SLPError result;
  130. SLPHandle hslp;
  131. if(SLPOpen(cmdline->lang,SLP_FALSE,&hslp) == SLP_OK)
  132. {
  133. result = SLPFindAttrs(hslp,
  134. cmdline->cmdparam1,
  135. cmdline->scopes,
  136. cmdline->cmdparam2,
  137. myAttrCallback,
  138. 0);
  139. if(result != SLP_OK)
  140. {
  141. printf("errorcode: %i\n",result);
  142. }
  143. SLPClose(hslp);
  144. }
  145. }
  146. /*=========================================================================*/
  147. SLPBoolean mySrvUrlCallback( SLPHandle hslp,
  148. const char* srvurl,
  149. unsigned short lifetime,
  150. SLPError errcode,
  151. void* cookie )
  152. /*=========================================================================*/
  153. {
  154. if(errcode == SLP_OK)
  155. {
  156. printf("%s,%i\n",srvurl,lifetime);
  157. }
  158. return SLP_TRUE;
  159. }
  160. /*=========================================================================*/
  161. void FindSrvs(SLPToolCommandLine* cmdline)
  162. /*=========================================================================*/
  163. {
  164. SLPError result;
  165. SLPHandle hslp;
  166. if(SLPOpen(cmdline->lang,SLP_FALSE,&hslp) == SLP_OK)
  167. {
  168. result = SLPFindSrvs(hslp,
  169. cmdline->cmdparam1,
  170. cmdline->scopes,
  171. cmdline->cmdparam2,
  172. mySrvUrlCallback,
  173. 0);
  174. if(result != SLP_OK)
  175. {
  176. printf("errorcode: %i\n",result);
  177. }
  178. SLPClose(hslp);
  179. }
  180. }
  181. /*=========================================================================*/
  182. void FindScopes(SLPToolCommandLine* cmdline)
  183. /*=========================================================================*/
  184. {
  185. SLPError result;
  186. SLPHandle hslp;
  187. char* scopes;
  188. if(SLPOpen(cmdline->lang,SLP_FALSE,&hslp) == SLP_OK)
  189. {
  190. result = SLPFindScopes(hslp,&scopes);
  191. if(result == SLP_OK)
  192. {
  193. printf("%s\n",scopes);
  194. SLPFree(scopes);
  195. }
  196. SLPClose(hslp);
  197. }
  198. }
  199. void mySLPRegReport(SLPHandle hslp, SLPError errcode, void* cookie)
  200. {
  201. if (errcode)
  202. printf("(de)registration errorcode %d\n", errcode);
  203. }
  204. /*=========================================================================*/
  205. void Register(SLPToolCommandLine* cmdline)
  206. /*=========================================================================*/
  207. {
  208. SLPError result;
  209. SLPHandle hslp;
  210. char srvtype[80] = "", *s;
  211. int len = 0;
  212. if (strncasecmp(cmdline->cmdparam1, "service:", 8) == 0)
  213. len = 8;
  214. s = strchr(cmdline->cmdparam1 + len, ':');
  215. if (!s)
  216. {
  217. printf("Invalid URL: %s\n", cmdline->cmdparam1);
  218. return;
  219. }
  220. len = s - cmdline->cmdparam1;
  221. strncpy(srvtype, cmdline->cmdparam1, len);
  222. srvtype[len] = 0;
  223. if(SLPOpen(cmdline->lang,SLP_FALSE,&hslp) == SLP_OK)
  224. {
  225. result = SLPReg(hslp,
  226. cmdline->cmdparam1,
  227. SLP_LIFETIME_MAXIMUM,
  228. srvtype,
  229. cmdline->cmdparam2,
  230. SLP_TRUE,
  231. mySLPRegReport,
  232. 0);
  233. if(result != SLP_OK)
  234. {
  235. printf("errorcode: %i\n",result);
  236. }
  237. SLPClose(hslp);
  238. }
  239. }
  240. /*=========================================================================*/
  241. void Deregister(SLPToolCommandLine* cmdline)
  242. /*=========================================================================*/
  243. {
  244. SLPError result;
  245. SLPHandle hslp;
  246. if(SLPOpen(cmdline->lang,SLP_FALSE,&hslp) == SLP_OK)
  247. {
  248. result = SLPDereg(hslp,
  249. cmdline->cmdparam1,
  250. mySLPRegReport,
  251. 0);
  252. if(result != SLP_OK)
  253. {
  254. printf("errorcode: %i\n",result);
  255. }
  256. SLPClose(hslp);
  257. }
  258. }
  259. /*=========================================================================*/
  260. void PrintVersion(SLPToolCommandLine* cmdline)
  261. /*=========================================================================*/
  262. {
  263. #ifdef WIN32
  264. printf("slptool version = %s\n",SLP_VERSION);
  265. #else
  266. printf("slptool version = %s\n",VERSION);
  267. #endif
  268. printf("OpenSLP version = %s\n",
  269. SLPGetProperty("net.slp.OpenSLPVersion"));
  270. }
  271. /*=========================================================================*/
  272. void GetProperty(SLPToolCommandLine* cmdline)
  273. /*=========================================================================*/
  274. {
  275. const char* propertyValue;
  276. propertyValue = SLPGetProperty(cmdline->cmdparam1);
  277. printf("%s = %s\n",
  278. cmdline->cmdparam1,
  279. propertyValue == 0 ? "" : propertyValue);
  280. }
  281. /*=========================================================================*/
  282. int ParseCommandLine(int argc,char* argv[], SLPToolCommandLine* cmdline)
  283. /* Returns Zero on success. Non-zero on error. */
  284. /*=========================================================================*/
  285. {
  286. int i;
  287. if(argc < 2)
  288. {
  289. /* not enough arguments */
  290. return 1;
  291. }
  292. for (i=1;i<argc;i++)
  293. {
  294. if( strcasecmp(argv[i],"-v") == 0 ||
  295. strcasecmp(argv[i],"--version") == 0 )
  296. {
  297. if(i < argc)
  298. {
  299. cmdline->cmd = PRINT_VERSION;
  300. return 0;
  301. }
  302. else
  303. {
  304. return 1;
  305. }
  306. }
  307. else if( strcasecmp(argv[i],"-s") == 0 ||
  308. strcasecmp(argv[i],"--scopes") == 0 )
  309. {
  310. i++;
  311. if(i < argc)
  312. {
  313. cmdline->scopes = argv[i];
  314. }
  315. else
  316. {
  317. return 1;
  318. }
  319. }
  320. else if( strcasecmp(argv[i],"-l") == 0 ||
  321. strcasecmp(argv[i],"--lang") == 0 )
  322. {
  323. i++;
  324. if(i < argc)
  325. {
  326. cmdline->lang = argv[i];
  327. }
  328. else
  329. {
  330. return 1;
  331. }
  332. }
  333. else if(strcasecmp(argv[i],"findsrvs") == 0)
  334. {
  335. cmdline->cmd = FINDSRVS;
  336. /* service type */
  337. i++;
  338. if(i < argc)
  339. {
  340. cmdline->cmdparam1 = argv[i];
  341. }
  342. else
  343. {
  344. return 1;
  345. }
  346. /* (optional) filter */
  347. i++;
  348. if(i < argc)
  349. {
  350. cmdline->cmdparam2 = argv[i];
  351. }
  352. break;
  353. }
  354. else if(strcasecmp(argv[i],"findattrs") == 0)
  355. {
  356. cmdline->cmd = FINDATTRS;
  357. /* url or service type */
  358. i++;
  359. if(i < argc)
  360. {
  361. cmdline->cmdparam1 = argv[i];
  362. }
  363. else
  364. {
  365. return 1;
  366. }
  367. /* (optional) attrids */
  368. i++;
  369. if(i < argc)
  370. {
  371. cmdline->cmdparam2 = argv[i];
  372. }
  373. }
  374. else if(strcasecmp(argv[i],"findsrvtypes") == 0)
  375. {
  376. cmdline->cmd = FINDSRVTYPES;
  377. /* (optional) naming authority */
  378. i++;
  379. if(i < argc)
  380. {
  381. cmdline->cmdparam1 = argv[i];
  382. }
  383. }
  384. else if(strcasecmp(argv[i],"findscopes") == 0)
  385. {
  386. cmdline->cmd = FINDSCOPES;
  387. }
  388. else if(strcasecmp(argv[i],"register") == 0)
  389. {
  390. cmdline->cmd = REGISTER;
  391. /* url */
  392. i++;
  393. if(i < argc)
  394. {
  395. cmdline->cmdparam1 = argv[i];
  396. }
  397. else
  398. {
  399. return 1;
  400. }
  401. /* Optional attrids */
  402. i++;
  403. if(i < argc)
  404. {
  405. cmdline->cmdparam2 = argv[i];
  406. }
  407. else
  408. {
  409. cmdline->cmdparam2 = cmdline->cmdparam1 + strlen(cmdline->cmdparam1);
  410. }
  411. break;
  412. }
  413. else if(strcasecmp(argv[i],"deregister") == 0)
  414. {
  415. cmdline->cmd = DEREGISTER;
  416. /* url */
  417. i++;
  418. if(i < argc)
  419. {
  420. cmdline->cmdparam1 = argv[i];
  421. }
  422. else
  423. {
  424. return 1;
  425. }
  426. }
  427. else if(strcasecmp(argv[i],"getproperty") == 0)
  428. {
  429. cmdline->cmd = GETPROPERTY;
  430. i++;
  431. if(i < argc)
  432. {
  433. cmdline->cmdparam1 = argv[i];
  434. }
  435. else
  436. {
  437. return 1;
  438. }
  439. }
  440. else
  441. {
  442. return 1;
  443. }
  444. }
  445. return 0;
  446. }
  447. /*=========================================================================*/
  448. void DisplayUsage()
  449. /*=========================================================================*/
  450. {
  451. printf("Usage: slptool [options] command-and-arguments \n");
  452. printf(" options may be:\n");
  453. printf(" -v (or --version) displays version of slptool and OpenSLP\n");
  454. printf(" -s (or --scope) followed by a comma separated list of scopes\n");
  455. printf(" -l (or --language) followed by a language tag\n");
  456. printf(" command-and-arguments may be:\n");
  457. printf(" findsrvs service-type [filter]\n");
  458. printf(" findattrs url [attrids]\n");
  459. printf(" findsrvtypes [authority]\n");
  460. printf(" findscopes\n");
  461. printf(" register url [attrs]\n");
  462. printf(" deregister url\n");
  463. printf(" getproperty propertyname\n");
  464. printf("Examples:\n");
  465. printf(" slptool register service:myserv.x://myhost.com \"(attr1=val1),(attr2=val2)\"\n");
  466. printf(" slptool findsrvs service:myserv.x\n");
  467. printf(" slptool findsrvs service:myserv.x \"(attr1=val1)\"\n");
  468. printf(" slptool findattrs service:myserv.x://myhost.com\n");
  469. printf(" slptool findattrs service:myserv.x://myhost.com attr1\n");
  470. printf(" slptool deregister service:myserv.x://myhost.com\n");
  471. printf(" slptool getproperty net.slp.useScopes\n");
  472. }
  473. /*=========================================================================*/
  474. int main(int argc, char* argv[])
  475. /*=========================================================================*/
  476. {
  477. int result;
  478. SLPToolCommandLine cmdline;
  479. /* zero out the cmdline */
  480. memset(&cmdline,0,sizeof(cmdline));
  481. /* Parse the command line */
  482. if(ParseCommandLine(argc,argv,&cmdline) == 0)
  483. {
  484. switch(cmdline.cmd)
  485. {
  486. case FINDSRVS:
  487. FindSrvs(&cmdline);
  488. break;
  489. case FINDATTRS:
  490. FindAttrs(&cmdline);
  491. break;
  492. case FINDSRVTYPES:
  493. FindSrvTypes(&cmdline);
  494. break;
  495. case FINDSCOPES:
  496. FindScopes(&cmdline);
  497. break;
  498. case GETPROPERTY:
  499. GetProperty(&cmdline);
  500. break;
  501. case REGISTER:
  502. Register(&cmdline);
  503. break;
  504. case DEREGISTER:
  505. Deregister(&cmdline);
  506. break;
  507. case PRINT_VERSION:
  508. PrintVersion(&cmdline);
  509. }
  510. }
  511. else
  512. {
  513. DisplayUsage();
  514. result = 1;
  515. }
  516. return 0;
  517. }