Usage
plash usage: plash data [CMD1 [CMD2 ...]]
Description
Prints the location of the build data.
if arguments are given, these arguments will be execed insite the build data.
  Example
  
$ plash data
home/myuser/.plashdata
$ plash data ls
id_counter  index  layer  map  mnt  tmp
  Tested Behaviour
  
    
      #!/bin/sh
    
  
    
      
    
  
    
      set -eux
    
  
    
      
    
  
    
      • argument is executed
    
  
    
      test hi = "$(plash data printf "hi")"
    
  
    
      
    
  
    
      • argument is executed in plash data
    
  
    
      plash data ls | grep mnt
    
  
    
      plash data ls | grep tmp
    
  
    
      plash data ls | grep layer
    
  
    
      
    
  
    
      • argument is executed in directory returned by invocation with no arguments
    
  
    
      out1=$(plash data pwd)
    
  
    
      out2=$(plash data)
    
  
    
      test "$out1" = "$out2"
    
  
    
      
    
  
    
      • HOME influences the plash data
    
  
    
      test $(
    
  
    
      unset PLASH_DATA
    
  
    
      HOME=xx
    
  
    
      plash data
    
  
    
      ) = "xx/.plashdata"
    
  
    
      
    
  
    
      • PLASH_DATA is the plash data if set
    
  
    
      test $(PLASH_DATA=xx plash data) = xx
    
  
    
      
    
  
    
      
    
  
    
      • home directory in /etc/passwd is consulted as fallback
    
  
    
      homedir=$(getent passwd "$(id -u)" | cut -d: -f6)
    
  
    
      test "$(
    
  
    
      unset HOME
    
  
    
      unset PLASH_DATA
    
  
    
      plash data
    
  
    
      )" = "$homedir"/.plashdata
    
  
Source Code
#define USAGE "usage: plash usage: plash data [CMD1 [CMD2 ...]]\n"
#define _GNU_SOURCE
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <plash.h>
char *get_home_dir() {
  struct passwd *pwd;
  char *home_env;
  if (!(home_env = getenv("HOME"))) {
    pwd = getpwuid(getuid());
    if (!pwd)
      pl_fatal("could not determine your home directory");
    return pwd->pw_dir;
  }
  return home_env;
}
char *get_plash_data() {
  char *plash_data;
  if (!(plash_data = getenv("PLASH_DATA"))) {
    if (asprintf(&plash_data, "%s/.plashdata", get_home_dir()) == -1)
      pl_fatal("asprintf");
  }
  return plash_data;
}
int data_main(int argc, char *argv[]) {
  char *plash_data = get_plash_data();
  // if no arguments, print the plash data directory
  if (argc == 1) {
    puts(plash_data);
    return EXIT_SUCCESS;
  }
  // if arguments given, cd to plash data and exec the arguments
  if (chdir(plash_data) == -1)
    pl_fatal("chdir %s", plash_data);
  argv++;
  pl_unshare_user(); // because some files here might be from a subuid
                     // (different uid)
  execvp(argv[0], argv);
  pl_fatal("exec %s", argv[0]);
  return EXIT_FAILURE;
}