Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3045007 authored by Michael Bestas's avatar Michael Bestas
Browse files

Bring back file-based OTA edify functions

Author: Tom Marshall <tdm.code@gmail.com>
Date:   Wed Oct 25 20:27:08 2017 +0200

    Revert "kill package_extract_dir"

    changes for P:
     - bring back the mkdir_recursively variant which takes a timestamp.
     - add libziparchive dependency
     - fix otautil header paths

    changes for Q:
     - change ziputil naming convention to lowercase

    This reverts commit 53c38b15.

    Change-Id: I71c488e96a1f23aace3c38fc283aae0165129a12

Author: Tom Marshall <tdm.code@gmail.com>
Date:   Thu Dec 14 22:37:17 2017 +0100

    Revert "Remove the obsolete package_extract_dir() test"

    This reverts commit bb7e005a.

    Change-Id: I643235d6605d7da2a189eca10ec999b25c23e1f9

Author: Tom Marshall <tdm.code@gmail.com>
Date:   Wed Aug 23 18:14:00 2017 +0000

    Revert "updater: Remove some obsoleted functions for file-based OTA."

    This reverts commit 63d786cf.

    These functions will be used for third party OTA zips, so keep them.

    Change-Id: I24b67ba4c86f8f86d0a41429a395fece1a383efd

Author: Stricted <info@stricted.net>
Date:   Mon Mar 12 18:11:56 2018 +0100

    recovery: updater: Fix SymlinkFn args

    Change-Id: If2ba1b7a8b5ac471a2db84f352273fd0ea7c81a2

Author: Simon Shields <simon@lineageos.org>
Date:   Thu Aug 9 01:17:21 2018 +1000

    Revert "updater: Remove dead make_parents()."

    This reverts commit 59026917.

    Change-Id: I69eadf1a091f6ecd45531789dedf72a178a055ba

Author: Simon Shields <simon@lineageos.org>
Date:   Thu Aug 9 01:20:40 2018 +1000

    Revert "otautil: Delete dirUnlinkHierarchy()."

    changes for P:
     - Fix missing PATH_MAX macro from limits.h

    This reverts commit 7934985e.

    Change-Id: I67ce71a1644b58a393dce45a6c3dee97830b9ee4

Author: XiNGRZ <chenxingyu92@gmail.com>
Date:   Tue Dec 3 14:31:56 2019 +0800

    updater: Fix lost capabilities of set_metadata

    This was broken since Android O. During a file-based incremental OTA,
    capability flags were cleared but not being set again properly, leading
    some critical processes (e.g. surfaceflinger and pm-service) fails.

    For more details, see: https://android.googlesource.com/platform/system/core/+/65b8d749f71d7962831e87600dd6137566c3c281

    Change-Id: I20e616cd83ec1cd1b79717a6703919316ad77938

[mikeioannina]: Squash for Q and run through clang-format

[Chippa_a]: Adapt for Android R updater and libziparchive API

Change-Id: I91973bc9e9f8d100688c0112fda9043fd45eb86a
parent cba4db04
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include <string_view>
#include <vector>

struct selabel_handle;

