summaryrefslogtreecommitdiff
path: root/examples/libsmbclient
diff options
context:
space:
mode:
authorDerrell Lipman <derrell@samba.org>2005-12-05 23:30:40 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:05:44 -0500
commita54f9eddcea6497451dd6c720e9804ad5c6f3ad7 (patch)
tree8efb450c96cb2c41b8eb49003ba81ab225e58834 /examples/libsmbclient
parent884a0c8226a760e72912ceab159ddc28bd07f62c (diff)
downloadsamba-a54f9eddcea6497451dd6c720e9804ad5c6f3ad7.tar.gz
samba-a54f9eddcea6497451dd6c720e9804ad5c6f3ad7.tar.bz2
samba-a54f9eddcea6497451dd6c720e9804ad5c6f3ad7.zip
r12080: r10673@cabra: derrell | 2005-12-05 13:22:34 -0500
Correct some memory and file descriptor leaks. This should fix bugs 3257, 3267 and 3273. (This used to be commit c5781c9cf5f1f8297e084fbe2c4a22257420a447)
Diffstat (limited to 'examples/libsmbclient')
-rw-r--r--examples/libsmbclient/testbrowse.c238
1 files changed, 163 insertions, 75 deletions
diff --git a/examples/libsmbclient/testbrowse.c b/examples/libsmbclient/testbrowse.c
index 27d6a69738..6fa70eab41 100644
--- a/examples/libsmbclient/testbrowse.c
+++ b/examples/libsmbclient/testbrowse.c
@@ -9,24 +9,34 @@
#include <libsmbclient.h>
#include "get_auth_data_fn.h"
-void error_message(char * pMessage)
-{
- printf("ERROR: %s\n", pMessage);
-}
+static void
+no_auth_data_fn(const char * pServer,
+ const char * pShare,
+ char * pWorkgroup,
+ int maxLenWorkgroup,
+ char * pUsername,
+ int maxLenUsername,
+ char * pPassword,
+ int maxLenPassword);
+
+static void browse(char * path,
+ int scan,
+ int indent);
+
int
main(int argc, char * argv[])
{
int debug = 0;
+ int scan = 0;
+ int iterations = -1;
+ int again;
int opt;
char * p;
char * q;
char buf[1024];
- int dir;
- struct stat stat;
- struct smbc_dirent * dirent;
- poptContext pc;
+ poptContext pc;
struct poptOption long_options[] =
{
POPT_AUTOHELP
@@ -35,6 +45,14 @@ main(int argc, char * argv[])
0, "Set debug level", "integer"
},
{
+ "scan", 's', POPT_ARG_NONE, &scan,
+ 0, "Scan for servers and shares", "integer"
+ },
+ {
+ "iterations", 'i', POPT_ARG_INT, &iterations,
+ 0, "Iterations", "integer"
+ },
+ {
NULL
}
};
@@ -51,94 +69,164 @@ main(int argc, char * argv[])
}
}
- if (smbc_init(get_auth_data_fn, debug) != 0)
+ if (scan)
{
- printf("Could not initialize smbc_ library\n");
- return 1;
+ if (smbc_init(no_auth_data_fn, debug) != 0)
+ {
+ printf("Could not initialize smbc_ library\n");
+ return 1;
+ }
+
+ for (;
+ iterations == -1 || iterations > 0;
+ iterations = (iterations == -1 ? iterations : --iterations))
+ {
+ snprintf(buf, sizeof(buf), "smb://");
+ browse(buf, scan, 0);
+ }
}
-
- for (fputs("url: ", stdout), p = fgets(buf, sizeof(buf), stdin);
- p != NULL && *p != '\n' && *p != '\0';
- fputs("url: ", stdout), p = fgets(buf, sizeof(buf), stdin))
+ else
{
- if ((p = strchr(buf, '\n')) != NULL)
+ if (smbc_init(get_auth_data_fn, debug) != 0)
{
- *p = '\0';
+ printf("Could not initialize smbc_ library\n");
+ return 1;
}
-
- printf("Opening (%s)...\n", buf);
-
- if ((dir = smbc_opendir(buf)) < 0)
+
+ for (;
+ iterations == -1 || iterations > 0;
+ iterations = (iterations == -1 ? iterations : --iterations))
{
- printf("Could not open directory [%s] (%d:%s)\n",
- buf, errno, strerror(errno));
- continue;
+ fputs("url: ", stdout);
+ p = fgets(buf, sizeof(buf), stdin);
+ if (! p)
+ {
+ break;
+ }
+
+ if ((p = strchr(buf, '\n')) != NULL)
+ {
+ *p = '\0';
+ }
+
+ browse(buf, scan, 0);
}
+ }
- while ((dirent = smbc_readdir(dir)) != NULL)
- {
- printf("%-30s", dirent->name);
- printf("%-30s", dirent->comment);
+ exit(0);
+}
- switch(dirent->smbc_type)
- {
- case SMBC_WORKGROUP:
- printf("WORKGROUP");
- break;
+
+static void
+no_auth_data_fn(const char * pServer,
+ const char * pShare,
+ char * pWorkgroup,
+ int maxLenWorkgroup,
+ char * pUsername,
+ int maxLenUsername,
+ char * pPassword,
+ int maxLenPassword)
+{
+ return;
+}
+
+static void browse(char * path, int scan, int indent)
+{
+ char * p;
+ char buf[1024];
+ int dir;
+ struct stat stat;
+ struct smbc_dirent * dirent;
+
+ if (! scan)
+ {
+ printf("Opening (%s)...\n", path);
+ }
+
+ if ((dir = smbc_opendir(path)) < 0)
+ {
+ printf("Could not open directory [%s] (%d:%s)\n",
+ path, errno, strerror(errno));
+ return;
+ }
+
+ while ((dirent = smbc_readdir(dir)) != NULL)
+ {
+ printf("%*.*s%-30s", indent, indent, "", dirent->name);
+
+ switch(dirent->smbc_type)
+ {
+ case SMBC_WORKGROUP:
+ printf("WORKGROUP");
+ break;
- case SMBC_SERVER:
- printf("SERVER");
- break;
+ case SMBC_SERVER:
+ printf("SERVER");
+ break;
- case SMBC_FILE_SHARE:
- printf("FILE_SHARE");
- break;
+ case SMBC_FILE_SHARE:
+ printf("FILE_SHARE");
+ break;
- case SMBC_PRINTER_SHARE:
- printf("PRINTER_SHARE");
- break;
+ case SMBC_PRINTER_SHARE:
+ printf("PRINTER_SHARE");
+ break;
- case SMBC_COMMS_SHARE:
- printf("COMMS_SHARE");
- break;
+ case SMBC_COMMS_SHARE:
+ printf("COMMS_SHARE");
+ break;
- case SMBC_IPC_SHARE:
- printf("IPC_SHARE");
- break;
+ case SMBC_IPC_SHARE:
+ printf("IPC_SHARE");
+ break;
- case SMBC_DIR:
- printf("DIR");
- break;
+ case SMBC_DIR:
+ printf("DIR");
+ break;
- case SMBC_FILE:
- printf("FILE");
-
- q = buf + strlen(buf);
- strcat(q, "/");
- strcat(q+1, dirent->name);
- if (smbc_stat(buf, &stat) < 0)
- {
- printf(" unknown size (reason %d: %s)",
- errno, strerror(errno));
- }
- else
- {
- printf(" size %lu", (unsigned long) stat.st_size);
- }
- *p = '\0';
+ case SMBC_FILE:
+ printf("FILE");
- break;
-
- case SMBC_LINK:
- printf("LINK");
- break;
+ p = path + strlen(path);
+ strcat(p, "/");
+ strcat(p+1, dirent->name);
+ if (smbc_stat(path, &stat) < 0)
+ {
+ printf(" unknown size (reason %d: %s)",
+ errno, strerror(errno));
}
+ else
+ {
+ printf(" size %lu", (unsigned long) stat.st_size);
+ }
+ *p = '\0';
- printf("\n");
+ break;
+
+ case SMBC_LINK:
+ printf("LINK");
+ break;
}
- smbc_closedir(dir);
+ printf("\n");
+
+ if (scan &&
+ (dirent->smbc_type == SMBC_WORKGROUP ||
+ dirent->smbc_type == SMBC_SERVER))
+ {
+ /*
+ * don't append server name to workgroup; what we want is:
+ *
+ * smb://workgroup_name
+ * or
+ * smb://server_name
+ *
+ */
+ snprintf(buf, sizeof(buf), "smb://%s", dirent->name);
+ browse(buf, scan, indent + 2);
+ }
}
- exit(0);
+ smbc_closedir(dir);
}
+