| /* |
| * Copyright (c) 2000-2001 Silicon Graphics, Inc. |
| * All Rights Reserved. |
| * |
| * 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. |
| * |
| * This program is distributed in the hope that it would 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, write the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <sys/stat.h> |
| #include <time.h> |
| #include <fcntl.h> |
| #include <errno.h> |
| #include <signal.h> |
| #include <assert.h> |
| #include <string.h> |
| #include <uuid/uuid.h> |
| |
| #include "config.h" |
| |
| #include "types.h" |
| #include "mlog.h" |
| #include "dlog.h" |
| #include "cldmgr.h" |
| #include "global.h" |
| #include "drive.h" |
| |
| #define PREAMBLEMAX 3 |
| #define QUERYMAX 1 |
| #define CHOICEMAX 2 |
| #define ACKMAX 3 |
| #define POSTAMBLEMAX 3 |
| #define DLOG_TIMEOUT 3600 |
| |
| bool_t |
| Media_prompt_change( drive_t *drivep ) |
| { |
| fold_t fold; |
| char question[ 100 ]; |
| char *preamblestr[ PREAMBLEMAX ]; |
| size_t preamblecnt; |
| char *querystr[ QUERYMAX ]; |
| size_t querycnt; |
| char *choicestr[ CHOICEMAX ]; |
| size_t choicecnt; |
| char *ackstr[ ACKMAX ]; |
| size_t ackcnt; |
| char *postamblestr[ POSTAMBLEMAX ]; |
| size_t postamblecnt; |
| ix_t doix; |
| ix_t dontix; |
| ix_t responseix; |
| ix_t sigintix; |
| |
| retry: |
| preamblecnt = 0; |
| fold_init( fold, _("change media dialog"), '=' ); |
| preamblestr[ preamblecnt++ ] = "\n"; |
| preamblestr[ preamblecnt++ ] = fold; |
| preamblestr[ preamblecnt++ ] = "\n\n"; |
| assert( preamblecnt <= PREAMBLEMAX ); |
| dlog_begin( preamblestr, preamblecnt ); |
| |
| /* query: ask if media changed or declined |
| */ |
| sprintf( question, _( |
| "please change media in " |
| "drive %u\n"), |
| (unsigned int)drivep->d_index ); |
| querycnt = 0; |
| querystr[ querycnt++ ] = question; |
| assert( querycnt <= QUERYMAX ); |
| choicecnt = 0; |
| dontix = choicecnt; |
| choicestr[ choicecnt++ ] = _("media change declined"); |
| doix = choicecnt; |
| choicestr[ choicecnt++ ] = _("media changed"); |
| assert( choicecnt <= CHOICEMAX ); |
| sigintix = IXMAX - 1; |
| |
| responseix = dlog_multi_query( querystr, |
| querycnt, |
| choicestr, |
| choicecnt, |
| 0, /* hilitestr */ |
| IXMAX, /* hiliteix */ |
| 0, /* defaultstr */ |
| doix, /* defaultix */ |
| DLOG_TIMEOUT, |
| dontix, /* timeout ix */ |
| sigintix, /* sigint ix */ |
| dontix, /* sighup ix */ |
| dontix ); /* sigquit ix */ |
| ackcnt = 0; |
| if ( responseix == doix ) { |
| ackstr[ ackcnt++ ] = _("examining new media\n"); |
| } else if ( responseix == dontix ) { |
| ackstr[ ackcnt++ ] = _("media change aborted\n"); |
| } else { |
| assert( responseix == sigintix ); |
| ackstr[ ackcnt++ ] = _("keyboard interrupt\n"); |
| } |
| |
| assert( ackcnt <= ACKMAX ); |
| dlog_multi_ack( ackstr, |
| ackcnt ); |
| |
| postamblecnt = 0; |
| fold_init( fold, _("end dialog"), '-' ); |
| postamblestr[ postamblecnt++ ] = "\n"; |
| postamblestr[ postamblecnt++ ] = fold; |
| postamblestr[ postamblecnt++ ] = "\n\n"; |
| assert( postamblecnt <= POSTAMBLEMAX ); |
| dlog_end( postamblestr, |
| postamblecnt ); |
| |
| if ( responseix == sigintix ) { |
| if ( cldmgr_stop_requested( )) { |
| return BOOL_FALSE; |
| } |
| sleep( 1 ); /* to allow main thread to begin dialog */ |
| mlog( MLOG_NORMAL | MLOG_BARE, |
| "" ); /* to block until main thread dialog complete */ |
| sleep( 1 ); /* to allow main thread to request children die */ |
| if ( cldmgr_stop_requested( )) { |
| return BOOL_FALSE; |
| } |
| mlog( MLOG_DEBUG, |
| "retrying media change dialog\n" ); |
| goto retry; |
| } |
| |
| return responseix == doix; |
| } |