// This class serves as the base to updater runtime. It wraps the runtime dependent functions; and
// updates on device and host simulations can have different implementations. e.g. block devices
// during host simulation merely a temporary file. With this class, the caller side in registered
@@ -74,4 +76,8 @@ class UpdaterRuntimeInterface {

  // On devices supports A/B, add current slot suffix to arg. Otherwise, return |arg| as is.
  virtual std::string AddSlotSuffix(const std::string_view arg) const = 0;

  virtual struct selabel_handle* sehandle() const {
    return nullptr;
  }
};
+2 −0
Original line number Diff line number Diff line
@@ -29,12 +29,14 @@ cc_library_static {
        "paths.cpp",
        "rangeset.cpp",
        "sysutil.cpp",
        "ziputil.cpp",
    ],

    shared_libs: [
        "libbase",
        "libcutils",
        "libselinux",
        "libziparchive",
    ],

    export_include_dirs: [
+62 −0
Original line number Diff line number Diff line
@@ -48,6 +48,11 @@ static DirStatus dir_status(const std::string& path) {

int mkdir_recursively(const std::string& input_path, mode_t mode, bool strip_filename,
                      const selabel_handle* sehnd) {
  return mkdir_recursively(input_path, mode, strip_filename, sehnd, NULL);
}

int mkdir_recursively(const std::string& input_path, mode_t mode, bool strip_filename,
                      const selabel_handle* sehnd, const struct utimbuf* timestamp) {
  // Check for an empty string before we bother making any syscalls.
  if (input_path.empty()) {
    errno = ENOENT;
@@ -104,6 +109,9 @@ int mkdir_recursively(const std::string& input_path, mode_t mode, bool strip_fil
        if (err != 0) {
          return -1;
        }
        if (timestamp != NULL && utime(dir_path.c_str(), timestamp)) {
          return -1;
        }
        break;
      }
      default:
@@ -114,3 +122,57 @@ int mkdir_recursively(const std::string& input_path, mode_t mode, bool strip_fil
  }
  return 0;
}

int dirUnlinkHierarchy(const char* path) {
  struct stat st;
  DIR* dir;
  struct dirent* de;
  int fail = 0;

  /* is it a file or directory? */
  if (lstat(path, &st) < 0) {
    return -1;
  }

  /* a file, so unlink it */
  if (!S_ISDIR(st.st_mode)) {
    return unlink(path);
  }

  /* a directory, so open handle */
  dir = opendir(path);
  if (dir == NULL) {
    return -1;
  }

  /* recurse over components */
  errno = 0;
  while ((de = readdir(dir)) != NULL) {
    // TODO: don't blow the stack
    char dn[PATH_MAX];
    if (!strcmp(de->d_name, "..") || !strcmp(de->d_name, ".")) {
      continue;
    }
    snprintf(dn, sizeof(dn), "%s/%s", path, de->d_name);
    if (dirUnlinkHierarchy(dn) < 0) {
      fail = 1;
      break;
    }
    errno = 0;
  }
  /* in case readdir or unlink_recursive failed */
  if (fail || errno < 0) {
    int save = errno;
    closedir(dir);
    errno = save;
    return -1;
  }

  /* close directory handle */
  if (closedir(dir) < 0) {
    return -1;
  }

  /* delete target directory */
  return rmdir(path);
}
+9 −0
Original line number Diff line number Diff line
@@ -17,7 +17,9 @@
#ifndef OTAUTIL_DIRUTIL_H_
#define OTAUTIL_DIRUTIL_H_

#include <limits.h>    // PATH_MAX
#include <sys/stat.h>  // mode_t
#include <utime.h>     // utime/utimbuf

#include <string>

@@ -36,4 +38,11 @@ struct selabel_handle;
int mkdir_recursively(const std::string& path, mode_t mode, bool strip_filename,
                      const struct selabel_handle* sehnd);

// As above, but if timestamp is non-NULL, directories will be timestamped accordingly.
int mkdir_recursively(const std::string& input_path, mode_t mode, bool strip_filename,
                      const selabel_handle* sehnd, const struct utimbuf* timestamp);

// rm -rf <path>
int dirUnlinkHierarchy(const char* path);

#endif  // OTAUTIL_DIRUTIL_H_
+57 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _OTAUTIL_ZIPUTIL_H
#define _OTAUTIL_ZIPUTIL_H

#include <utime.h>

#include <string>

#include <selinux/label.h>
#include <ziparchive/zip_archive.h>

/*
 * Inflate all files under zip_path to the directory specified by
 * dest_path, which must exist and be a writable directory. The zip_path
 * is allowed to be an empty string, in which case the whole package
 * will be extracted.
 *
 * Directory entries are not extracted.
 *
 * The immediate children of zip_path will become the immediate
 * children of dest_path; e.g., if the archive contains the entries
 *
 *     a/b/c/one
 *     a/b/c/two
 *     a/b/c/d/three
 *
 * and ExtractPackageRecursive(a, "a/b/c", "/tmp", ...) is called, the resulting
 * files will be
 *
 *     /tmp/one
 *     /tmp/two
 *     /tmp/d/three
 *
 * If timestamp is non-NULL, file timestamps will be set accordingly.
 *
 * Returns true on success, false on failure.
 */
bool ExtractPackageRecursive(ZipArchiveHandle zip, const std::string& zip_path,
                             const std::string& dest_path, const struct utimbuf* timestamp,
                             struct selabel_handle* sehnd);

#endif  // _OTAUTIL_ZIPUTIL_H
Loading