Make sure we don't clobber the stack when response consists of the empty
[Samba/gebeck_regimport.git] / examples / libsmbclient / testsmbc.c
blob888a9c0d4f9e26fb23dced9088bc6eaf5e7be343
1 /*
2 Unix SMB/CIFS implementation.
3 SMB client library test program
4 Copyright (C) Andrew Tridgell 1998
5 Copyright (C) Richard Sharpe 2000
6 Copyright (C) John Terpsra 2000
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <stdio.h>
24 #include <errno.h>
25 #include <sys/time.h>
26 #include <string.h>
27 #include <unistd.h>
28 #include <stdlib.h>
29 #include <libsmbclient.h>
31 void auth_fn(const char *server, const char *share,
32 char *workgroup, int wgmaxlen, char *username, int unmaxlen,
33 char *password, int pwmaxlen)
35 char temp[128];
37 fprintf(stdout, "Need password for //%s/%s\n", server, share);
39 fprintf(stdout, "Enter workgroup: [%s] ", workgroup);
40 fgets(temp, sizeof(temp), stdin);
42 if (temp[strlen(temp) - 1] == 0x0a) /* A new line? */
43 temp[strlen(temp) - 1] = 0x00;
45 if (temp[0]) strncpy(workgroup, temp, wgmaxlen - 1);
47 fprintf(stdout, "Enter username: [%s] ", username);
48 fgets(temp, sizeof(temp), stdin);
50 if (temp[strlen(temp) - 1] == 0x0a) /* A new line? */
51 temp[strlen(temp) - 1] = 0x00;
53 if (temp[0]) strncpy(username, temp, unmaxlen - 1);
55 fprintf(stdout, "Enter password: [%s] ", password);
56 fgets(temp, sizeof(temp), stdin);
58 if (temp[strlen(temp) - 1] == 0x0a) /* A new line? */
59 temp[strlen(temp) - 1] = 0x00;
61 if (temp[0]) strncpy(password, temp, pwmaxlen - 1);
65 int global_id = 0;
67 void print_list_fn(struct print_job_info *pji)
70 fprintf(stdout, "Print job: ID: %u, Prio: %u, Size: %u, User: %s, Name: %s\n",
71 pji->id, pji->priority, pji->size, pji->user, pji->name);
73 global_id = pji->id;
77 int main(int argc, char *argv[])
79 int err, fd, dh1, dh2, dh3, dsize, dirc;
80 const char *file = "smb://samba/public/testfile.txt";
81 const char *file2 = "smb://samba/public/testfile2.txt";
82 char buff[256];
83 char dirbuf[512];
84 char *dirp;
85 struct stat st1, st2;
87 err = smbc_init(auth_fn, 10); /* Initialize things */
89 if (err < 0) {
91 fprintf(stderr, "Initializing the smbclient library ...: %s\n", strerror(errno));
95 if (argc > 1) {
97 if ((dh1 = smbc_opendir(argv[1]))<1) {
99 fprintf(stderr, "Could not open directory: %s: %s\n",
100 argv[1], strerror(errno));
102 exit(1);
106 fprintf(stdout, "Directory handles: %u, %u, %u\n", dh1, dh2, dh3);
108 /* Now, list those directories, but in funny ways ... */
110 dirp = (char *)dirbuf;
112 if ((dirc = smbc_getdents(dh1, (struct smbc_dirent *)dirp,
113 sizeof(dirbuf))) < 0) {
115 fprintf(stderr, "Problems getting directory entries: %s\n",
116 strerror(errno));
118 exit(1);
122 /* Now, process the list of names ... */
124 fprintf(stdout, "Directory listing, size = %u\n", dirc);
126 while (dirc > 0) {
128 dsize = ((struct smbc_dirent *)dirp)->dirlen;
129 fprintf(stdout, "Dir Ent, Type: %u, Name: %s, Comment: %s\n",
130 ((struct smbc_dirent *)dirp)->smbc_type,
131 ((struct smbc_dirent *)dirp)->name,
132 ((struct smbc_dirent *)dirp)->comment);
134 dirp += dsize;
135 (char *)dirc -= dsize;
139 dirp = (char *)dirbuf;
141 exit(1);
145 /* For now, open a file on a server that is hard coded ... later will
146 * read from the command line ...
149 fd = smbc_open(file, O_RDWR | O_CREAT | O_TRUNC, 0666);
151 if (fd < 0) {
153 fprintf(stderr, "Creating file: %s: %s\n", file, strerror(errno));
154 exit(0);
158 fprintf(stdout, "Opened or created file: %s\n", file);
160 /* Now, write some date to the file ... */
162 bzero(buff, sizeof(buff));
163 strcpy(buff, "Some test data for the moment ...");
165 err = smbc_write(fd, buff, sizeof(buff));
167 if (err < 0) {
169 fprintf(stderr, "writing file: %s: %s\n", file, strerror(errno));
170 exit(0);
174 fprintf(stdout, "Wrote %d bytes to file: %s\n", sizeof(buff), buff);
176 /* Now, seek the file back to offset 0 */
178 err = smbc_lseek(fd, SEEK_SET, 0);
180 if (err < 0) {
182 fprintf(stderr, "Seeking file: %s: %s\n", file, strerror(errno));
183 exit(0);
187 fprintf(stdout, "Completed lseek on file: %s\n", file);
189 /* Now, read the file contents back ... */
191 err = smbc_read(fd, buff, sizeof(buff));
193 if (err < 0) {
195 fprintf(stderr, "Reading file: %s: %s\n", file, strerror(errno));
196 exit(0);
200 fprintf(stdout, "Read file: %s\n", buff); /* Should check the contents */
202 fprintf(stdout, "Now fstat'ing file: %s\n", file);
204 err = smbc_fstat(fd, &st1);
206 if (err < 0) {
208 fprintf(stderr, "Fstat'ing file: %s: %s\n", file, strerror(errno));
209 exit(0);
214 /* Now, close the file ... */
216 err = smbc_close(fd);
218 if (err < 0) {
220 fprintf(stderr, "Closing file: %s: %s\n", file, strerror(errno));
224 /* Now, rename the file ... */
226 err = smbc_rename(file, file2);
228 if (err < 0) {
230 fprintf(stderr, "Renaming file: %s to %s: %s\n", file, file2, strerror(errno));
234 fprintf(stdout, "Renamed file %s to %s\n", file, file2);
236 /* Now, create a file and delete it ... */
238 fprintf(stdout, "Now, creating file: %s so we can delete it.\n", file);
240 fd = smbc_open(file, O_RDWR | O_CREAT, 0666);
242 if (fd < 0) {
244 fprintf(stderr, "Creating file: %s: %s\n", file, strerror(errno));
245 exit(0);
249 fprintf(stdout, "Opened or created file: %s\n", file);
251 err = smbc_close(fd);
253 if (err < 0) {
255 fprintf(stderr, "Closing file: %s: %s\n", file, strerror(errno));
256 exit(0);
260 /* Now, delete the file ... */
262 fprintf(stdout, "File %s created, now deleting ...\n", file);
264 err = smbc_unlink(file);
266 if (err < 0) {
268 fprintf(stderr, "Deleting file: %s: %s\n", file, strerror(errno));
269 exit(0);
273 /* Now, stat the file, file 2 ... */
275 fprintf(stdout, "Now stat'ing file: %s\n", file);
277 err = smbc_stat(file2, &st2);
279 if (err < 0) {
281 fprintf(stderr, "Stat'ing file: %s: %s\n", file, strerror(errno));
282 exit(0);
286 fprintf(stdout, "Stat'ed file: %s. Size = %d, mode = %04X\n", file2,
287 (int)st2.st_size, st2.st_mode);
288 fprintf(stdout, " time: %s\n", ctime(&st2.st_atime));
289 fprintf(stdout, "Earlier stat: %s, Size = %d, mode = %04X\n", file,
290 (int)st1.st_size, st1.st_mode);
291 fprintf(stdout, " time: %s\n", ctime(&st1.st_atime));
293 /* Now, make a directory ... */
295 fprintf(stdout, "Making directory smb://samba/public/make-dir\n");
297 if (smbc_mkdir("smb://samba/public/make-dir", 0666) < 0) {
299 fprintf(stderr, "Error making directory: smb://samba/public/make-dir: %s\n",
300 strerror(errno));
302 if (errno == EEXIST) { /* Try to delete the directory */
304 fprintf(stdout, "Trying to delete directory: smb://samba/public/make-dir\n");
306 if (smbc_rmdir("smb://samba/public/make-dir") < 0) { /* Error */
308 fprintf(stderr, "Error removing directory: smb://samba/public/make-dir: %s\n", strerror(errno));
310 exit(0);
314 fprintf(stdout, "Making directory: smb://samba/public/make-dir\n");
316 if (smbc_mkdir("smb://samba/public/make-dir", 666) < 0) {
318 fprintf(stderr, "Error making directory: smb://samba/public/make-dir: %s\n",
319 strerror(errno));
321 fprintf(stderr, "I give up!\n");
323 exit(1);
329 exit(0);
333 fprintf(stdout, "Made dir: make-dir\n");
334 return 0;