| /* |
| * 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; |
| } |