GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* example-gtk+ application, ripped off from the gtk+ tree.c sample */
* workgroup type and return a path from there
*/
-static pstring path_string;
+static char *path_string;
-char *get_path(GtkWidget *item)
+char *get_path(TALLOC_CTX *ctx, GtkWidget *item)
{
GtkWidget *p = item;
struct tree_data *pd;
/* Find the parent and extract the data etc ... */
- p = GTK_WIDGET(p->parent);
+ p = GTK_WIDGET(p->parent);
p = GTK_WIDGET(GTK_TREE(p)->tree_owner);
pd = (struct tree_data *)gtk_object_get_user_data(GTK_OBJECT(p));
}
- /*
+ /*
* Got a list of comps now, should check that we did not hit a workgroup
* when we got other things as well ... Later
*
* Now, build the path
*/
- pstrcpy( path_string, "smb:/" );
+ TALLOC_FREE(path_string);
+ path_string = talloc_strdup(ctx, "smb:/");
- for (j = i - 1; j >= 0; j--) {
-
- strncat(path_string, "/", sizeof(path_string) - strlen(path_string));
- strncat(path_string, comps[j], sizeof(path_string) - strlen(path_string));
+ if (path_string) {
+ for (j = i - 1; j >= 0; j--) {
+ path_string = talloc_asprintf_append(path_string, "/%s", comps[j]);
+ }
+ }
+ if (path_string) {
+ fprintf(stdout, "Path string = %s\n", path_string);
}
-
- fprintf(stdout, "Path string = %s\n", path_string);
return path_string;
char dirbuf[512];
struct smbc_dirent *dirp;
struct stat st1;
- pstring path, path1;
+ char *path;
+ TALLOC_CTX *ctx = talloc_stackframe();
g_print ("select_child called for root tree %p, subtree %p, child %p\n",
root_tree, subtree, child);
/* Now, get the private data for the subtree */
- strncpy(path, get_path(child), 1024);
+ path = get_path(ctx, child);
+ if (!path) {
+ gtk_main_quit();
+ TALLOC_FREE(ctx);
+ return;
+ }
if ((dh = smbc_opendir(path)) < 0) { /* Handle error */
-
g_print("cb_select_child: Could not open dir %s, %s\n", path,
strerror(errno));
-
gtk_main_quit();
-
+ TALLOC_FREE(ctx);
return;
-
}
while ((err = smbc_getdents(dh, (struct smbc_dirent *)dirbuf,
sizeof(dirbuf))) != 0) {
-
if (err < 0) {
-
g_print("cb_select_child: Could not read dir %s, %s\n", path,
strerror(errno));
-
gtk_main_quit();
-
+ TALLOC_FREE(ctx);
return;
-
}
dirp = (struct smbc_dirent *)dirbuf;
if ((strcmp(dirp->name, ".") != 0) &&
(strcmp(dirp->name, "..") != 0)) {
+ char *path1;
- strncpy(path1, path, sizeof(path1));
- strncat(path1, "/", sizeof(path) - strlen(path));
- strncat(path1, dirp->name, sizeof(path) - strlen(path));
+ path1 = talloc_asprintf(ctx,
+ "%s/%s",
+ path,
+ dirp->name);
+ if (!path1) {
+ gtk_main_quit();
+ TALLOC_FREE(ctx);
+ return;
+ }
if (smbc_stat(path1, &st1) < 0) {
-
if (errno != EBUSY) {
-
- g_print("cb_select_child: Could not stat file %s, %s\n", path1,
+ g_print("cb_select_child: Could not stat file %s, %s\n", path1,
strerror(errno));
-
gtk_main_quit();
-
+ TALLOC_FREE(ctx);
return;
-
- }
- else {
-
+ } else {
strncpy(col2, "Device or resource busy", sizeof(col2));
-
}
}
else {
(st1.st_mode&S_IROTH?'r':'-'),
(st1.st_mode&S_IWOTH?'w':'-'),
(st1.st_mode&S_IXOTH?'x':'-'),
- st1.st_mode);
+ st1.st_mode);
snprintf(col3, sizeof(col3), "%u", st1.st_size);
snprintf(col4, sizeof(col4), "%s", ctime(&st1.st_mtime));
}
err -= dirlen;
}
-
}
-
+ TALLOC_FREE(ctx);
}
/* Note that this is never called */
gint i;
char dirbuf[512];
struct smbc_dirent *dirp;
+ TALLOC_CTX *frame = talloc_stackframe();
gtk_init (&argc, &argv);
/* Show the window and loop endlessly */
gtk_main();
+ TALLOC_FREE(frame);
return 0;
}
/* example-end */