Hex Artifact Content

Artifact ecb8eda1cfb32ecc98e1179b05573c51f91909fe:


0000: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
0010: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
0020: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
0030: 63 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74 2e  clude <sys/wait.
0040: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0050: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0060: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0070: 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23  ude <stdarg.h>.#
0080: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
0090: 3e 0a 0a 69 6e 74 20 72 75 6e 28 63 6f 6e 73 74  >..int run(const
00a0: 20 63 68 61 72 20 2a 70 61 74 68 2c 20 2e 2e 2e   char *path, ...
00b0: 29 20 7b 0a 09 76 61 5f 6c 69 73 74 20 61 70 3b  ) {..va_list ap;
00c0: 0a 09 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 09  ..char **argv;..
00d0: 69 6e 74 20 61 72 67 76 4d 61 78 2c 20 61 72 67  int argvMax, arg
00e0: 76 49 64 78 3b 0a 09 70 69 64 5f 74 20 70 69 64  vIdx;..pid_t pid
00f0: 3b 0a 09 69 6e 74 20 70 69 64 73 74 61 74 3b 0a  ;..int pidstat;.
0100: 0a 09 70 69 64 20 3d 20 66 6f 72 6b 28 29 3b 0a  ..pid = fork();.
0110: 09 69 66 20 28 70 69 64 20 3d 3d 20 28 28 70 69  .if (pid == ((pi
0120: 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 72 65  d_t) -1)) {...re
0130: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 09 0a 09  turn(-1);..}....
0140: 69 66 20 28 70 69 64 20 21 3d 20 30 29 20 7b 0a  if (pid != 0) {.
0150: 09 09 77 61 69 74 70 69 64 28 70 69 64 2c 20 26  ..waitpid(pid, &
0160: 70 69 64 73 74 61 74 2c 20 30 29 3b 0a 0a 09 09  pidstat, 0);....
0170: 72 65 74 75 72 6e 28 70 69 64 73 74 61 74 29 3b  return(pidstat);
0180: 0a 09 7d 0a 0a 09 61 72 67 76 4d 61 78 20 3d 20  ..}...argvMax = 
0190: 33 32 3b 0a 09 61 72 67 76 20 3d 20 6d 61 6c 6c  32;..argv = mall
01a0: 6f 63 28 73 69 7a 65 6f 66 28 2a 61 72 67 76 29  oc(sizeof(*argv)
01b0: 20 2a 20 61 72 67 76 4d 61 78 29 3b 0a 0a 09 76   * argvMax);...v
01c0: 61 5f 73 74 61 72 74 28 61 70 2c 20 70 61 74 68  a_start(ap, path
01d0: 29 3b 0a 0a 09 66 6f 72 20 28 61 72 67 76 49 64  );...for (argvId
01e0: 78 20 3d 20 30 3b 20 61 72 67 76 49 64 78 20 3c  x = 0; argvIdx <
01f0: 20 61 72 67 76 4d 61 78 3b 20 61 72 67 76 49 64   argvMax; argvId
0200: 78 2b 2b 29 20 7b 0a 09 09 61 72 67 76 5b 61 72  x++) {...argv[ar
0210: 67 76 49 64 78 5d 20 3d 20 76 61 5f 61 72 67 28  gvIdx] = va_arg(
0220: 61 70 2c 20 63 68 61 72 20 2a 29 3b 0a 09 09 69  ap, char *);...i
0230: 66 20 28 61 72 67 76 5b 61 72 67 76 49 64 78 5d  f (argv[argvIdx]
0240: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 62   == NULL) {....b
0250: 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 09 0a 09  reak;...}..}....
0260: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 0a 09 65 78  va_end(ap);...ex
0270: 65 63 76 28 70 61 74 68 2c 20 61 72 67 76 29 3b  ecv(path, argv);
0280: 0a 0a 09 65 78 69 74 28 45 58 49 54 5f 46 41 49  ...exit(EXIT_FAI
0290: 4c 55 52 45 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61  LURE);.}..int ma
02a0: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
02b0: 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 69 66 20  r **argv) {..if 
02c0: 28 61 63 63 65 73 73 28 22 2f 64 65 76 2f 66 75  (access("/dev/fu
02d0: 73 65 22 2c 20 46 5f 4f 4b 29 20 21 3d 20 30 29  se", F_OK) != 0)
02e0: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64   {...fprintf(std
02f0: 65 72 72 2c 20 22 54 68 69 73 20 63 6f 6e 74 61  err, "This conta
0300: 69 6e 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  iner needs to be
0310: 20 72 75 6e 20 61 73 3a 20 20 64 6f 63 6b 65 72   run as:  docker
0320: 20 72 75 6e 20 2d 2d 63 61 70 2d 61 64 64 20 53   run --cap-add S
0330: 59 53 5f 41 44 4d 49 4e 20 2d 2d 64 65 76 69 63  YS_ADMIN --devic
0340: 65 20 2f 64 65 76 2f 66 75 73 65 20 2e 2e 2e 5c  e /dev/fuse ...\
0350: 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  n");....return(1
0360: 29 3b 0a 09 7d 0a 0a 09 6d 6b 64 69 72 28 22 2f  );..}...mkdir("/
0370: 62 69 6e 22 2c 20 30 37 35 35 29 3b 0a 09 6d 6b  bin", 0755);..mk
0380: 64 69 72 28 22 2f 6f 70 74 22 2c 20 30 37 35 35  dir("/opt", 0755
0390: 29 3b 0a 09 6d 6b 64 69 72 28 22 2f 6f 70 74 2f  );..mkdir("/opt/
03a0: 61 70 70 66 73 22 2c 20 30 37 35 35 29 3b 0a 09  appfs", 0755);..
03b0: 6d 6b 64 69 72 28 22 2f 76 61 72 22 2c 20 30 37  mkdir("/var", 07
03c0: 35 35 29 3b 0a 09 6d 6b 64 69 72 28 22 2f 76 61  55);..mkdir("/va
03d0: 72 2f 63 61 63 68 65 22 2c 20 30 37 35 35 29 3b  r/cache", 0755);
03e0: 0a 09 6d 6b 64 69 72 28 22 2f 76 61 72 2f 63 61  ..mkdir("/var/ca
03f0: 63 68 65 2f 61 70 70 66 73 22 2c 20 30 37 35 35  che/appfs", 0755
0400: 29 3b 0a 09 72 75 6e 28 22 2f 62 69 6e 2f 61 70  );..run("/bin/ap
0410: 70 66 73 64 22 2c 20 22 61 70 70 66 73 64 22 2c  pfsd", "appfsd",
0420: 20 22 2f 76 61 72 2f 63 61 63 68 65 2f 61 70 70   "/var/cache/app
0430: 66 73 22 2c 20 22 2f 6f 70 74 2f 61 70 70 66 73  fs", "/opt/appfs
0440: 22 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 73 79 6d 6c  ", NULL);...syml
0450: 69 6e 6b 28 22 2e 22 2c 20 22 2f 75 73 72 22 29  ink(".", "/usr")
0460: 3b 0a 09 73 79 6d 6c 69 6e 6b 28 22 2f 6f 70 74  ;..symlink("/opt
0470: 2f 61 70 70 66 73 2f 63 6f 72 65 2e 61 70 70 66  /appfs/core.appf
0480: 73 2e 72 6b 65 65 6e 65 2e 6f 72 67 2f 62 61 73  s.rkeene.org/bas
0490: 68 2f 70 6c 61 74 66 6f 72 6d 2f 6c 61 74 65 73  h/platform/lates
04a0: 74 2f 62 69 6e 2f 62 61 73 68 22 2c 20 22 2f 62  t/bin/bash", "/b
04b0: 69 6e 2f 62 61 73 68 22 29 3b 0a 09 73 79 6d 6c  in/bash");..syml
04c0: 69 6e 6b 28 22 2f 6f 70 74 2f 61 70 70 66 73 2f  ink("/opt/appfs/
04d0: 63 6f 72 65 2e 61 70 70 66 73 2e 72 6b 65 65 6e  core.appfs.rkeen
04e0: 65 2e 6f 72 67 2f 63 6f 72 65 75 74 69 6c 73 2f  e.org/coreutils/
04f0: 70 6c 61 74 66 6f 72 6d 2f 6c 61 74 65 73 74 2f  platform/latest/
0500: 62 69 6e 2f 65 6e 76 22 2c 20 22 2f 62 69 6e 2f  bin/env", "/bin/
0510: 65 6e 76 22 29 3b 0a 0a 09 73 79 6d 6c 69 6e 6b  env");...symlink
0520: 28 22 2f 62 69 6e 2f 62 61 73 68 22 2c 20 22 2f  ("/bin/bash", "/
0530: 62 69 6e 2f 73 68 22 29 3b 0a 0a 09 73 65 74 65  bin/sh");...sete
0540: 6e 76 28 22 50 41 54 48 22 2c 20 22 2f 62 69 6e  nv("PATH", "/bin
0550: 3a 2f 6f 70 74 2f 61 70 70 66 73 2f 63 6f 72 65  :/opt/appfs/core
0560: 2e 61 70 70 66 73 2e 72 6b 65 65 6e 65 2e 6f 72  .appfs.rkeene.or
0570: 67 2f 63 6f 72 65 75 74 69 6c 73 2f 70 6c 61 74  g/coreutils/plat
0580: 66 6f 72 6d 2f 6c 61 74 65 73 74 2f 62 69 6e 22  form/latest/bin"
0590: 2c 20 31 29 3b 0a 09 72 75 6e 28 22 2f 62 69 6e  , 1);..run("/bin
05a0: 2f 61 70 70 66 73 2d 69 6e 73 74 61 6c 6c 2d 70  /appfs-install-p
05b0: 6b 67 22 2c 20 22 61 70 70 66 73 2d 69 6e 73 74  kg", "appfs-inst
05c0: 61 6c 6c 2d 70 6b 67 22 2c 20 22 63 6f 72 65 2e  all-pkg", "core.
05d0: 61 70 70 66 73 2e 72 6b 65 65 6e 65 2e 6f 72 67  appfs.rkeene.org
05e0: 22 2c 20 22 63 6f 72 65 75 74 69 6c 73 22 2c 20  ", "coreutils", 
05f0: 4e 55 4c 4c 29 3b 0a 09 73 65 74 65 6e 76 28 22  NULL);..setenv("
0600: 50 41 54 48 22 2c 20 22 2f 62 69 6e 22 2c 20 31  PATH", "/bin", 1
0610: 29 3b 0a 0a 09 69 66 20 28 61 72 67 63 20 3d 3d  );...if (argc ==
0620: 20 31 29 20 7b 0a 09 09 72 75 6e 28 22 2f 62 69   1) {...run("/bi
0630: 6e 2f 73 68 22 2c 20 22 73 68 22 2c 20 4e 55 4c  n/sh", "sh", NUL
0640: 4c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  L);..} else {...
0650: 61 72 67 76 2b 2b 3b 0a 09 09 65 78 65 63 76 70  argv++;...execvp
0660: 28 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 29 3b  (argv[0], argv);
0670: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ..}...return(0);
0680: 0a 7d 0a                                         .}.