comparison lib/lib.c @ 553:75da5d793fc8

Unwind gratuitous macros.
author Rob Landley <rob@landley.net>
date Mon, 19 Mar 2012 20:56:18 -0500
parents 2548e6e590b2
children 997e016fbdf0
comparison
equal deleted inserted replaced
552:7b85b0a0e9c0 553:75da5d793fc8
897 } 897 }
898 898
899 899
900 /* mode parsing */ 900 /* mode parsing */
901 901
902 #define USR_FLAGS (S_IRWXU) 902 mode_t apply_mode(int who, int how, int what, mode_t base)
903 #define GRP_FLAGS (S_IRWXG) 903 {
904 #define OTH_FLAGS (S_IRWXO) 904 mode_t new_mode = 0, tmp_mode = 0, tmp_mask = 0;
905 #define SGT_FLAGS (S_ISUID | S_ISGID | S_ISVTX) 905
906 906 if (!who) tmp_mask = 07777;
907 #define MODE_WHAT(v, w, x, y, z) { \ 907 if (who & 0x01) { // u
908 if (x & v) \ 908 if (what & 0x01) tmp_mode |= S_IXUSR;
909 y |= S_I##w##z;\ 909 if (what & 0x02) tmp_mode |= S_IWUSR;
910 } 910 if (what & 0x04) tmp_mode |= S_IRUSR;
911 #define MODE_READ(x, y, z) MODE_WHAT(0x04, R, x, y, z) 911 if (what & 0x08) tmp_mode |= S_ISUID;
912 #define MODE_WRITE(x, y, z) MODE_WHAT(0x02, W, x, y, z) 912 tmp_mask |= S_IRWXU;
913 #define MODE_EXEC(x, y, z) MODE_WHAT(0x01, X, x, y, z) 913 }
914 #define MODE_SUID(x, y) MODE_WHAT(0x08, S, x, y, UID) 914 if (who & 0x02) { // g
915 #define MODE_SGID(x, y) MODE_WHAT(0x08, S, x, y, GID) 915 if (what & 0x01) tmp_mode |= S_IXGRP;
916 #define MODE_SVTX(x, y) MODE_WHAT(0x10, S, x, y, VTX) 916 if (what & 0x02) tmp_mode |= S_IWUSR;
917 917 if (what & 0x04) tmp_mode |= S_IRUSR;
918 mode_t 918 if (what & 0x08) tmp_mode |= S_ISGID;
919 apply_mode(int who, int how, int what, mode_t base) 919 tmp_mask |= S_IRWXG;
920 { 920 }
921 mode_t new_mode = 0; 921 if (who & 0x04) { // o
922 mode_t tmp_mode = 0; 922 if (what & 0x01) tmp_mode |= S_IXOTH;
923 mode_t tmp_mask = USR_FLAGS | GRP_FLAGS | OTH_FLAGS | SGT_FLAGS; 923 if (what & 0x02) tmp_mode |= S_IWOTH;
924 if (who & 0x01) { 924 if (what & 0x04) tmp_mode |= S_IROTH;
925 /* u */ 925 tmp_mask |= S_IRWXO;
926 MODE_READ(what, tmp_mode, USR);
927 MODE_WRITE(what, tmp_mode, USR);
928 MODE_EXEC(what, tmp_mode, USR);
929 MODE_SUID(what, tmp_mode)
930 tmp_mask &= (GRP_FLAGS | OTH_FLAGS | SGT_FLAGS);
931 }
932 if (who & 0x02) {
933 /* g */
934 MODE_READ(what, tmp_mode, GRP);
935 MODE_WRITE(what, tmp_mode, GRP);
936 MODE_EXEC(what, tmp_mode, GRP);
937 MODE_SGID(what, tmp_mode)
938 tmp_mask &= (USR_FLAGS | OTH_FLAGS | SGT_FLAGS);
939 }
940 if (who & 0x04) {
941 /* o */
942 MODE_READ(what, tmp_mode, OTH);
943 MODE_WRITE(what, tmp_mode, OTH);
944 MODE_EXEC(what, tmp_mode, OTH);
945 tmp_mask &= (USR_FLAGS | GRP_FLAGS | SGT_FLAGS);
946 } 926 }
947 /* check sticky */ 927 /* check sticky */
948 MODE_SVTX(what, tmp_mode); 928 if (what & 0x10) tmp_mode |= S_ISVTX;
949 switch (how){ 929
950 case 1: 930 if (how == 1) new_mode = tmp_mode | (base & tmp_mask);
951 /* set */ 931 else if (how == 2) new_mode = base | tmp_mode;
952 new_mode = tmp_mode | (base & tmp_mask); 932 else if (how == 3) new_mode = base & ~(tmp_mode);
953 break; 933
954 case 2:
955 /* add */
956 new_mode = base | tmp_mode;
957 break;
958 case 3:
959 /* remove */
960 new_mode = base & ~(tmp_mode);
961 break;
962 }
963 return new_mode; 934 return new_mode;
964 } 935 }
965 936
966 937
967 mode_t 938 mode_t string_to_mode(char *mode_str, mode_t base)
968 string_to_mode(char *mode_str, mode_t base)
969 { 939 {
970 mode_t new_mode; 940 mode_t new_mode;
971 int what = 0; 941 int what = 0;
972 int who = 0; 942 int who = 0;
973 int how = 0; 943 int how = 0;
975 long tmp; 945 long tmp;
976 if (!mode_str) 946 if (!mode_str)
977 return base; 947 return base;
978 if (isdigit(mode_str[0])) { 948 if (isdigit(mode_str[0])) {
979 tmp = strtol(mode_str, &p, 8); 949 tmp = strtol(mode_str, &p, 8);
980 if (*p || tmp < 0 || 950 if (*p || tmp < 0 || (tmp & ~(07777))) return base;
981 (tmp & ~(OTH_FLAGS | SGT_FLAGS | GRP_FLAGS | USR_FLAGS)))
982 return base;
983 new_mode = (mode_t) tmp; 951 new_mode = (mode_t) tmp;
984 return new_mode; 952 return new_mode;
985 } 953 }
986 new_mode = base; 954 new_mode = base;
987 while (*mode_str) { 955 while (*mode_str) {