1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <errno.h> 5#include <unistd.h> 6#include <libsmbclient.h> 7 8#define MAX_BUFF_SIZE 255 9char g_workgroup[MAX_BUFF_SIZE]; 10char g_username[MAX_BUFF_SIZE]; 11char g_password[MAX_BUFF_SIZE]; 12char g_server[MAX_BUFF_SIZE]; 13char g_share[MAX_BUFF_SIZE]; 14 15 16void auth_fn(const char *server, const char *share, char *workgroup, int wgmaxlen, 17 char *username, int unmaxlen, char *password, int pwmaxlen) 18{ 19 20 strncpy(workgroup, g_workgroup, wgmaxlen - 1); 21 22 strncpy(username, g_username, unmaxlen - 1); 23 24 strncpy(password, g_password, pwmaxlen - 1); 25 26 strcpy(g_server, server); 27 strcpy(g_share, share); 28 29} 30 31int main(int argc, char** argv) 32{ 33 int err = -1; 34 char url[MAX_BUFF_SIZE]; 35 struct stat st; 36 char *user; 37 SMBCCTX *ctx; 38 39 bzero(g_workgroup,MAX_BUFF_SIZE); 40 bzero(url,MAX_BUFF_SIZE); 41 42 if ( argc == 2) 43 { 44 char *p; 45 user = getenv("USER"); 46 if (!user) { 47 printf("no user??\n"); 48 return 0; 49 } 50 51 printf("username: %s\n", user); 52 53 p = strchr(user, '\\'); 54 if (! p) { 55 printf("BAD username??\n"); 56 return 0; 57 } 58 strncpy(g_workgroup, user, strlen(user)); 59 g_workgroup[p - user] = 0; 60 strncpy(g_username, p + 1, strlen(p + 1)); 61 memset(g_password, 0, sizeof(char) * MAX_BUFF_SIZE); 62 strncpy(url,argv[1],strlen(argv[1])); 63 64 err = smbc_init(auth_fn, 10); 65 if (err) { 66 printf("init smbclient context failed!!\n"); 67 return err; 68 } 69 /* Using null context actually get the old context. */ 70 ctx = smbc_set_context(NULL); 71 smbc_setOptionUseKerberos(ctx, 1); 72 smbc_setOptionFallbackAfterKerberos(ctx, 1); 73 smbc_setWorkgroup(ctx, g_workgroup); 74 smbc_setUser(ctx, g_username); 75 err = smbc_stat(url, &st); 76 77 if ( err < 0 ) { 78 err = 1; 79 printf("stat failed!!\n"); 80 } 81 else { 82 err = 0; 83 printf("stat succeeded!!\n"); 84 } 85 86 87 } 88 89 return err; 90 91} 92