This commit is contained in:
parent
7b8d8db2da
commit
f3ddab578b
|
@ -0,0 +1,5 @@
|
||||||
|
include GNUmakerules
|
||||||
|
setperm:
|
||||||
|
clean:
|
||||||
|
rm setperm
|
||||||
|
install: $(BINDIR)/setperm
|
|
@ -0,0 +1,80 @@
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
char *cmnd;
|
||||||
|
|
||||||
|
void usage(void) {
|
||||||
|
fprintf(stderr, "Usage: %s -F protofile file ...\n", cmnd);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uid_t user;
|
||||||
|
gid_t group;
|
||||||
|
mode_t mode;
|
||||||
|
} perm_t;
|
||||||
|
|
||||||
|
int getperm(const char *filename, perm_t *permp) {
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
if (stat(filename, &sb) == -1) return -1;
|
||||||
|
permp->user = sb.st_uid;
|
||||||
|
permp->group = sb.st_gid;
|
||||||
|
permp->mode = sb.st_mode;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int setperm(const char *filename, perm_t perm) {
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (chown(filename, perm.user, perm.group) == -1) {
|
||||||
|
fprintf (stderr, "%s: cannot change owner of `%s' to %ld:%ld: %s\n",
|
||||||
|
cmnd, filename, (long)perm.user, (long)perm.group, strerror(errno));
|
||||||
|
rc = 1;
|
||||||
|
}
|
||||||
|
if (chmod(filename, perm.mode) == -1) {
|
||||||
|
fprintf (stderr, "%s: cannot change mode of %s to %lo: %s\n",
|
||||||
|
cmnd, filename, (unsigned long)perm.mode, strerror(errno));
|
||||||
|
rc = 1;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char **argv) {
|
||||||
|
int c;
|
||||||
|
perm_t perm;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
cmnd = argv[0];
|
||||||
|
|
||||||
|
while ((c = getopt(argc, argv, "o:g:m:F:R")) != EOF) {
|
||||||
|
switch (c) {
|
||||||
|
case 'o':
|
||||||
|
case 'p':
|
||||||
|
case 'm':
|
||||||
|
case 'R':
|
||||||
|
fprintf (stderr, "%s: option `%c' not yet implemented. Sorry\n", cmnd, c);
|
||||||
|
exit(1);
|
||||||
|
case 'F':
|
||||||
|
if (getperm (optarg, &perm) == -1) {
|
||||||
|
fprintf (stderr, "%s: cannot get permissions from %s: %s\n",
|
||||||
|
cmnd, optarg, strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
usage ();
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = optind; i < argc; i ++) {
|
||||||
|
setperm(argv[i], perm);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue