⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chown.c

📁 操作系统源代码
💻 C
字号:
/* chown/chgrp - Change file ownership			Author: V. Archer *//* Copyright 1991 by Vincent Archer *	You may freely redistribute this software, in source or binary *	form, provided that you do not alter this copyright mention in any *	way. *//* Changed  3 Feb 93 by Kees J. Bot:  setuid execution nonsense removed. */#include <sys/types.h>#include <sys/stat.h>#include <ctype.h>#include <dirent.h>#include <pwd.h>#include <grp.h>#include <string.h>#include <limits.h>#include <errno.h>#include <stdlib.h>#include <unistd.h>#include <minix/minlib.h>#include <stdio.h>#ifndef S_ISLNK#define S_ISLNK(mode)	0#define lstat		stat#endif#define S_IUGID (S_ISUID|S_ISGID)/* Global variables, such as flags and path names */int gflag, oflag, rflag, error;char *pgmname, path[PATH_MAX + 1];uid_t nuid;gid_t ngid;_PROTOTYPE(int main, (int argc, char **argv));_PROTOTYPE(void do_chown, (char *file));_PROTOTYPE(void usage, (void));/* Main module. If chown(1) is invoked as chgrp(1), the behaviour is nearly * identical, except that the default when a single name is given as an * argument is to take a group id rather than an user id. This allow the * non-Posix "chgrp user:group file". * The single option switch used by chown/chgrp (-R) does not warrant a * call to the getopt stuff. The two others flags (-g, -u) are set from * the program name and arguments. */int main(argc, argv)int argc;char *argv[];{  char *id, *id2;  struct group *grp;  struct passwd *pwp;  if (pgmname = strrchr(*argv, '/'))	pgmname++;  else	pgmname = *argv;  argc--;  argv++;  gflag = strcmp(pgmname, "chgrp");  if (argc && **argv == '-' && argv[0][1] == 'R') {	argc--;	argv++;	rflag = 1;  }  if (argc < 2) usage();  id = *argv++;  argc--;  if (id2 = strchr(id, ':')) *id2++ = '\0';  if (!id2 && !gflag) {	id2 = id;	id = 0;  }  if (id) {	if (isdigit(*id))		nuid = atoi(id);	else {		if (!(pwp = getpwnam(id))) {			std_err(id);			std_err(": unknown user name\n");			exit(1);		}		nuid = pwp->pw_uid;	}	oflag = 1;  } else	oflag = 0;  if (id2) {	if (isdigit(*id2))		ngid = atoi(id2);	else {		if (!(grp = getgrnam(id2))) {			std_err(id2);			std_err(": unknown group name\n");			exit(1);		}		ngid = grp->gr_gid;	}	gflag = 1;  } else	gflag = 0;  error = 0;  while (argc--) do_chown(*argv++);  return(error);}/* Apply the user/group modification here. */void do_chown(file)char *file;{  DIR *dirp;  struct dirent *entp;  char *namp;  struct stat st;  if (lstat(file, &st)) {	perror(file);	error = 1;	return;  }  if (S_ISLNK(st.st_mode) && rflag) return;	/* Note: violates POSIX. */  if (chown(file, oflag ? nuid : st.st_uid, gflag ? ngid : st.st_gid)) {	perror(file);	error = 1;  }  if (S_ISDIR(st.st_mode) && rflag) {	if (!(dirp = opendir(file))) {		perror(file);		error = 1;		return;	}	if (path != file) strcpy(path, file);	namp = path + strlen(path);	*namp++ = '/';	while (entp = readdir(dirp))		if (entp->d_name[0] != '.' ||		    (entp->d_name[1] &&		     (entp->d_name[1] != '.' || entp->d_name[2]))) {			strcpy(namp, entp->d_name);			do_chown(path);		}	closedir(dirp);	*--namp = '\0';  }}/* Posix prototype of the chown/chgrp function */void usage(){  std_err("Usage: ");  std_err(pgmname);  std_err(gflag ? " owner[:group]" : " [owner:]group");  std_err(" file...\n");  exit(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -