Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/source3/libsmb/libsmb_dir.c

    r414 r745  
    2424
    2525#include "includes.h"
     26#include "libsmb/libsmb.h"
     27#include "popt_common.h"
    2628#include "libsmbclient.h"
    2729#include "libsmb_internal.h"
    28 #include "../librpc/gen_ndr/cli_srvsvc.h"
     30#include "rpc_client/cli_pipe.h"
     31#include "../librpc/gen_ndr/ndr_srvsvc_c.h"
     32#include "libsmb/nmblib.h"
    2933
    3034/*
     
    147151
    148152        if (add_dirent(dir, name, comment, dirent_type) < 0) {
    149 
    150153                /* An error occurred, what do we do? */
    151154                /* FIXME: Add some code here */
     155                /* Change cli_NetServerEnum to take a fn
     156                   returning NTSTATUS... JRA. */
    152157        }
    153158
     
    227232
    228233        if (add_dirent(dir, name, comment, dirent_type) < 0) {
    229 
    230234                /* An error occurred, what do we do? */
    231235                /* FIXME: Add some code here */
    232 
    233         }
    234 }
    235 
    236 static void
     236                /* Change cli_NetServerEnum to take a fn
     237                   returning NTSTATUS... JRA. */
     238        }
     239}
     240
     241static NTSTATUS
    237242dir_list_fn(const char *mnt,
    238             file_info *finfo,
     243            struct file_info *finfo,
    239244            const char *mask,
    240245            void *state)
     
    242247
    243248        if (add_dirent((SMBCFILE *)state, finfo->name, "",
    244                        (finfo->mode&aDIR?SMBC_DIR:SMBC_FILE)) < 0) {
    245 
    246                 /* Handle an error ... */
    247 
    248                 /* FIXME: Add some code ... */
    249 
    250         }
    251 
     249                       (finfo->mode&FILE_ATTRIBUTE_DIRECTORY?SMBC_DIR:SMBC_FILE)) < 0) {
     250                SMBCFILE *dir = (SMBCFILE *)state;
     251                return map_nt_error_from_unix(dir->dir_error);
     252        }
     253        return NT_STATUS_OK;
    252254}
    253255
     
    272274        uint32_t resume_handle = 0;
    273275        uint32_t total_entries = 0;
     276        struct dcerpc_binding_handle *b;
    274277
    275278        /* Open the server service pipe */
     
    287290        info_ctr.ctr.ctr1 = &ctr1;
    288291
     292        b = pipe_hnd->binding_handle;
     293
    289294        /* Issue the NetShareEnum RPC call and retrieve the response */
    290         nt_status = rpccli_srvsvc_NetShareEnumAll(pipe_hnd, talloc_tos(),
     295        nt_status = dcerpc_srvsvc_NetShareEnumAll(b, talloc_tos(),
    291296                                                  pipe_hnd->desthost,
    292297                                                  &info_ctr,
     
    297302
    298303        /* Was it successful? */
    299         if (!NT_STATUS_IS_OK(nt_status) || !W_ERROR_IS_OK(result) ||
    300             total_entries == 0) {
     304        if (!NT_STATUS_IS_OK(nt_status)) {
     305                /*  Nope.  Go clean up. */
     306                result = ntstatus_to_werror(nt_status);
     307                goto done;
     308        }
     309
     310        if (!W_ERROR_IS_OK(result)) {
    301311                /*  Nope.  Go clean up. */
    302312                goto done;
    303313        }
     314
     315        if (total_entries == 0) {
     316                /*  Nope.  Go clean up. */
     317                result = WERR_GENERAL_FAILURE;
     318                goto done;
     319        }
    304320
    305321        /* For each returned entry... */
     
    370386        if (!context || !context->internal->initialized) {
    371387                DEBUG(4, ("no valid context\n"));
     388                TALLOC_FREE(frame);
    372389                errno = EINVAL + 8192;
    373                 TALLOC_FREE(frame);
    374390                return NULL;
    375391
     
    378394        if (!fname) {
    379395                DEBUG(4, ("no valid fname\n"));
     396                TALLOC_FREE(frame);
    380397                errno = EINVAL + 8193;
    381                 TALLOC_FREE(frame);
    382398                return NULL;
    383399        }
     
    394410                            &options)) {
    395411                DEBUG(4, ("no valid path\n"));
     412                TALLOC_FREE(frame);
    396413                errno = EINVAL + 8194;
    397                 TALLOC_FREE(frame);
    398414                return NULL;
    399415        }
     
    406422        if (SMBC_check_options(server, share, path, options)) {
    407423                DEBUG(4, ("unacceptable options (%s)\n", options));
     424                TALLOC_FREE(frame);
    408425                errno = EINVAL + 8195;
    409                 TALLOC_FREE(frame);
    410426                return NULL;
    411427        }
     
    414430                user = talloc_strdup(frame, smbc_getUser(context));
    415431                if (!user) {
     432                        TALLOC_FREE(frame);
    416433                        errno = ENOMEM;
    417                         TALLOC_FREE(frame);
    418434                        return NULL;
    419435                }
     
    423439
    424440        if (!dir) {
     441                TALLOC_FREE(frame);
    425442                errno = ENOMEM;
    426                 TALLOC_FREE(frame);
    427443                return NULL;
    428444        }
     
    442458                int count;
    443459                int max_lmb_count;
    444                 struct ip_service *ip_list;
    445                 struct ip_service server_addr;
     460                struct sockaddr_storage *ip_list;
     461                struct sockaddr_storage server_addr;
    446462                struct user_auth_info u_info;
     463                NTSTATUS status;
    447464
    448465                if (share[0] != (char)0 || path[0] != (char)0) {
    449466
    450                         errno = EINVAL + 8196;
    451467                        if (dir) {
    452468                                SAFE_FREE(dir->fname);
     
    454470                        }
    455471                        TALLOC_FREE(frame);
     472                        errno = EINVAL + 8196;
    456473                        return NULL;
    457474                }
     
    484501
    485502                ip_list = NULL;
    486                 if (!NT_STATUS_IS_OK(name_resolve_bcast(MSBROWSE, 1, &ip_list,
    487                                                         &count)))
     503                status = name_resolve_bcast(MSBROWSE, 1, talloc_tos(),
     504                                            &ip_list, &count);
     505                if (!NT_STATUS_IS_OK(status))
    488506                {
    489507
    490                         SAFE_FREE(ip_list);
    491 
    492                         if (!find_master_ip(workgroup, &server_addr.ss)) {
     508                        TALLOC_FREE(ip_list);
     509
     510                        if (!find_master_ip(workgroup, &server_addr)) {
    493511
    494512                                if (dir) {
     
    496514                                        SAFE_FREE(dir);
    497515                                }
     516                                TALLOC_FREE(frame);
    498517                                errno = ENOENT;
    499                                 TALLOC_FREE(frame);
    500518                                return NULL;
    501519                        }
    502520
    503                         ip_list = (struct ip_service *)memdup(
    504                                 &server_addr, sizeof(server_addr));
     521                        ip_list = (struct sockaddr_storage *)talloc_memdup(
     522                                talloc_tos(), &server_addr,
     523                                sizeof(server_addr));
    505524                        if (ip_list == NULL) {
     525                                if (dir) {
     526                                        SAFE_FREE(dir->fname);
     527                                        SAFE_FREE(dir);
     528                                }
     529                                TALLOC_FREE(frame);
    506530                                errno = ENOMEM;
    507                                 TALLOC_FREE(frame);
    508531                                return NULL;
    509532                        }
     
    516539                        struct cli_state *cli = NULL;
    517540
    518                         print_sockaddr(addr, sizeof(addr), &ip_list[i].ss);
     541                        print_sockaddr(addr, sizeof(addr), &ip_list[i]);
    519542                        DEBUG(99, ("Found master browser %d of %d: %s\n",
    520543                                   i+1, MAX(count, max_lmb_count),
     
    537560
    538561                        if (!workgroup || !server) {
     562                                if (dir) {
     563                                        SAFE_FREE(dir->fname);
     564                                        SAFE_FREE(dir);
     565                                }
     566                                TALLOC_FREE(frame);
    539567                                errno = ENOMEM;
    540                                 TALLOC_FREE(frame);
    541568                                return NULL;
    542569                        }
     
    572599                }
    573600
    574                 SAFE_FREE(ip_list);
     601                TALLOC_FREE(ip_list);
    575602        } else {
    576603                /*
     
    582609
    583610                                /* Should not have empty share with path */
    584                                 errno = EINVAL + 8197;
    585611                                if (dir) {
    586612                                        SAFE_FREE(dir->fname);
     
    588614                                }
    589615                                TALLOC_FREE(frame);
     616                                errno = EINVAL + 8197;
    590617                                return NULL;
    591618
     
    645672                                                SAFE_FREE(dir);
    646673                                        }
     674                                        TALLOC_FREE(frame);
    647675                                        errno = EPERM;
    648                                         TALLOC_FREE(frame);
    649676                                        return NULL;
    650677
     
    749776                        char *targetpath;
    750777                        struct cli_state *targetcli;
     778                        NTSTATUS status;
    751779
    752780                        /* We connect to the server and list the directory */
     
    792820                        }
    793821
    794                         if (cli_list(targetcli, targetpath,
    795                                      aDIR | aSYSTEM | aHIDDEN,
    796                                      dir_list_fn, (void *)dir) < 0) {
    797 
     822                        status = cli_list(targetcli, targetpath,
     823                                          FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN,
     824                                          dir_list_fn, (void *)dir);
     825                        if (!NT_STATUS_IS_OK(status)) {
    798826                                if (dir) {
    799827                                        SAFE_FREE(dir->fname);
     
    845873                                }
    846874
     875                                TALLOC_FREE(frame);
    847876                                errno = saved_errno;
    848                                 TALLOC_FREE(frame);
    849877                                return NULL;
    850878                        }
     
    10491077        while ((dirlist = dir->dir_next)) {
    10501078                struct smbc_dirent *dirent;
     1079                struct smbc_dirent *currentEntry = (struct smbc_dirent *)ndir;
    10511080
    10521081                if (!dirlist->dirent) {
     
    10851114                }
    10861115
    1087                 memcpy(ndir, dirent, reqd); /* Copy the data in ... */
    1088 
    1089                 ((struct smbc_dirent *)ndir)->comment =
    1090                         (char *)(&((struct smbc_dirent *)ndir)->name +
    1091                                  dirent->namelen +
    1092                                  1);
     1116                memcpy(currentEntry, dirent, reqd); /* Copy the data in ... */
     1117
     1118                currentEntry->comment = &currentEntry->name[0] +
     1119                                                dirent->namelen + 1;
    10931120
    10941121                ndir += reqd;
    1095 
    10961122                rem -= reqd;
     1123
     1124                /* Try and align the struct for the next entry
     1125                   on a valid pointer boundary by appending zeros */
     1126                while((rem > 0) && ((unsigned long long)ndir & (sizeof(void*) - 1))) {
     1127                        *ndir = '\0';
     1128                        rem--;
     1129                        ndir++;
     1130                        currentEntry->dirlen++;
     1131                }
    10971132
    10981133                dir->dir_next = dirlist = dirlist -> next;
     
    12031238 */
    12041239
    1205 static void
     1240static NTSTATUS
    12061241rmdir_list_fn(const char *mnt,
    1207               file_info *finfo,
     1242              struct file_info *finfo,
    12081243              const char *mask,
    12091244              void *state)
     
    12141249                *smbc_rmdir_dirempty = false;
    12151250        }
     1251        return NT_STATUS_OK;
    12161252}
    12171253
     
    13031339                        char *lpath;
    13041340                        bool smbc_rmdir_dirempty = true;
     1341                        NTSTATUS status;
    13051342
    13061343                        lpath = talloc_asprintf(frame, "%s\\*",
     
    13121349                        }
    13131350
    1314                         if (cli_list(targetcli, lpath,
    1315                                      aDIR | aSYSTEM | aHIDDEN,
    1316                                      rmdir_list_fn,
    1317                                      &smbc_rmdir_dirempty) < 0) {
    1318 
     1351                        status = cli_list(targetcli, lpath,
     1352                                          FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN,
     1353                                          rmdir_list_fn,
     1354                                          &smbc_rmdir_dirempty);
     1355
     1356                        if (!NT_STATUS_IS_OK(status)) {
    13191357                                /* Fix errno to ignore latest error ... */
    13201358                                DEBUG(5, ("smbc_rmdir: "
     
    15781616        mode = 0;
    15791617
    1580         if (!(newmode & (S_IWUSR | S_IWGRP | S_IWOTH))) mode |= aRONLY;
    1581         if ((newmode & S_IXUSR) && lp_map_archive(-1)) mode |= aARCH;
    1582         if ((newmode & S_IXGRP) && lp_map_system(-1)) mode |= aSYSTEM;
    1583         if ((newmode & S_IXOTH) && lp_map_hidden(-1)) mode |= aHIDDEN;
     1618        if (!(newmode & (S_IWUSR | S_IWGRP | S_IWOTH))) mode |= FILE_ATTRIBUTE_READONLY;
     1619        if ((newmode & S_IXUSR) && lp_map_archive(-1)) mode |= FILE_ATTRIBUTE_ARCHIVE;
     1620        if ((newmode & S_IXGRP) && lp_map_system(-1)) mode |= FILE_ATTRIBUTE_SYSTEM;
     1621        if ((newmode & S_IXOTH) && lp_map_hidden(-1)) mode |= FILE_ATTRIBUTE_HIDDEN;
    15841622
    15851623        if (!NT_STATUS_IS_OK(cli_setatr(targetcli, targetpath, mode, 0))) {
     
    17701808        /*d_printf(">>>unlink: resolved path as %s\n", targetpath);*/
    17711809
    1772         if (!NT_STATUS_IS_OK(cli_unlink(targetcli, targetpath, aSYSTEM | aHIDDEN))) {
     1810        if (!NT_STATUS_IS_OK(cli_unlink(targetcli, targetpath, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN))) {
    17731811
    17741812                errno = SMBC_errno(context, targetcli);
     
    19762014
    19772015                if (eno != EEXIST ||
    1978                     !NT_STATUS_IS_OK(cli_unlink(targetcli1, targetpath2, aSYSTEM | aHIDDEN)) ||
     2016                    !NT_STATUS_IS_OK(cli_unlink(targetcli1, targetpath2, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN)) ||
    19792017                    !NT_STATUS_IS_OK(cli_rename(targetcli1, targetpath1, targetpath2))) {
    19802018
Note: See TracChangeset for help on using the changeset viewer.