github.com/chipaca/snappy@v0.0.0-20210104084008-1f06296fe8ad/cmd/snap-confine/cookie-support.c (about)

     1  /*
     2   * Copyright (C) 2017 Canonical Ltd
     3   *
     4   * This program is free software: you can redistribute it and/or modify
     5   * it under the terms of the GNU General Public License version 3 as
     6   * published by the Free Software Foundation.
     7   *
     8   * This program is distributed in the hope that it will be useful,
     9   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11   * GNU General Public License for more details.
    12   *
    13   * You should have received a copy of the GNU General Public License
    14   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15   *
    16   */
    17  
    18  #include "cookie-support.h"
    19  
    20  #include "../libsnap-confine-private/cleanup-funcs.h"
    21  #include "../libsnap-confine-private/string-utils.h"
    22  #include "../libsnap-confine-private/utils.h"
    23  
    24  #include "config.h"
    25  
    26  #include <errno.h>
    27  #include <fcntl.h>
    28  #include <string.h>
    29  #include <sys/types.h>
    30  #include <sys/stat.h>
    31  #include <unistd.h>
    32  
    33  #define SC_COOKIE_DIR "/var/lib/snapd/cookie"
    34  
    35  /**
    36   * Effective value of SC_COOKIE_DIR
    37   **/
    38  static const char *sc_cookie_dir = SC_COOKIE_DIR;
    39  
    40  char *sc_cookie_get_from_snapd(const char *snap_name, struct sc_error **errorp)
    41  {
    42  	char context_path[PATH_MAX] = { 0 };
    43  	struct sc_error *err = NULL;
    44  	char *context = NULL;
    45  
    46  	sc_must_snprintf(context_path, sizeof(context_path), "%s/snap.%s",
    47  			 sc_cookie_dir, snap_name);
    48  	int fd SC_CLEANUP(sc_cleanup_close) = -1;
    49  	fd = open(context_path, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
    50  	if (fd < 0) {
    51  		err =
    52  		    sc_error_init_from_errno(errno,
    53  					     "warning: cannot open cookie file %s",
    54  					     context_path);
    55  		goto out;
    56  	}
    57  	// large enough buffer for opaque cookie string
    58  	char context_val[255] = { 0 };
    59  	ssize_t n = read(fd, context_val, sizeof(context_val) - 1);
    60  	if (n < 0) {
    61  		err =
    62  		    sc_error_init_from_errno(errno,
    63  					     "cannot read cookie file %s",
    64  					     context_path);
    65  		goto out;
    66  	}
    67  	context = strndup(context_val, n);
    68  	if (context == NULL) {
    69  		die("cannot duplicate snap cookie value");
    70  	}
    71  
    72   out:
    73  	sc_error_forward(errorp, err);
    74  	return context;
    75  }