Fifties from Lahiru Thirimanne and Angelo Mathews kept Sri Lanka firmly on course for a handy first-innings lead against India on day three of the rain-hit first test on Saturday.
The islanders, bidding for their first test victory in India, dismissed the hosts for 172 and closed on 165-4, as the rain stayed away after allowing only 32.5 overs to be bowled in the first two days.
Niroshan Dickwella was batting on 14 when bad light stopped play and skipper Dinesh Chandimal was on 13 with the tourists seven runs behind.
After India resumed on a precarious 74-5, the bottom half of their order contributed 98 runs in the morning session to lend respectability to their total on a green Eden Gardens track.
Cheteshwar Pujara brought up his 16th test fifty but was clean bowled by Lahiru Gamage for 52, a patient knock in trying conditions that included 10 boundaries.
Wriddhiman Saha and Ravindra Jadeja refused to retreat into a defensive shell, though they were not entirely convincing during their 48-run partnership.
Wicketkeeper-batsman Saha, who made 29, was lucky to get a reprieve four runs before his dismissal when Dickwella missed an easy stumping off Dilruwan Perera.
Jadeja, who made 22, hit Perera for a six over long-on but the off-spinner responded by removing both batsmen in the same over.
Suranga Lakmal dismissed Bhuvneshwar Kumar to claim his fourth wicket, his tidy 19 overs including 12 maidens.
Mohammed Shami made a breezy 24 down the order but India still fell short of the 175-run mark.
Sadeera Samarawickrama's 23 off 22 balls gave Sri Lanka a fast start but Kumar exploited the conditions well to peg back the tourists.
The paceman dismissed Dimuth Karunaratne lbw for eight and had Samarawickrama caught behind in his next over.
Despite their occasional discomfort against the moving ball, Thirimanne and Mathews thwarted the hosts with a match-high 99-run stand.
Dropped by Shikhar Dhawan on 27, Thirimanne went on to make 51, while Mathews, playing as a specialist batsman on his return from injury, made 52 before Umesh Yadav dismissed both in successive overs.