summaryrefslogtreecommitdiff
path: root/tests/t3310-flags.sh
blob: f2001c5aece916396bd28db8f954b0152d5ac6be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/sh
# Exercise partition flags.

# Copyright (C) 2010-2014, 2019-2022 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

. "${srcdir=.}/init.sh"; path_prepend_ ../parted .
ss=$sector_size_
dev=dev-file

extract_flags()
{
  perl -nle '/^[^:]*:4096s:6143s:2048s::[^:]*:(.+);$/ and print $1' "$@"
}

for table_type in aix amiga atari bsd dvh gpt mac msdos pc98 sun loop; do
  ptn_num=1

  case $table_type in
    aix)   # Support for writing AIX disk labels and adding partitions
           # is not yet implemented.
           continue
           ;;
    amiga) primary_or_name='PTNNAME'
           ;;
    atari)  primary_or_name='primary'
           # atari only supports 512b sectors
           [ $ss -ne 512 ] && continue
           ;;
    bsd)   primary_or_name=''
           ;;
    dvh)   primary_or_name='primary'
           ;;
    gpt)   primary_or_name='PTNNAME'
           ;;
    mac)   primary_or_name='PTNNAME'
           # MAC table has the partition map partition as the first
           # partition so the created test partition will be number 2.
           ptn_num=2
           ;;
    msdos) primary_or_name='primary'
           ;;
    pc98)  primary_or_name='PTNNAME'
           # pc98 only supports 512b sectors
           [ $ss -ne 512 ] && continue
           ;;
    sun)   primary_or_name=''
           ;;
    loop)  # LOOP table doesn't support creation of a partition nor any
           # flags.
           continue
           ;;
  esac

  n_sectors=8192
  dd if=/dev/null of=$dev bs=$ss seek=$n_sectors || fail=1

  parted -s $dev mklabel $table_type \
    mkpart $primary_or_name ext2 $((4*1024))s $((6*1024-1))s \
      > out 2> err || fail=1
  compare /dev/null out || fail=1

  # Query libparted for the available flags for this test partition.
  flags=`print-flags $dev $ptn_num` \
    || { warn_ "$ME_: $table_type: failed to get available flags";
         fail=1; continue; }
  case $table_type in
    dvh)   # FIXME: Exclude boot flag as that can only be set on logical
           # partitions in the DVH disk label and this test only uses
           # primary partitions.
           flags=`echo "$flags" | egrep -v 'boot'`
           ;;
    mac)   # FIXME: Setting root or swap flags also sets the partition
           # name to root or swap respectively.  Probably intended
           # behaviour.  Setting lvm or raid flags after root or swap
           # takes two goes to clear the lvm or raid flag.  Is this
           # intended?  For now don't test lvm or raid flags as this
           # test only tries to clear the flags once which causes this
           # test to fail.
           flags=`echo "$flags" | egrep -v 'lvm|raid'`
           ;;
  esac

  for mode in on_only on_and_off ; do
    for flag in $flags; do
      # Turn on each flag, one at a time.
      parted -m -s $dev set $ptn_num $flag on unit s print > raw 2> err || fail=1
      extract_flags raw > out
      grep -w "$flag" out \
        || { warn_ "$ME_: $table_type: flag '$flag' not turned on: $(cat out)"; fail=1; }
      compare /dev/null err || fail=1

      if test $mode = on_and_off; then
        # Turn it off
        parted -m -s $dev set $ptn_num $flag off unit s print > raw 2> err || fail=1
        extract_flags raw > out
        grep -w "$flag" out \
          && { warn_ "$ME_: $table_type: flag '$flag' not turned off: $(cat out)"; fail=1; }
        compare /dev/null err || fail=1
      fi
    done
  done
done

# loop filesystems support no flags.  Make sure this doesn't crash

if [ $ss = 512 ]; then
   # only test on 512 byte ss since mke2fs assumes this on a file
   truncate -s 5m img || framework_failure
   mke2fs img || framework_failure
   echo Error: No flags supported > out.exp
   parted -s img set 1 foo on > out 2>&1
   compare out.exp out || fail=1
   parted -s img disk_set foo on > out 2>&1
   compare out.exp out || fail=1
fi

Exit $fail