Usando getopt em C com argumentos não opcionais

Eu estou fazendo um pequeno programa em C que lida com um monte de argumentos de linha de comando, então eu decidi usar getopt para classificá-los para mim.

No entanto, eu quero que dois argumentos não opcionais (arquivos de origem e destino) sejam obrigatórios, então você deve tê-los como argumentos durante a chamada do programa, mesmo que não haja sinalizadores ou outros argumentos.

Aqui está uma versão simplificada do que eu tenho que lidar com os argumentos com sinalizadores:

while ((c = getopt(argc, argv, "i:d:btw:h:s:")) != -1) {
    switch (c) {
        case 'i': {
            i = (int)atol(optarg);
        }
        case 'd': {
            d = (int)atol(optarg);
        }
        case 'b':
            buf = 1;
            break;
        case 't':
            time = 1;
            break;
        case 'w':
            w = (int)atol(optarg);
            break;
        case 'h':
            h = (int)atol(optarg);
            break;
        case 's':
            s = (int)atol(optarg);
            break;
        default:
            break;
    }
}

Como edito isso para que os argumentos não opcionais também sejam manipulados?

Eu também quero poder ter as não opções antesou depois das opções, como isso seria tratado?