mesg和biff命令的是实现(最后一篇博客了,从此不在写了)

mesg程序实际上就是用来查看和设置终端的组的写权限,而biff用来查看和设置终端的用户的执行权限。这两个位分别为S_IXUSR,S_IWGRP,我的实现是用stat获取mode,然后调用chmod修改mode,我实现的这两个程序的代码基本一样,只有一处不一样,mesg中#define MC_BIT S_IWGRP而biff中#define MC_BIT S_IXUSR。另外,biff和mail一组,mesg和write一组,另外本人的write并没有检验S_IWGRP位,但本人也不想改写了。另外由于代码极其简单,所以注释就没写(本人一直就坚持一眼能看清的代码不写注释,可是似乎写了博客后就去写冗杂的注释了),最后吐槽一下,用代码来学习系统的办法似乎博客园没人喜欢的说,既然大家不喜欢我也不再去写了,毕竟去实现已经实现很好的程序不是什么好的做法(除非为了学习和兴趣)。

程序作者:莫尘/mc_nns; 程序开源,可任意使用和修改

 两个命令的代码是一样的,把mesg中的define MC_BIT S_IWGRP替换为#define MC_BIT S_IXUSR就成了biff命令了

mesg的代码如下:

 1 #include    <unistd.h>

 2 #include    <sys/stat.h>

 3 #include    <stdio.h>

 4 #include    <errno.h>

 5 #include    <string.h>

 6 #include    <stdlib.h>

 7 

 8 #define MC_BIT    S_IWGRP

 9 

10 static char    *mc_prog_name;

11 

12 static void    mc_usage(void);

13 

14 int

15 main(int argc, char *argv[])

16 {

17     struct stat    st;

18     char    *p;

19     char    *tty;

20 

21     mc_prog_name = (p = strchr(*argv, '/')) ? ++p : *argv;

22     tty = ttyname(STDERR_FILENO);

23     if(tty == NULL){

24         fprintf(stderr, "%s: stderr is not a tty - where are you?\n",

25             mc_prog_name);

26         exit(1);

27     }

28     if(stat(tty, &st) == -1){

29         fprintf(stderr, "%s: cannot stat '%s': %s\n",

30             mc_prog_name, tty, strerror(errno));

31         exit(1);

32     }

33     if(argc == 1){

34         if(st.st_mode & MC_BIT)

35             printf("is y\n");

36         else

37             printf("is n\n");

38         return 0;

39     }

40     switch(argv[1][0]){

41     case 'y':

42         if(chmod(tty, st.st_mode | MC_BIT) == -1)

43             fprintf(stderr, "%s: cannot set '%s': %s\n",

44                 mc_prog_name, tty, strerror(errno));

45         break;

46     case 'n':

47         if(chmod(tty, st.st_mode & ~MC_BIT) == -1)

48             fprintf(stderr, "%s: cannot set '%s': %s\n",

49                 mc_prog_name, tty, strerror(errno));

50         break;

51     default:

52         mc_usage();

53     }

54     return 0;    

55 }    

56         

57 static void

58 mc_usage(void)

59 {

60     fprintf(stderr, "Usage: %s [y|n]\n", mc_prog_name);

61     exit(1);

62 }

 

你可能感兴趣的:(命令)